First init.
This commit is contained in:
@@ -0,0 +1,166 @@
|
|||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_SH110X.h>
|
||||||
|
|
||||||
|
#define i2c_Address 0x3C // OLED Adress.
|
||||||
|
#define SCREEN_WIDTH 128
|
||||||
|
#define SCREEN_HEIGHT 64
|
||||||
|
#define OLED_RESET -1
|
||||||
|
|
||||||
|
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||||
|
|
||||||
|
float tempForFanStartup = 28.0; // 82c/175.0F target low temp. below this temperature, the fan will be off
|
||||||
|
float tempForFanOnFull = 40.0; // 105c/210.0F target High temp. above this temperature, the fan will be on at full power
|
||||||
|
float tempForIdiotLight = 110.0; //115c
|
||||||
|
|
||||||
|
float voltsForFanStartup = 2.0; // Roughly the signal voltage that triggers the mazda module's slowest speed.
|
||||||
|
// A higher voltage here will effectively increase the fans lowest speed target.
|
||||||
|
|
||||||
|
const int fanPwmOutPin = 6; // Arduino forces this pin to 0 or 5 volts.
|
||||||
|
const int idiotLightPin = 8;
|
||||||
|
const int tempSensorPin = 7; // Pin to read from the DS1820 temp sensor.
|
||||||
|
const int temp2SensorPin = 9;
|
||||||
|
const int LEDpin = 13;
|
||||||
|
int pwmDuty; // The calculated PWM duty is stored here
|
||||||
|
float pwmMinStartupDuty; // the starting duty is stored here (mazda module starts fans at about 24 % duty)
|
||||||
|
float currTemperature; // the temperature in C is stored here
|
||||||
|
float curr2Temperature; // redundant temp sensor in C stored here
|
||||||
|
float idiotLight;
|
||||||
|
|
||||||
|
OneWire oneWire1 (tempSensorPin);
|
||||||
|
DallasTemperature sensorClt1(&oneWire1);
|
||||||
|
OneWire oneWire2 (temp2SensorPin);
|
||||||
|
DallasTemperature sensorClt2(&oneWire2);
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(115200); // set up serial port for 115200 baud (optional)
|
||||||
|
sensorClt1.begin();
|
||||||
|
sensorClt2.begin();
|
||||||
|
sensorClt1.requestTemperatures();
|
||||||
|
currTemperature = sensorClt1.getTempCByIndex(0);
|
||||||
|
sensorClt2.requestTemperatures();
|
||||||
|
curr2Temperature = sensorClt2.getTempCByIndex(0);
|
||||||
|
//pinMode(tempSensorPin, INPUT);
|
||||||
|
//pinMode(temp2SensorPin, INPUT);
|
||||||
|
|
||||||
|
pinMode(LEDpin, OUTPUT);
|
||||||
|
analogWrite(fanPwmOutPin, 0); // turn the fan off at start
|
||||||
|
digitalWrite(idiotLightPin, LOW);
|
||||||
|
idiotLight = LOW;
|
||||||
|
|
||||||
|
//ledcSetup(0, 20000, 8);
|
||||||
|
//ledcAttachPin(fanPwmOutPin, 0);
|
||||||
|
|
||||||
|
//ledcWrite(0, 0);
|
||||||
|
|
||||||
|
if (!display.begin(i2c_Address)) {
|
||||||
|
Serial.println(F("SH110X allocation failed"));
|
||||||
|
for (;;);
|
||||||
|
}
|
||||||
|
|
||||||
|
pwmMinStartupDuty = (voltsForFanStartup / 5.0) * 255.0; // convert the Mazda starting voltage to a PWM duty
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
readAndTranslateTempSensor();
|
||||||
|
calculate_and_send_PWM();
|
||||||
|
idiotLightAlarm();
|
||||||
|
displayOutput();
|
||||||
|
LEDblink();
|
||||||
|
//print_to_serial_port();
|
||||||
|
delay(20);
|
||||||
|
}
|
||||||
|
|
||||||
|
void calculate_and_send_PWM() {
|
||||||
|
if (currTemperature < tempForFanStartup) { // If the temperature is below the lowest setpoint, turn fan off
|
||||||
|
analogWrite(fanPwmOutPin, 0); // PWM duty = 0 percent
|
||||||
|
//ledcWrite(0, 0);
|
||||||
|
pwmDuty = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (currTemperature > tempForFanOnFull) { // If the temperature is above the highest setpoint, turn fan on full
|
||||||
|
analogWrite(fanPwmOutPin, 255); // PWM duty = 100 percent
|
||||||
|
//ledcWrite(0, 255);
|
||||||
|
pwmDuty = 255;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
float tempRange = tempForFanOnFull - tempForFanStartup ; // start calculating duty cycle
|
||||||
|
float pwmRange = 255.0 - pwmMinStartupDuty ;
|
||||||
|
float pwmDutyPct = (currTemperature - tempForFanStartup) / tempRange ;
|
||||||
|
|
||||||
|
pwmDuty = (int) (pwmMinStartupDuty + (pwmDutyPct * pwmRange) +.5); // actual PWM duty is calculated here
|
||||||
|
|
||||||
|
if (pwmDuty > 255) { // make sure duty ended up between 255 and 0
|
||||||
|
pwmDuty = 255;
|
||||||
|
}
|
||||||
|
if (pwmDuty < 0) {
|
||||||
|
pwmDuty = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
analogWrite(fanPwmOutPin, pwmDuty); // write PWM duty to PWM output pin
|
||||||
|
//ledcWrite(0, pwmDuty);
|
||||||
|
}
|
||||||
|
|
||||||
|
void readAndTranslateTempSensor() {
|
||||||
|
//float currTemperature;
|
||||||
|
sensorClt1.requestTemperatures();
|
||||||
|
currTemperature = sensorClt1.getTempCByIndex(0);
|
||||||
|
|
||||||
|
sensorClt2.requestTemperatures();
|
||||||
|
curr2Temperature = sensorClt2.getTempCByIndex(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayOutput() {
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
display.setTextSize(1);
|
||||||
|
display.setTextColor(SH110X_WHITE);
|
||||||
|
|
||||||
|
// Display temperature on the screen in Celsius with one decimal place
|
||||||
|
display.setCursor(10, 10);
|
||||||
|
display.print("Temp:");
|
||||||
|
display.setCursor(40, 10);
|
||||||
|
display.print(currTemperature, 2); // Display one decimal place
|
||||||
|
display.setCursor(80, 10);
|
||||||
|
display.print("/ ");
|
||||||
|
display.print(curr2Temperature, 2);
|
||||||
|
|
||||||
|
display.setCursor(10, 20);
|
||||||
|
display.print("PWMd:");
|
||||||
|
display.setCursor(40, 20);
|
||||||
|
display.print(pwmDuty);
|
||||||
|
|
||||||
|
display.setCursor(10, 30);
|
||||||
|
display.print("Lamp:");
|
||||||
|
display.setCursor(40, 30);
|
||||||
|
display.print(idiotLight, 0);
|
||||||
|
|
||||||
|
// Update the display
|
||||||
|
display.display();
|
||||||
|
}
|
||||||
|
|
||||||
|
void idiotLightAlarm() {
|
||||||
|
if (currTemperature > tempForIdiotLight) {
|
||||||
|
digitalWrite(idiotLightPin, HIGH);
|
||||||
|
idiotLight = HIGH;
|
||||||
|
}
|
||||||
|
else if (currTemperature < tempForIdiotLight) {
|
||||||
|
digitalWrite(idiotLightPin, LOW);
|
||||||
|
idiotLight = LOW;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LEDblink() {
|
||||||
|
digitalWrite(LEDpin, HIGH);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(LEDpin, LOW);
|
||||||
|
delay(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_to_serial_port() {
|
||||||
|
Serial.print(F("currTemperature C: ")); Serial.print(currTemperature);
|
||||||
|
Serial.print(F(" pwmDuty: ")); Serial.println(pwmDuty);
|
||||||
|
}
|
||||||
100
ANANO_MAZDAPWM_mk1/ANANO_MAZDAPWM_mk1.ino
Normal file
100
ANANO_MAZDAPWM_mk1/ANANO_MAZDAPWM_mk1.ino
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
|
||||||
|
#define ONE_WIRE_BUS_1 2 // DS18B20 temperature sensor CLT1
|
||||||
|
#define ONE_WIRE_BUS_2 3 // DS18B20 temperature sensor CLT2
|
||||||
|
#define FAN_PIN 11 // PWM output pin for FAN1
|
||||||
|
#define ANALOG_INPUT_PIN A0
|
||||||
|
#define ORS_PIN 19 // Input pin for fan control
|
||||||
|
|
||||||
|
#define FAN_ON 95 // Temperature threshold to turn on fan
|
||||||
|
#define FAN_OFF (FAN_ON - 10) // Temperature threshold to turn off fan
|
||||||
|
#define FAN_HIGH (FAN_ON + 10) // High temperature threshold for increased fan speed
|
||||||
|
#define FAN_HIGH_DUTY_CYCLE 95 // Duty cycle for increased fan speed
|
||||||
|
#define FAN_LOW_DUTY_CYCLE 40 // Duty cycle for normal fan speed
|
||||||
|
|
||||||
|
OneWire oneWire1(ONE_WIRE_BUS_1);
|
||||||
|
OneWire oneWire2(ONE_WIRE_BUS_2);
|
||||||
|
DallasTemperature sensor1(&oneWire1);
|
||||||
|
DallasTemperature sensor2(&oneWire2);
|
||||||
|
|
||||||
|
bool fanOverride = false;
|
||||||
|
int fanOverrideDutyCycle = 0;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
pinMode(ORS_PIN, INPUT_PULLUP);
|
||||||
|
pinMode(FAN_PIN, OUTPUT);
|
||||||
|
Serial.begin(9600);
|
||||||
|
sensor1.begin();
|
||||||
|
sensor2.begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
float temp1, temp2;
|
||||||
|
bool validReading1 = false, validReading2 = false;
|
||||||
|
|
||||||
|
// Read temperatures from sensors
|
||||||
|
sensor1.requestTemperatures();
|
||||||
|
sensor2.requestTemperatures();
|
||||||
|
temp1 = sensor1.getTempCByIndex(0);
|
||||||
|
temp2 = sensor2.getTempCByIndex(0);
|
||||||
|
|
||||||
|
// Check if readings are valid
|
||||||
|
if (temp1 >= -20 && temp1 <= 130) {
|
||||||
|
validReading1 = true;
|
||||||
|
}
|
||||||
|
if (temp2 >= -20 && temp2 <= 130) {
|
||||||
|
validReading2 = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate average temperature
|
||||||
|
float avgTemp = -1;
|
||||||
|
if (validReading1 && validReading2) {
|
||||||
|
avgTemp = (temp1 + temp2) / 2;
|
||||||
|
} else if (validReading1) {
|
||||||
|
avgTemp = temp1;
|
||||||
|
} else if (validReading2) {
|
||||||
|
avgTemp = temp2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if fan should be controlled by temperature
|
||||||
|
if (!fanOverride) {
|
||||||
|
if (avgTemp >= FAN_ON) {
|
||||||
|
analogWrite(FAN_PIN, FAN_LOW_DUTY_CYCLE);
|
||||||
|
} else if (avgTemp <= FAN_OFF) {
|
||||||
|
digitalWrite(FAN_PIN, LOW); // Fan should be off if temperature is below FAN_OFF threshold
|
||||||
|
} else if (avgTemp >= FAN_HIGH) {
|
||||||
|
analogWrite(FAN_PIN, FAN_HIGH_DUTY_CYCLE);
|
||||||
|
} else {
|
||||||
|
analogWrite(FAN_PIN, FAN_LOW_DUTY_CYCLE);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
analogWrite(FAN_PIN, fanOverrideDutyCycle);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if fan control pin is pulled low
|
||||||
|
if (digitalRead(ORS_PIN) == LOW) {
|
||||||
|
int potValue = analogRead(ANALOG_INPUT_PIN);
|
||||||
|
fanOverrideDutyCycle = map(potValue, 0, 1023, 0, 255);
|
||||||
|
fanOverride = true;
|
||||||
|
} else {
|
||||||
|
fanOverride = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output to serial monitor
|
||||||
|
Serial.print("Average Temperature: ");
|
||||||
|
if (avgTemp != -1) {
|
||||||
|
Serial.print(avgTemp);
|
||||||
|
Serial.println(" C");
|
||||||
|
} else {
|
||||||
|
Serial.println("Invalid reading");
|
||||||
|
}
|
||||||
|
Serial.print("Fan Duty Cycle: ");
|
||||||
|
if (fanOverride) {
|
||||||
|
Serial.print(map(fanOverrideDutyCycle, 0, 255, 0, 100));
|
||||||
|
} else {
|
||||||
|
Serial.print(map(analogRead(FAN_PIN), 0, 1023, 0, 100));
|
||||||
|
}
|
||||||
|
Serial.println("%");
|
||||||
|
delay(1000);
|
||||||
|
}
|
||||||
104
ANANO_MAZDAPWM_mk2_ls1tech/ANANO_MAZDAPWM_mk2_ls1tech.ino
Normal file
104
ANANO_MAZDAPWM_mk2_ls1tech/ANANO_MAZDAPWM_mk2_ls1tech.ino
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
// This a test program, no warranties are implied or given. fanControllerR2V3base
|
||||||
|
// Use, copy any modify this test program any way you want, at your own risk.
|
||||||
|
// Test, test, test and then test some more..
|
||||||
|
// It reads a temperature sensor and controls a Mazda PWM fan power module.
|
||||||
|
// ...Carl... (LS1Tech)
|
||||||
|
// Modified for use with Dallas 1820 digital sensor, also Celcius for proper understandable values.
|
||||||
|
// Used with ESP32 S2 "Wemos/Lolin" and a simple bootstrapped p-channel transistor.
|
||||||
|
|
||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
|
||||||
|
/*----------------------- User adjustable variables and preferences section ---------------------------------*/
|
||||||
|
float tempForFanStartup = 82.0; // 175.0 target low temp. below this temperature, the fan will be off
|
||||||
|
float tempForFanOnFull = 105.0; // 210.0 target High temp. above this temperature, the fan will be on at full power
|
||||||
|
// adjust these two to get the desired range. for example for a transmission, maybe 140 to 160
|
||||||
|
|
||||||
|
//float R0 = 10000; // The base resistance of the NTC sensor used. 10K with a 3435 Beta.
|
||||||
|
//float Beta = 3435; // The Beta of the sensor used. Very commonly available
|
||||||
|
|
||||||
|
float voltsForFanStartup = 1.2; // Roughly the signal voltage that triggers the mazda module's slowest speed.
|
||||||
|
// A higher voltage here will effectively increase the fans lowest speed target.
|
||||||
|
/*----------------------- end of User adjustable variables and preferences -----------------------------------*/
|
||||||
|
|
||||||
|
const int fanPwmOutPin = 12; // Arduino forces this pin to 0 or 5 volts.
|
||||||
|
const int tempSensorPin = 8; // Pin to read analog voltage from the temp sensor.
|
||||||
|
int pwmDuty; // The calculated PWM duty is stored here
|
||||||
|
float pwmMinStartupDuty; // the starting duty is stored here (mazda module starts fans at about 24 % duty)
|
||||||
|
float currTemperature; // the temperature in F is stored here
|
||||||
|
|
||||||
|
OneWire oneWire1 (tempSensorPin);
|
||||||
|
DallasTemperature sensor1(&oneWire1);
|
||||||
|
|
||||||
|
void setup() { /* ++++++++++++++++++ Setup is run once when the arduino boots ++++++++++++++++++++++++++*/
|
||||||
|
Serial.begin(115200); // set up serial port for 115200 baud (optional)
|
||||||
|
sensor1.begin();
|
||||||
|
pinMode(tempSensorPin, INPUT);
|
||||||
|
//analogReference (EXTERNAL) ; // note, this is using the 3.3 volt supply as the analog reference.
|
||||||
|
//analogRead (tempSensorPin) ; // a couple of reads to give the A/D time to adjust
|
||||||
|
//analogRead (tempSensorPin) ; // a couple of reads to give the A/D time to adjust
|
||||||
|
analogWrite(fanPwmOutPin, 0); // turn the fan off at start
|
||||||
|
|
||||||
|
pwmMinStartupDuty = (voltsForFanStartup / 5.0) * 255.0; // convert the Mazda starting voltage to a PWM duty
|
||||||
|
} // end setup
|
||||||
|
|
||||||
|
|
||||||
|
void loop() { /* ++++++++++++++++++ Main Loop, continuously loops forever ++++++++++++++++++++++++++++*/
|
||||||
|
|
||||||
|
readAndTranslateTempSensor();
|
||||||
|
|
||||||
|
calculate_and_send_PWM();
|
||||||
|
|
||||||
|
//print_to_serial_port(); // un-comment this line for testing and calibration to the laptop.
|
||||||
|
|
||||||
|
} // end main loop
|
||||||
|
|
||||||
|
|
||||||
|
void calculate_and_send_PWM() { /* ++++++++ subroutine to calculate and set PWM duty cycle ++++++++++++++*/
|
||||||
|
|
||||||
|
if (currTemperature < tempForFanStartup) { // If the temperature is below the lowest setpoint, turn fan off
|
||||||
|
analogWrite(fanPwmOutPin, 0); // PWM duty = 0 percent
|
||||||
|
pwmDuty = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currTemperature > tempForFanOnFull) { // If the temperature is above the highest setpoint, turn fan on full
|
||||||
|
analogWrite(fanPwmOutPin, 255); // PWM duty = 100 percent
|
||||||
|
pwmDuty = 255;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
float tempRange = tempForFanOnFull - tempForFanStartup ; // start calculating duty cycle
|
||||||
|
float pwmRange = 255.0 - pwmMinStartupDuty ;
|
||||||
|
float pwmDutyPct = (currTemperature - tempForFanStartup) / tempRange ;
|
||||||
|
|
||||||
|
pwmDuty = (int) (pwmMinStartupDuty + (pwmDutyPct * pwmRange) +.5); // actual PWM duty is calculated here
|
||||||
|
|
||||||
|
if (pwmDuty > 255) { // make sure duty ended up between 255 and 0
|
||||||
|
pwmDuty = 255;
|
||||||
|
}
|
||||||
|
if (pwmDuty < 0) {
|
||||||
|
pwmDuty = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
analogWrite(fanPwmOutPin, pwmDuty); // write PWM duty to PWM output pin
|
||||||
|
|
||||||
|
} // end calculate_and_send_PWM
|
||||||
|
|
||||||
|
|
||||||
|
void readAndTranslateTempSensor() { /* ++++++ subroutine to read and translate temp sensor to temp F +++++++++++++*/
|
||||||
|
//float currTemperature;
|
||||||
|
sensor1.requestTemperatures();
|
||||||
|
currTemperature = sensor1.getTempCByIndex(0);
|
||||||
|
//int tmp = analogRead(tempSensorPin);
|
||||||
|
//float r = ((1023.0*R0)/(float)tmp)-R0;
|
||||||
|
//currTemperature = Beta/log(r/0.09919) - 273.15; // for a 10K thermister with a beta of 3435
|
||||||
|
//currTemperature = (9.0/5.0) * currTemperature +32; // convert to Fahrenheit
|
||||||
|
|
||||||
|
} // end readAndTranslateTempSensor
|
||||||
|
|
||||||
|
|
||||||
|
void print_to_serial_port() { /* ++++++++++ optional prints values to laptop usb port for debugging and calibration ++*/
|
||||||
|
Serial.print(F("currTemperature C: ")); Serial.print(currTemperature);
|
||||||
|
Serial.print(F(" pwmDuty: ")); Serial.println(pwmDuty);
|
||||||
|
}
|
||||||
137
ANANO_ReadZeitronix-1/ANANO_ReadZeitronix-1.ino
Normal file
137
ANANO_ReadZeitronix-1/ANANO_ReadZeitronix-1.ino
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
#include <SoftwareSerial.h>
|
||||||
|
|
||||||
|
#define RX_PIN 2
|
||||||
|
#define TX_PIN 3
|
||||||
|
|
||||||
|
SoftwareSerial zt2Serial(RX_PIN, TX_PIN); // RX, TX
|
||||||
|
|
||||||
|
const int dataLength = 17; // Total number of bytes in the frame
|
||||||
|
uint8_t buffer[dataLength * 2]; // Circular buffer for incoming data
|
||||||
|
int head = 0; // Index for writing data to the buffer
|
||||||
|
int tail = 0; // Index for reading data from the buffer
|
||||||
|
|
||||||
|
// Global variables to store specific bytes
|
||||||
|
uint8_t afr = 0;
|
||||||
|
uint8_t map_value = 0;
|
||||||
|
uint8_t user1 = 0;
|
||||||
|
uint8_t user2 = 0;
|
||||||
|
|
||||||
|
// Function to validate the data frame (basic sanity check)
|
||||||
|
bool isValidFrame(uint8_t* data) {
|
||||||
|
// Implement any specific validation rules for your frame here
|
||||||
|
// For example, ensure AFR (byte 4) and other values are within expected ranges
|
||||||
|
// Return false if the frame is invalid
|
||||||
|
if (data[3] > 255 || data[8] > 255 || data[11] > 255 || data[14] > 255) {
|
||||||
|
return false; // Example range check, adjust as necessary
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*void readZeitronix() {
|
||||||
|
// Read incoming bytes and store them in the buffer
|
||||||
|
while (zt2Serial.available()) {
|
||||||
|
buffer[head] = zt2Serial.read();
|
||||||
|
head = (head + 1) % (dataLength * 2); // Wrap around the buffer
|
||||||
|
|
||||||
|
// Check if there's a complete frame available
|
||||||
|
if ((head + (dataLength * 2) - tail) % (dataLength * 2) >= dataLength) {
|
||||||
|
// Check for the start of a new frame: 0 1 2
|
||||||
|
if (buffer[tail] == 0 && buffer[(tail + 1) % (dataLength * 2)] == 1 && buffer[(tail + 2) % (dataLength * 2)] == 2) {
|
||||||
|
// Read the frame into a temporary array
|
||||||
|
uint8_t data[dataLength];
|
||||||
|
for (int i = 0; i < dataLength; i++) {
|
||||||
|
data[i] = buffer[(tail + i) % (dataLength * 2)];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Move the tail to the end of the processed frame
|
||||||
|
tail = (tail + dataLength) % (dataLength * 2);
|
||||||
|
|
||||||
|
// Validate the frame
|
||||||
|
if (isValidFrame(data)) {
|
||||||
|
// Store the specific bytes in global variables
|
||||||
|
afr = data[3]; // byte 4 (AFR)
|
||||||
|
map_value = data[8]; // byte 9 (MAP)
|
||||||
|
user1 = data[11]; // byte 12 (USER1)
|
||||||
|
user2 = data[14]; // byte 15 (USER2)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// If the start of the frame is not found, discard the first byte and move the tail
|
||||||
|
tail = (tail + 1) % (dataLength * 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} */
|
||||||
|
void readZeitronix() {
|
||||||
|
// Read incoming bytes and store them in the buffer
|
||||||
|
while (zt2Serial.available()) {
|
||||||
|
buffer[head] = zt2Serial.read();
|
||||||
|
head = (head + 1) % (dataLength * 2); // Wrap around the buffer
|
||||||
|
|
||||||
|
// Check if there's a complete frame available
|
||||||
|
if ((head + (dataLength * 2) - tail) % (dataLength * 2) >= dataLength) {
|
||||||
|
// Check for the start of a new frame: 0 1 2
|
||||||
|
if (buffer[tail] == 0 && buffer[(tail + 1) % (dataLength * 2)] == 1 && buffer[(tail + 2) % (dataLength * 2)] == 2) {
|
||||||
|
// Read the frame into a temporary array
|
||||||
|
uint8_t data[dataLength];
|
||||||
|
for (int i = 0; i < dataLength; i++) {
|
||||||
|
data[i] = buffer[(tail + i) % (dataLength * 2)];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Move the tail to the end of the processed frame
|
||||||
|
tail = (tail + dataLength) % (dataLength * 2);
|
||||||
|
|
||||||
|
// Validate the frame
|
||||||
|
if (isValidFrame(data)) {
|
||||||
|
// Print the entire frame for debugging
|
||||||
|
Serial.print("Frame: ");
|
||||||
|
for (int i = 0; i < dataLength; i++) {
|
||||||
|
Serial.print(data[i]);
|
||||||
|
Serial.print(" ");
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
|
||||||
|
// Store the specific bytes in global variables
|
||||||
|
afr = data[3]; // byte 4 (AFR)
|
||||||
|
map_value = data[8]; // byte 9 (MAP)
|
||||||
|
user1 = data[11]; // byte 12 (USER1)
|
||||||
|
user2 = data[14]; // byte 15 (USER2)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// If the start of the frame is not found, discard the first byte and move the tail
|
||||||
|
tail = (tail + 1) % (dataLength * 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
zt2Serial.begin(9600);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
readZeitronix();
|
||||||
|
|
||||||
|
// Use the global variables to update the TFT display or for other purposes
|
||||||
|
Serial.print("AFR: ");
|
||||||
|
Serial.print(afr); // AFR value
|
||||||
|
Serial.print(" MAP: ");
|
||||||
|
Serial.print(map_value); // MAP value
|
||||||
|
Serial.print(" USER1: ");
|
||||||
|
Serial.print(user1); // USER1 value
|
||||||
|
Serial.print(" USER2: ");
|
||||||
|
Serial.println(user2); // USER2 value
|
||||||
|
|
||||||
|
// Update the TFT display here using the values of afr, map_value, user1, user2
|
||||||
|
// Example:
|
||||||
|
// tft.setCursor(0, 0);
|
||||||
|
// tft.print("AFR: " + String(afr));
|
||||||
|
// tft.setCursor(0, 10);
|
||||||
|
// tft.print("MAP: " + String(map_value));
|
||||||
|
// tft.setCursor(0, 20);
|
||||||
|
// tft.print("USER1: " + String(user1));
|
||||||
|
// tft.setCursor(0, 30);
|
||||||
|
// tft.print("USER2: " + String(user2));
|
||||||
|
|
||||||
|
delay(100); // Adjust delay as needed for the desired refresh rate
|
||||||
|
}
|
||||||
69
ANANO_ReadZeitronix-2/ANANO_ReadZeitronix-2.ino
Normal file
69
ANANO_ReadZeitronix-2/ANANO_ReadZeitronix-2.ino
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
//#include <SoftwareSerial.h>
|
||||||
|
#include <PostNeoSWSerial.h>
|
||||||
|
PostNeoSWSerial zt2Serial( 10, 11 );
|
||||||
|
volatile uint32_t newlines = 0UL;
|
||||||
|
|
||||||
|
static void handleRxChar( uint8_t c )
|
||||||
|
{
|
||||||
|
if (c == '\n')
|
||||||
|
newlines++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Define the buffer size and array to hold the data
|
||||||
|
const int bufferSize = 16;
|
||||||
|
uint8_t dataBuffer[bufferSize];
|
||||||
|
int dataIndex = 0;
|
||||||
|
bool dataStarted = false; // Flag to indicate if we are in the middle of a valid packet
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
zt2Serial.begin(9600);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// Check if data is available on SoftwareSerial
|
||||||
|
while (zt2Serial.available()) {
|
||||||
|
// Read a byte from SoftwareSerial
|
||||||
|
uint8_t byteRead = zt2Serial.read();
|
||||||
|
|
||||||
|
// Check for the start of a new data packet
|
||||||
|
if (!dataStarted) {
|
||||||
|
// If the start of a new packet is detected
|
||||||
|
if (byteRead == 0 && zt2Serial.available() >= 2) {
|
||||||
|
// Read the next two bytes to confirm the start sequence
|
||||||
|
uint8_t nextByte1 = zt2Serial.read();
|
||||||
|
uint8_t nextByte2 = zt2Serial.read();
|
||||||
|
|
||||||
|
// Check if the following bytes are 0x01 and 0x02
|
||||||
|
if (nextByte1 == 0x01 && nextByte2 == 0x02) {
|
||||||
|
// Start collecting data
|
||||||
|
dataStarted = true;
|
||||||
|
dataIndex = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we're in a valid data packet, store the data
|
||||||
|
if (dataStarted) {
|
||||||
|
// Store the byte in the buffer
|
||||||
|
if (dataIndex < bufferSize) {
|
||||||
|
dataBuffer[dataIndex++] = byteRead;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If buffer is full, process the data
|
||||||
|
if (dataIndex >= bufferSize) {
|
||||||
|
// Print out the collected data in hexadecimal format
|
||||||
|
Serial.print("Received Data: ");
|
||||||
|
for (int i = 0; i < bufferSize; i++) {
|
||||||
|
Serial.print(dataBuffer[i]);
|
||||||
|
Serial.print(" ");
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
|
||||||
|
// Reset flag and index to start collecting new data
|
||||||
|
dataStarted = false;
|
||||||
|
dataIndex = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
54
ANANO_Zeitronix/ANANO_Zeitronix.ino
Normal file
54
ANANO_Zeitronix/ANANO_Zeitronix.ino
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
#include <PostNeoSWSerial.h>
|
||||||
|
PostNeoSWSerial zt2Serial( 10, 11 );
|
||||||
|
volatile uint32_t newlines = 0UL;
|
||||||
|
|
||||||
|
static void handleRxChar( uint8_t c )
|
||||||
|
{
|
||||||
|
if (c == '\n')
|
||||||
|
newlines++;
|
||||||
|
}
|
||||||
|
|
||||||
|
//const int chipSelect = 10;
|
||||||
|
int gotPacket = 0;
|
||||||
|
uint8_t packet[17];
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// Open serial communications and wait for port to open:
|
||||||
|
Serial.begin(9600);
|
||||||
|
zt2Serial.begin(9600);
|
||||||
|
//Serial1.setTimeout(600);
|
||||||
|
while (!Serial) {
|
||||||
|
; // wait for serial port to connect. Needed for native USB port only
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void getZeitronixPacket(char* packetpointer){
|
||||||
|
gotPacket = 0;
|
||||||
|
char buffer[32] = {0xF}; // buffer 32 bytes to make sure we find the 3 byte start sequence.
|
||||||
|
for (int i=0; i<32; i++){
|
||||||
|
zt2Serial.readBytes(&buffer[i],1);
|
||||||
|
if (i > 1 && buffer[i] == 2 && buffer[i-1] == 1 && buffer[i-2] == 0) {
|
||||||
|
gotPacket = 1;
|
||||||
|
zt2Serial.readBytes(packetpointer,11);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
char dataString[80];
|
||||||
|
|
||||||
|
while (zt2Serial.available() > 32){ // wait til there's a nice chunk in the serial buffer
|
||||||
|
getZeitronixPacket(packet);
|
||||||
|
// this would be our logtosd() below:
|
||||||
|
if (gotPacket == 1) {
|
||||||
|
sprintf(dataString, "%lu,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u", millis(),packet[0],packet[1],packet[2],packet[3],packet[4],packet[5],packet[6],packet[7],packet[8],packet[9],packet[10],packet[11],packet[12],packet[13],packet[14]);
|
||||||
|
Serial.println(dataString);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
96
ANano_ls1tech_raw/ANano_ls1tech_raw.ino
Normal file
96
ANano_ls1tech_raw/ANano_ls1tech_raw.ino
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
// This a test program, no warranties are implied or given. fanControllerR2V3base
|
||||||
|
// Use, copy any modify this test program any way you want, at your own risk.
|
||||||
|
// Test, test, test and then test some more..
|
||||||
|
// It reads a temperature sensor and controls a Mazda PWM fan power module.
|
||||||
|
// ...Carl...
|
||||||
|
|
||||||
|
/*----------------------- User adjustable variables and preferences section ---------------------------------*/
|
||||||
|
float tempForFanStartup = 175.0; // target low temp. below this temperature, the fan will be off
|
||||||
|
float tempForFanOnFull = 210.0; // target High temp. above this temperature, the fan will be on at full power
|
||||||
|
// adjust these two to get the desired range. for example for a transmission, maybe 140 to 160
|
||||||
|
|
||||||
|
float R0 = 10000; // The base resistance of the NTC sensor used. 10K with a 3435 Beta.
|
||||||
|
float Beta = 3435; // The Beta of the sensor used. Very commonly available
|
||||||
|
|
||||||
|
float voltsForFanStartup = 1.2; // Roughly the signal voltage that triggers the mazda module's slowest speed.
|
||||||
|
// A higher voltage here will effectively increase the fans lowest speed target.
|
||||||
|
/*----------------------- end of User adjustable variables and preferences -----------------------------------*/
|
||||||
|
|
||||||
|
const int fanPwmOutPin = 12; // Arduino forces this pin to 0 or 5 volts.
|
||||||
|
const int tempSensorPin = 5; // Pin to read analog voltage from the temp sensor.
|
||||||
|
int pwmDuty; // The calculated PWM duty is stored here
|
||||||
|
float pwmMinStartupDuty; // the starting duty is stored here (mazda module starts fans at about 24 % duty)
|
||||||
|
float currTemperature; // the temperature in F is stored here
|
||||||
|
|
||||||
|
|
||||||
|
void setup() { /* ++++++++++++++++++ Setup is run once when the arduino boots ++++++++++++++++++++++++++*/
|
||||||
|
Serial.begin(115200); // set up serial port for 115200 baud (optional)
|
||||||
|
|
||||||
|
//analogReference (EXTERNAL) ; // note, this is using the 3.3 volt supply as the analog reference.
|
||||||
|
analogRead (tempSensorPin) ; // a couple of reads to give the A/D time to adjust
|
||||||
|
analogRead (tempSensorPin) ; // a couple of reads to give the A/D time to adjust
|
||||||
|
analogWrite(fanPwmOutPin, 0); // turn the fan off at start
|
||||||
|
|
||||||
|
pwmMinStartupDuty = (voltsForFanStartup / 5.0) * 255.0; // convert the Mazda starting voltage to a PWM duty
|
||||||
|
} // end setup
|
||||||
|
|
||||||
|
|
||||||
|
void loop() { /* ++++++++++++++++++ Main Loop, continuously loops forever ++++++++++++++++++++++++++++*/
|
||||||
|
|
||||||
|
readAndTranslateTempSensor();
|
||||||
|
|
||||||
|
calculate_and_send_PWM();
|
||||||
|
|
||||||
|
print_to_serial_port(); // un-comment this line for testing and calibration to the laptop.
|
||||||
|
|
||||||
|
} // end main loop
|
||||||
|
|
||||||
|
|
||||||
|
void calculate_and_send_PWM() { /* ++++++++ subroutine to calculate and set PWM duty cycle ++++++++++++++*/
|
||||||
|
|
||||||
|
if (currTemperature < tempForFanStartup) { // If the temperature is below the lowest setpoint, turn fan off
|
||||||
|
analogWrite(fanPwmOutPin, 0); // PWM duty = 0 percent
|
||||||
|
pwmDuty = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currTemperature > tempForFanOnFull) { // If the temperature is above the highest setpoint, turn fan on full
|
||||||
|
analogWrite(fanPwmOutPin, 255); // PWM duty = 100 percent
|
||||||
|
pwmDuty = 255;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
float tempRange = tempForFanOnFull - tempForFanStartup ; // start calculating duty cycle
|
||||||
|
float pwmRange = 255.0 - pwmMinStartupDuty ;
|
||||||
|
float pwmDutyPct = (currTemperature - tempForFanStartup) / tempRange ;
|
||||||
|
|
||||||
|
pwmDuty = (int) (pwmMinStartupDuty + (pwmDutyPct * pwmRange) +.5); // actual PWM duty is calculated here
|
||||||
|
|
||||||
|
if (pwmDuty > 255) { // make sure duty ended up between 255 and 0
|
||||||
|
pwmDuty = 255;
|
||||||
|
}
|
||||||
|
if (pwmDuty < 0) {
|
||||||
|
pwmDuty = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
analogWrite(fanPwmOutPin, pwmDuty); // write PWM duty to PWM output pin
|
||||||
|
|
||||||
|
} // end calculate_and_send_PWM
|
||||||
|
|
||||||
|
|
||||||
|
void readAndTranslateTempSensor() { /* ++++++ subroutine to read and translate temp sensor to temp F +++++++++++++*/
|
||||||
|
|
||||||
|
int tmp = analogRead(tempSensorPin);
|
||||||
|
int currTemperature1 = map(tmp, 0, 1023, 150, 158);
|
||||||
|
currTemperature = currTemperature1;
|
||||||
|
//float r = ((1023.0*R0)/(float)tmp)-R0;
|
||||||
|
//currTemperature = Beta/log(r/0.09919) - 273.15; // for a 10K thermister with a beta of 3435
|
||||||
|
//currTemperature = (9.0/5.0) * currTemperature +32; // convert to Fahrenheit
|
||||||
|
|
||||||
|
} // end readAndTranslateTempSensor
|
||||||
|
|
||||||
|
|
||||||
|
void print_to_serial_port() { /* ++++++++++ optional prints values to laptop usb port for debugging and calibration ++*/
|
||||||
|
Serial.print(F("currTemperature F: ")); Serial.print(currTemperature);
|
||||||
|
Serial.print(F(" pwmDuty: ")); Serial.println(pwmDuty);
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_ST7789.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
|
||||||
|
#define TFT_RST 8
|
||||||
|
#define TFT_CS 10
|
||||||
|
#define TFT_DC 9
|
||||||
|
|
||||||
|
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// put your setup code here, to run once:
|
||||||
|
tft.init(240, 320, SPI_MODE3);
|
||||||
|
tft.setRotation(1);
|
||||||
|
|
||||||
|
tft.fillScreen(ST77XX_BLACK);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// put your main code here, to run repeatedly:
|
||||||
|
|
||||||
|
tft.setCursor(0, 0);
|
||||||
|
tft.setTextColor(ST77XX_RED);
|
||||||
|
tft.println("Bolt rulez!!");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* LED = 3v3
|
||||||
|
SCK = 13
|
||||||
|
SDA = 11
|
||||||
|
AO = 9
|
||||||
|
RESET = 8
|
||||||
|
CS = 10
|
||||||
|
GND = GND
|
||||||
|
VCC = 5v
|
||||||
|
*/
|
||||||
@@ -0,0 +1,124 @@
|
|||||||
|
#include <FlickerFreePrint.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_ST7789.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <Fonts/FreeSans9pt7b.h>
|
||||||
|
#include <Fonts/FreeSans12pt7b.h>
|
||||||
|
|
||||||
|
#define PUP_LBLUE 0x051D
|
||||||
|
#define PUP_POISON 0xA7C9
|
||||||
|
#define C_BLACK 0x0000
|
||||||
|
#define C_BLUE 0x001F
|
||||||
|
#define C_RED 0xF800
|
||||||
|
#define C_GREEN 0x07E0
|
||||||
|
#define C_CYAN 0x07FF
|
||||||
|
#define C_MAGENTA 0xF81F
|
||||||
|
#define C_YELLOW 0xFFE0
|
||||||
|
#define C_WHITE 0xFFFF
|
||||||
|
|
||||||
|
#define TFT_RST 8
|
||||||
|
#define TFT_CS 10
|
||||||
|
#define TFT_DC 9
|
||||||
|
|
||||||
|
Adafruit_ST7789 GM02002 = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
|
||||||
|
|
||||||
|
//Need one "line" for each element to update.
|
||||||
|
FlickerFreePrint<Adafruit_ST7789> Data1(&GM02002, C_WHITE, C_BLACK);
|
||||||
|
FlickerFreePrint<Adafruit_ST7789> Data2(&GM02002, C_WHITE, C_BLACK);
|
||||||
|
FlickerFreePrint<Adafruit_ST7789> Data3(&GM02002, C_WHITE, C_BLACK);
|
||||||
|
FlickerFreePrint<Adafruit_ST7789> Data4(&GM02002, C_WHITE, C_BLACK);
|
||||||
|
FlickerFreePrint<Adafruit_ST7789> Data5(&GM02002, C_WHITE, C_BLACK);
|
||||||
|
FlickerFreePrint<Adafruit_ST7789> Data6(&GM02002, C_WHITE, C_BLACK);
|
||||||
|
FlickerFreePrint<Adafruit_ST7789> Data7(&GM02002, C_WHITE, C_BLACK);
|
||||||
|
FlickerFreePrint<Adafruit_ST7789> Data8(&GM02002, C_WHITE, C_BLACK);
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// put your setup code here, to run once:
|
||||||
|
GM02002.init(240, 320, SPI_MODE3);
|
||||||
|
GM02002.setRotation(1);
|
||||||
|
|
||||||
|
GM02002.fillScreen(ST77XX_BLACK);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// put your main code here, to run repeatedly:
|
||||||
|
GM02002.setFont(&FreeSans9pt7b);
|
||||||
|
GM02002.setCursor(2, 12);
|
||||||
|
//tft.setTextSize(2);
|
||||||
|
GM02002.setTextColor(PUP_POISON);
|
||||||
|
GM02002.println("Pontiac LeMans '69");
|
||||||
|
GM02002.drawLine(2, 18, 318, 18, PUP_POISON);
|
||||||
|
GM02002.drawLine(2, 19, 318, 19, PUP_POISON);
|
||||||
|
|
||||||
|
GM02002.setCursor(2, 46);
|
||||||
|
Data1.print("Temp Water: 85 'C");
|
||||||
|
|
||||||
|
GM02002.setCursor(2, 64);
|
||||||
|
Data2.print("Temp Oil: 96'C");
|
||||||
|
|
||||||
|
GM02002.setCursor(2, 82);
|
||||||
|
Data3.print("Pressure Oil: 2.23 b");
|
||||||
|
|
||||||
|
GM02002.setCursor(2, 100);
|
||||||
|
Data4.print("Fan Speed: 44%");
|
||||||
|
|
||||||
|
GM02002.setCursor(2, 136);
|
||||||
|
Data5.print("O2 Left Bank: 14.6");
|
||||||
|
|
||||||
|
GM02002.setCursor(2, 154);
|
||||||
|
Data6.print("O2 Right Bank: 14.5");
|
||||||
|
|
||||||
|
GM02002.setCursor(2, 172);
|
||||||
|
Data7.print("Vacuum (In.Hg): 4.2");
|
||||||
|
|
||||||
|
GM02002.setCursor(2, 190);
|
||||||
|
Data8.print("RPM: 1347");
|
||||||
|
|
||||||
|
delay(5000);
|
||||||
|
//tft.fillScreen(ST77XX_BLACK);
|
||||||
|
|
||||||
|
GM02002.setFont(&FreeSans9pt7b);
|
||||||
|
GM02002.setCursor(2, 12);
|
||||||
|
//tft.setTextSize(2);
|
||||||
|
GM02002.setTextColor(PUP_POISON);
|
||||||
|
GM02002.println("Pontiac LeMans '69");
|
||||||
|
GM02002.drawLine(2, 18, 318, 18, PUP_POISON);
|
||||||
|
GM02002.drawLine(2, 19, 318, 19, PUP_POISON);
|
||||||
|
|
||||||
|
GM02002.setCursor(2, 46);
|
||||||
|
Data1.print("Temp Water: 96 'C");
|
||||||
|
|
||||||
|
GM02002.setCursor(2, 64);
|
||||||
|
Data2.print("Temp Oil: 11'C");
|
||||||
|
|
||||||
|
GM02002.setCursor(2, 82);
|
||||||
|
Data3.print("Pressure Oil: 3.23 b");
|
||||||
|
|
||||||
|
GM02002.setCursor(2, 100);
|
||||||
|
Data4.print("Fan Speed: 87%");
|
||||||
|
|
||||||
|
GM02002.setCursor(2, 136);
|
||||||
|
Data5.print("O2 Left Bank: 12.4");
|
||||||
|
|
||||||
|
GM02002.setCursor(2, 154);
|
||||||
|
Data6.print("O2 Right Bank: 12.7");
|
||||||
|
|
||||||
|
GM02002.setCursor(2, 172);
|
||||||
|
Data7.print("Vacuum (In.Hg): 17.5");
|
||||||
|
|
||||||
|
GM02002.setCursor(2, 190);
|
||||||
|
Data8.print("RPM: 4712");
|
||||||
|
|
||||||
|
delay(5000);
|
||||||
|
//tft.fillScreen(ST77XX_BLACK);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* LED = 3v3
|
||||||
|
SCK = 13
|
||||||
|
SDA = 11
|
||||||
|
AO = 9
|
||||||
|
RESET = 8
|
||||||
|
CS = 10
|
||||||
|
GND = GND
|
||||||
|
VCC = 5v
|
||||||
|
*/
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
// To be used with an external Signal Generator.
|
||||||
|
// v16.05.2024.0932
|
||||||
|
#include <SoftwareSerial.h>
|
||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
|
||||||
|
#define ONE_WIRE_BUS 7
|
||||||
|
|
||||||
|
OneWire oneWire(ONE_WIRE_BUS);
|
||||||
|
DallasTemperature clt1(&oneWire);
|
||||||
|
|
||||||
|
float cltTemp = 0;
|
||||||
|
|
||||||
|
//const byte rxPin = 2;
|
||||||
|
//const byte txPin = 3;
|
||||||
|
|
||||||
|
//SoftwareSerial secondSerial (rxPin, txPin);
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// put your setup code here, to run once:
|
||||||
|
Serial.begin(9600);
|
||||||
|
//secondSerial.begin(9600);
|
||||||
|
clt1.begin();
|
||||||
|
//delay(500);
|
||||||
|
//secondSerial.print("F20.0"); //Sets module to 20kHz
|
||||||
|
//delay(20);
|
||||||
|
//secondSerial.print("D000"); //Sets module to 0% Duty Cycle
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// put your main code here, to run repeatedly:
|
||||||
|
float cltTemp = 79;
|
||||||
|
if (cltTemp >= 92) {
|
||||||
|
Serial.println("Max");
|
||||||
|
} else if (cltTemp >= 87 && cltTemp < 95) {
|
||||||
|
Serial.println("Fifty");
|
||||||
|
} else if (cltTemp >= 80 && cltTemp < 87) {
|
||||||
|
Serial.println("TwentyFive");
|
||||||
|
} else if (cltTemp < 80) {
|
||||||
|
Serial.println("Zero");
|
||||||
|
} else {
|
||||||
|
Serial.println("Failsafe, 80 percent");
|
||||||
|
}
|
||||||
|
|
||||||
|
delay(1000);
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
#include <SoftwareSerial.h>
|
||||||
|
|
||||||
|
const byte rxPin = 2;
|
||||||
|
const byte txPin = 3;
|
||||||
|
|
||||||
|
SoftwareSerial secondSerial (rxPin, txPin);
|
||||||
|
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// put your setup code here, to run once:
|
||||||
|
secondSerial.begin(9600);
|
||||||
|
delay(500);
|
||||||
|
secondSerial.print("F20.0"); //Sets module to 20kHz
|
||||||
|
delay(20);
|
||||||
|
secondSerial.print("D000"); //Sets module to 0% Duty Cycle
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// put your main code here, to run repeatedly:
|
||||||
|
delay(10000);
|
||||||
|
secondSerial.print("D030");
|
||||||
|
delay(10000);
|
||||||
|
secondSerial.print("D060");
|
||||||
|
delay(30000);
|
||||||
|
}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
// To be used with an external Signal Generator.
|
||||||
|
// v16.05.2024.0932
|
||||||
|
#include <SoftwareSerial.h>
|
||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
|
||||||
|
#define ONE_WIRE_BUS 7
|
||||||
|
|
||||||
|
OneWire oneWire(ONE_WIRE_BUS);
|
||||||
|
DallasTemperature clt1(&oneWire);
|
||||||
|
|
||||||
|
float cltTemp = 0;
|
||||||
|
|
||||||
|
//const byte rxPin = 2;
|
||||||
|
//const byte txPin = 3;
|
||||||
|
|
||||||
|
//SoftwareSerial secondSerial (rxPin, txPin);
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// put your setup code here, to run once:
|
||||||
|
Serial.begin(9600);
|
||||||
|
//secondSerial.begin(9600);
|
||||||
|
clt1.begin();
|
||||||
|
//delay(500);
|
||||||
|
//secondSerial.print("F20.0"); //Sets module to 20kHz
|
||||||
|
//delay(20);
|
||||||
|
//secondSerial.print("D000"); //Sets module to 0% Duty Cycle
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// put your main code here, to run repeatedly:
|
||||||
|
float cltTemp = 79;
|
||||||
|
if (cltTemp >= 92) {
|
||||||
|
Serial.println("Max");
|
||||||
|
} else if (cltTemp >= 87 && cltTemp < 95) {
|
||||||
|
Serial.println("Fifty");
|
||||||
|
} else if (cltTemp >= 80 && cltTemp < 87) {
|
||||||
|
Serial.println("TwentyFive");
|
||||||
|
} else if (cltTemp < 80) {
|
||||||
|
Serial.println("Zero");
|
||||||
|
} else {
|
||||||
|
Serial.println("Failsafe, 80 percent");
|
||||||
|
}
|
||||||
|
|
||||||
|
delay(1000);
|
||||||
|
}
|
||||||
@@ -0,0 +1,181 @@
|
|||||||
|
/* Latest running code on the Arduino in the Pontiac as of 06.06.2024 */
|
||||||
|
/* Added watchdog timer, 4 seconds. */
|
||||||
|
|
||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_SH110X.h>
|
||||||
|
#include <SoftwareSerial.h>
|
||||||
|
#include <avr/wdt.h>
|
||||||
|
|
||||||
|
#define i2c_Address 0x3C // OLED Adress.
|
||||||
|
#define SCREEN_WIDTH 128
|
||||||
|
#define SCREEN_HEIGHT 64
|
||||||
|
#define OLED_RESET -1
|
||||||
|
|
||||||
|
float tempForFanStartup = 85.0; // 175 target low temp. below this temperature, the fan will be off
|
||||||
|
float tempForFanOnFull = 100.0; // 210 target High temp. above this temperature, the fan will be on at full power
|
||||||
|
|
||||||
|
float voltsForFanStartup = 2.0; // Roughly the signal voltage that triggers the slowest speed.
|
||||||
|
|
||||||
|
const int fanPwmOutPin = 12; // Arduino forces this pin to 0 or 5 volts.
|
||||||
|
const int tempSensorPin = 7; // Pin to read analog voltage from the temp sensor.
|
||||||
|
int pwmDuty; // The calculated PWM duty is stored here
|
||||||
|
float pwmMinStartupDuty; // the starting duty is stored here (mazda module starts fans at about 24 % duty)
|
||||||
|
float currTemperature; // the temperature in F is stored here
|
||||||
|
float fanSpeedPct;
|
||||||
|
|
||||||
|
OneWire oneWire1 (tempSensorPin);
|
||||||
|
DallasTemperature sensorClt1(&oneWire1);
|
||||||
|
|
||||||
|
const byte rxPin = 2;
|
||||||
|
const byte txPin = 3;
|
||||||
|
SoftwareSerial secondSerial (rxPin, txPin);
|
||||||
|
|
||||||
|
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||||
|
|
||||||
|
unsigned long previousMillis = 0; // Variable to store the last time the serial data was sent
|
||||||
|
const long interval = 5000; // Interval between serial data transmissions (in milliseconds)
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
wdt_enable(WDTO_4S);
|
||||||
|
Serial.begin(115200); // set up serial port for 115200 baud (optional)
|
||||||
|
|
||||||
|
if (!display.begin(i2c_Address)) {
|
||||||
|
Serial.println(F("SH110X allocation failed"));
|
||||||
|
for (;;);
|
||||||
|
}
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
secondSerial.begin(9600);
|
||||||
|
delay(500);
|
||||||
|
secondSerial.print("F20.0");
|
||||||
|
delay(20);
|
||||||
|
secondSerial.print("D000");
|
||||||
|
|
||||||
|
sensorClt1.begin();
|
||||||
|
sensorClt1.requestTemperatures();
|
||||||
|
currTemperature = sensorClt1.getTempCByIndex(0);
|
||||||
|
|
||||||
|
pwmMinStartupDuty = (voltsForFanStartup / 5.0) * 255.0; // convert the Mazda starting voltage to a PWM duty
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
unsigned long currentMillis = millis();
|
||||||
|
readAndTranslateTempSensor();
|
||||||
|
calculate_and_send_PWM();
|
||||||
|
//print_to_serial_port(); // uncomment this line for testing and calibration to the laptop.
|
||||||
|
|
||||||
|
// Check if it's time to send serial data
|
||||||
|
if (currentMillis - previousMillis >= interval) {
|
||||||
|
serial_to_signal_generator(); // Send serial data
|
||||||
|
previousMillis = currentMillis; // Save the last time serial data was sent
|
||||||
|
}
|
||||||
|
|
||||||
|
displayOutput();
|
||||||
|
wdt_reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void calculate_and_send_PWM() { /* ++++++++ subroutine to calculate PWM duty cycle ++++++++++++++*/
|
||||||
|
|
||||||
|
if (currTemperature < tempForFanStartup) { // If the temperature is below the lowest setpoint, turn fan off
|
||||||
|
//analogWrite(fanPwmOutPin, 0); // PWM duty = 0 percent
|
||||||
|
pwmDuty = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currTemperature > tempForFanOnFull) { // If the temperature is above the highest setpoint, turn fan on full
|
||||||
|
//analogWrite(fanPwmOutPin, 255); // PWM duty = 100 percent
|
||||||
|
pwmDuty = 255;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
float tempRange = tempForFanOnFull - tempForFanStartup ; // start calculating duty cycle
|
||||||
|
float pwmRange = 255.0 - pwmMinStartupDuty ;
|
||||||
|
float pwmDutyPct = (currTemperature - tempForFanStartup) / tempRange ;
|
||||||
|
|
||||||
|
pwmDuty = (int) (pwmMinStartupDuty + (pwmDutyPct * pwmRange) +.5); // actual PWM duty is calculated here
|
||||||
|
|
||||||
|
fanSpeedPct = map(pwmDuty, 0, 255, 0, 100);
|
||||||
|
|
||||||
|
if (pwmDuty > 255) { // make sure duty ended up between 255 and 0
|
||||||
|
pwmDuty = 255;
|
||||||
|
}
|
||||||
|
if (pwmDuty < 0) {
|
||||||
|
pwmDuty = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//analogWrite(fanPwmOutPin, pwmDuty); // write PWM duty to PWM output pin
|
||||||
|
|
||||||
|
} // end calculate_and_send_PWM
|
||||||
|
|
||||||
|
void readAndTranslateTempSensor() {
|
||||||
|
// Request temperature readings
|
||||||
|
sensorClt1.requestTemperatures();
|
||||||
|
|
||||||
|
// Read the temperature from the sensor
|
||||||
|
float tempC = sensorClt1.getTempCByIndex(0);
|
||||||
|
|
||||||
|
// Check if the temperature reading is within the valid range
|
||||||
|
if (tempC > -30 && tempC < 130) {
|
||||||
|
// If the reading is within the valid range, update the current temperature
|
||||||
|
currTemperature = tempC;
|
||||||
|
}
|
||||||
|
// If the reading is outside the valid range, do not update the current temperature
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayOutput() {
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
display.setTextSize(1);
|
||||||
|
display.setTextColor(SH110X_WHITE);
|
||||||
|
|
||||||
|
// Display temperature on the screen in Celsius with one decimal place
|
||||||
|
display.setCursor(10, 10);
|
||||||
|
display.print("Temp:");
|
||||||
|
display.setCursor(40, 10);
|
||||||
|
display.print(currTemperature, 2); // Display one decimal place
|
||||||
|
|
||||||
|
// Calculate and display fan speed percentage
|
||||||
|
if (currTemperature < tempForFanStartup) {
|
||||||
|
fanSpeedPct = 0; // Set fan speed to 0% if temperature is below startup threshold
|
||||||
|
} else {
|
||||||
|
fanSpeedPct = map(pwmDuty, 0, 255, 0, 100); // Calculate fan speed percentage
|
||||||
|
}
|
||||||
|
|
||||||
|
display.setCursor(10, 20);
|
||||||
|
display.print("Fan%:");
|
||||||
|
display.setCursor(40, 20);
|
||||||
|
display.print((int)fanSpeedPct);
|
||||||
|
|
||||||
|
// Update the display
|
||||||
|
display.display();
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_to_serial_port() { /* ++++++++++ optional prints values to laptop usb port for debugging and calibration ++*/
|
||||||
|
Serial.print(F("currTemperature C: ")); Serial.print(currTemperature);
|
||||||
|
Serial.print(F(" pwmDuty: ")); Serial.println(pwmDuty);
|
||||||
|
Serial.print(F("Percentage: ")); Serial.println((int)fanSpeedPct);
|
||||||
|
}
|
||||||
|
|
||||||
|
void serial_to_signal_generator() {
|
||||||
|
// Determine fan speed percentage to send
|
||||||
|
int speedToSend = (int)fanSpeedPct;
|
||||||
|
|
||||||
|
// Ensure fan speed is 0 if temperature is below startup threshold
|
||||||
|
if (currTemperature < tempForFanStartup) {
|
||||||
|
speedToSend = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check the length of fanSpeedPct
|
||||||
|
if (speedToSend < 10) {
|
||||||
|
secondSerial.print(F("D00")); // Add "D00" prefix for single-digit fan speed
|
||||||
|
} else if (speedToSend < 100) {
|
||||||
|
secondSerial.print(F("D0")); // Add "D0" prefix for double-digit fan speed
|
||||||
|
} else {
|
||||||
|
secondSerial.print(F("D")); // Add "D" prefix for triple-digit fan speed
|
||||||
|
}
|
||||||
|
|
||||||
|
secondSerial.print(speedToSend); // Send fan speed
|
||||||
|
}
|
||||||
@@ -0,0 +1,114 @@
|
|||||||
|
// This a test program, no warranties are implied or given. fanControllerR2V3base
|
||||||
|
// Use, copy any modify this test program any way you want, at your own risk.
|
||||||
|
// Test, test, test and then test some more..
|
||||||
|
// It reads a temperature sensor and controls a Mazda PWM fan power module.
|
||||||
|
// ...Carl...
|
||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
/*----------------------- User adjustable variables and preferences section ---------------------------------*/
|
||||||
|
float tempForFanStartup = 82.0; // 175 target low temp. below this temperature, the fan will be off
|
||||||
|
float tempForFanOnFull = 105.0; // 210 target High temp. above this temperature, the fan will be on at full power
|
||||||
|
// adjust these two to get the desired range. for example for a transmission, maybe 140 to 160
|
||||||
|
|
||||||
|
float voltsForFanStartup = 2.0; // Roughly the signal voltage that triggers the mazda module's slowest speed.
|
||||||
|
// A higher voltage here will effectively increase the fans lowest speed target.
|
||||||
|
/*----------------------- end of User adjustable variables and preferences -----------------------------------*/
|
||||||
|
|
||||||
|
const int fanPwmOutPin = 12; // Arduino forces this pin to 0 or 5 volts.
|
||||||
|
const int tempSensorPin = 7; // Pin to read analog voltage from the temp sensor.
|
||||||
|
int pwmDuty; // The calculated PWM duty is stored here
|
||||||
|
float pwmMinStartupDuty; // the starting duty is stored here (mazda module starts fans at about 24 % duty)
|
||||||
|
float currTemperature; // the temperature in F is stored here
|
||||||
|
float fanSpeedPct;
|
||||||
|
|
||||||
|
OneWire oneWire1 (tempSensorPin);
|
||||||
|
DallasTemperature sensorClt1(&oneWire1);
|
||||||
|
|
||||||
|
void setup() { /* ++++++++++++++++++ Setup is run once when the arduino boots ++++++++++++++++++++++++++*/
|
||||||
|
Serial.begin(115200); // set up serial port for 115200 baud (optional)
|
||||||
|
sensorClt1.begin();
|
||||||
|
|
||||||
|
sensorClt1.requestTemperatures();
|
||||||
|
currTemperature = sensorClt1.getTempCByIndex(0);
|
||||||
|
|
||||||
|
//analogReference (EXTERNAL) ; // note, this is using the 3.3 volt supply as the analog reference.
|
||||||
|
//analogRead (tempSensorPin) ; // a couple of reads to give the A/D time to adjust
|
||||||
|
//analogRead (tempSensorPin) ; // a couple of reads to give the A/D time to adjust
|
||||||
|
//analogWrite(fanPwmOutPin, 0); // turn the fan off at start
|
||||||
|
|
||||||
|
pwmMinStartupDuty = (voltsForFanStartup / 5.0) * 255.0; // convert the Mazda starting voltage to a PWM duty
|
||||||
|
} // end setup
|
||||||
|
|
||||||
|
|
||||||
|
void loop() { /* ++++++++++++++++++ Main Loop, continuously loops forever ++++++++++++++++++++++++++++*/
|
||||||
|
|
||||||
|
readAndTranslateTempSensor();
|
||||||
|
|
||||||
|
calculate_and_send_PWM();
|
||||||
|
|
||||||
|
//print_to_serial_port(); // un-comment this line for testing and calibration to the laptop.
|
||||||
|
|
||||||
|
print_to_signal_generator_softserial();
|
||||||
|
|
||||||
|
} // end main loop
|
||||||
|
|
||||||
|
|
||||||
|
void calculate_and_send_PWM() { /* ++++++++ subroutine to calculate and set PWM duty cycle ++++++++++++++*/
|
||||||
|
|
||||||
|
if (currTemperature < tempForFanStartup) { // If the temperature is below the lowest setpoint, turn fan off
|
||||||
|
analogWrite(fanPwmOutPin, 0); // PWM duty = 0 percent
|
||||||
|
pwmDuty = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currTemperature > tempForFanOnFull) { // If the temperature is above the highest setpoint, turn fan on full
|
||||||
|
analogWrite(fanPwmOutPin, 255); // PWM duty = 100 percent
|
||||||
|
pwmDuty = 255;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
float tempRange = tempForFanOnFull - tempForFanStartup ; // start calculating duty cycle
|
||||||
|
float pwmRange = 255.0 - pwmMinStartupDuty ;
|
||||||
|
float pwmDutyPct = (currTemperature - tempForFanStartup) / tempRange ;
|
||||||
|
|
||||||
|
pwmDuty = (int) (pwmMinStartupDuty + (pwmDutyPct * pwmRange) +.5); // actual PWM duty is calculated here
|
||||||
|
|
||||||
|
fanSpeedPct = map(pwmDuty, 0, 255, 0, 100);
|
||||||
|
|
||||||
|
if (pwmDuty > 255) { // make sure duty ended up between 255 and 0
|
||||||
|
pwmDuty = 255;
|
||||||
|
}
|
||||||
|
if (pwmDuty < 0) {
|
||||||
|
pwmDuty = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
analogWrite(fanPwmOutPin, pwmDuty); // write PWM duty to PWM output pin
|
||||||
|
|
||||||
|
} // end calculate_and_send_PWM
|
||||||
|
|
||||||
|
|
||||||
|
void readAndTranslateTempSensor() { /* ++++++ subroutine to read and translate temp sensor to temp F +++++++++++++*/
|
||||||
|
|
||||||
|
sensorClt1.requestTemperatures();
|
||||||
|
currTemperature = sensorClt1.getTempCByIndex(0);
|
||||||
|
} // end readAndTranslateTempSensor
|
||||||
|
|
||||||
|
|
||||||
|
void print_to_serial_port() { /* ++++++++++ optional prints values to laptop usb port for debugging and calibration ++*/
|
||||||
|
Serial.print(F("currTemperature C: ")); Serial.print(currTemperature);
|
||||||
|
Serial.print(F(" pwmDuty: ")); Serial.println(pwmDuty);
|
||||||
|
Serial.print(F("Percentage: ")); Serial.println((int)fanSpeedPct);
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_to_signal_generator_softserial() {
|
||||||
|
// Check the length of fanSpeedPct
|
||||||
|
if (fanSpeedPct < 10) {
|
||||||
|
Serial.print(F("D00")); // Add "D00" prefix for single-digit fan speed
|
||||||
|
} else if (fanSpeedPct < 100) {
|
||||||
|
Serial.print(F("D0")); // Add "D0" prefix for double-digit fan speed
|
||||||
|
} else {
|
||||||
|
Serial.print(F("D")); // Add "D" prefix for triple-digit fan speed
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.print((int)fanSpeedPct); // Cast fanSpeedPct to int to remove decimals
|
||||||
|
}
|
||||||
82
BoopLabs_PontiacWiper_mk1/BoopLabs_PontiacWiper_mk1.ino
Normal file
82
BoopLabs_PontiacWiper_mk1/BoopLabs_PontiacWiper_mk1.ino
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
#include <avr/wdt.h>
|
||||||
|
|
||||||
|
#define D2 2
|
||||||
|
#define D3 3
|
||||||
|
#define D4 4
|
||||||
|
#define D5 5
|
||||||
|
#define D6 6
|
||||||
|
#define A0_PIN A0
|
||||||
|
#define D10 10
|
||||||
|
#define D11 11
|
||||||
|
#define D12 12
|
||||||
|
|
||||||
|
int potValue = 0;
|
||||||
|
int timerDuration = 0;
|
||||||
|
unsigned long previousMillis = 0;
|
||||||
|
const long debounceDelay = 50;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
pinMode(D2, INPUT_PULLUP);
|
||||||
|
pinMode(D3, INPUT_PULLUP);
|
||||||
|
pinMode(D4, INPUT_PULLUP);
|
||||||
|
pinMode(D5, INPUT_PULLUP);
|
||||||
|
pinMode(D6, INPUT_PULLUP);
|
||||||
|
pinMode(A0_PIN, INPUT);
|
||||||
|
pinMode(D10, OUTPUT);
|
||||||
|
pinMode(D11, OUTPUT);
|
||||||
|
pinMode(D12, OUTPUT);
|
||||||
|
|
||||||
|
digitalWrite(D10, LOW);
|
||||||
|
digitalWrite(D11, LOW);
|
||||||
|
digitalWrite(D12, LOW);
|
||||||
|
|
||||||
|
wdt_enable(WDTO_8S); // Enable watchdog with 8-second timeout
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
wdt_reset(); // Reset the watchdog timer
|
||||||
|
|
||||||
|
int d2State = digitalRead(D2);
|
||||||
|
int d3State = digitalRead(D3);
|
||||||
|
int d4State = digitalRead(D4);
|
||||||
|
int d5State = digitalRead(D5);
|
||||||
|
int d6State = digitalRead(D6);
|
||||||
|
|
||||||
|
// Washer
|
||||||
|
if (d2State == LOW && d6State == LOW) {
|
||||||
|
digitalWrite(D12, HIGH);
|
||||||
|
while (digitalRead(D6) == LOW) {
|
||||||
|
digitalWrite(D10, HIGH);
|
||||||
|
delay(15000); // 15 seconds
|
||||||
|
digitalWrite(D10, LOW);
|
||||||
|
}
|
||||||
|
digitalWrite(D12, LOW);
|
||||||
|
}
|
||||||
|
// Off
|
||||||
|
else if (d2State == LOW) {
|
||||||
|
digitalWrite(D10, LOW);
|
||||||
|
digitalWrite(D11, LOW);
|
||||||
|
}
|
||||||
|
// Pulse
|
||||||
|
else if (d3State == LOW) {
|
||||||
|
digitalWrite(D10, HIGH);
|
||||||
|
delay(500); // 0.5 seconds
|
||||||
|
digitalWrite(D10, LOW);
|
||||||
|
timerDuration = map(analogRead(A0_PIN), 0, 1023, 5000, 50000); // Mapping analog input to timer duration (5-50 seconds)
|
||||||
|
delay(timerDuration);
|
||||||
|
}
|
||||||
|
// Low
|
||||||
|
else if (d4State == LOW) {
|
||||||
|
digitalWrite(D10, HIGH);
|
||||||
|
}
|
||||||
|
// High
|
||||||
|
else if (d5State == LOW) {
|
||||||
|
digitalWrite(D10, HIGH);
|
||||||
|
digitalWrite(D11, HIGH);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
digitalWrite(D12, LOW); // Ensure D12 is low if none of the conditions are met
|
||||||
|
}
|
||||||
|
|
||||||
|
delay(10); // Small delay to debounce
|
||||||
|
}
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
#include <esp_task_wdt.h>
|
||||||
|
|
||||||
|
#define D2 2
|
||||||
|
#define D3 3
|
||||||
|
#define D4 4
|
||||||
|
#define D5 5
|
||||||
|
#define D6 6
|
||||||
|
#define A0_PIN 33
|
||||||
|
#define D10 10
|
||||||
|
#define D11 11
|
||||||
|
#define D12 12
|
||||||
|
#define ONBOARD_LED 15
|
||||||
|
|
||||||
|
int potValue = 0;
|
||||||
|
int timerDuration = 0;
|
||||||
|
unsigned long previousMillis = 0;
|
||||||
|
const long debounceDelay = 50;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(115200);
|
||||||
|
pinMode(D2, INPUT_PULLUP);
|
||||||
|
pinMode(D3, INPUT_PULLUP);
|
||||||
|
pinMode(D4, INPUT_PULLUP);
|
||||||
|
pinMode(D5, INPUT_PULLUP);
|
||||||
|
pinMode(D6, INPUT_PULLUP);
|
||||||
|
pinMode(A0_PIN, INPUT);
|
||||||
|
pinMode(D10, OUTPUT);
|
||||||
|
pinMode(D11, OUTPUT);
|
||||||
|
pinMode(D12, OUTPUT);
|
||||||
|
pinMode(ONBOARD_LED, OUTPUT);
|
||||||
|
|
||||||
|
digitalWrite(D10, LOW);
|
||||||
|
digitalWrite(D11, LOW);
|
||||||
|
digitalWrite(D12, LOW);
|
||||||
|
|
||||||
|
esp_task_wdt_init(10, true); // Initialize watchdog with a timeout of 10 seconds, panic if triggered
|
||||||
|
|
||||||
|
Serial.println("Setup completed.");
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
esp_task_wdt_reset(); // Reset the watchdog timer
|
||||||
|
|
||||||
|
int d2State = digitalRead(D2);
|
||||||
|
int d3State = digitalRead(D3);
|
||||||
|
int d4State = digitalRead(D4);
|
||||||
|
int d5State = digitalRead(D5);
|
||||||
|
int d6State = digitalRead(D6);
|
||||||
|
|
||||||
|
// Blink onboard LED at 1Hz
|
||||||
|
digitalWrite(ONBOARD_LED, HIGH);
|
||||||
|
delay(500);
|
||||||
|
digitalWrite(ONBOARD_LED, LOW);
|
||||||
|
delay(2000);
|
||||||
|
|
||||||
|
Serial.print("D2 State: ");
|
||||||
|
Serial.println(d2State);
|
||||||
|
Serial.print("D3 State: ");
|
||||||
|
Serial.println(d3State);
|
||||||
|
Serial.print("D4 State: ");
|
||||||
|
Serial.println(d4State);
|
||||||
|
Serial.print("D5 State: ");
|
||||||
|
Serial.println(d5State);
|
||||||
|
Serial.print("D6 State: ");
|
||||||
|
Serial.println(d6State);
|
||||||
|
|
||||||
|
// Washer
|
||||||
|
if (d2State == LOW && d6State == LOW) {
|
||||||
|
digitalWrite(D12, HIGH);
|
||||||
|
while (digitalRead(D6) == LOW) {
|
||||||
|
digitalWrite(D10, HIGH);
|
||||||
|
delay(15000); // 15 seconds
|
||||||
|
digitalWrite(D10, LOW);
|
||||||
|
}
|
||||||
|
digitalWrite(D12, LOW);
|
||||||
|
}
|
||||||
|
// Off
|
||||||
|
else if (d2State == LOW) {
|
||||||
|
digitalWrite(D10, LOW);
|
||||||
|
digitalWrite(D11, LOW);
|
||||||
|
}
|
||||||
|
// Pulse
|
||||||
|
else if (d3State == LOW) {
|
||||||
|
digitalWrite(D10, HIGH);
|
||||||
|
delay(500); // 0.5 seconds
|
||||||
|
digitalWrite(D10, LOW);
|
||||||
|
timerDuration = map(analogRead(A0_PIN), 0, 4095, 5000, 50000); // Mapping analog input to timer duration (5-50 seconds)
|
||||||
|
delay(timerDuration);
|
||||||
|
}
|
||||||
|
// Low
|
||||||
|
else if (d4State == LOW) {
|
||||||
|
digitalWrite(D10, HIGH);
|
||||||
|
}
|
||||||
|
// High
|
||||||
|
else if (d5State == LOW) {
|
||||||
|
digitalWrite(D10, HIGH);
|
||||||
|
digitalWrite(D11, HIGH);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
digitalWrite(D12, LOW); // Ensure D12 is low if none of the conditions are met
|
||||||
|
}
|
||||||
|
|
||||||
|
delay(10); // Small delay to debounce
|
||||||
|
}
|
||||||
@@ -0,0 +1,139 @@
|
|||||||
|
// Pin Definitions
|
||||||
|
const int inOff = 3;
|
||||||
|
const int inPulse = 5;
|
||||||
|
const int inLow = 7;
|
||||||
|
const int inHigh = 9;
|
||||||
|
const int inPump = 11;
|
||||||
|
const int inPot = 12;
|
||||||
|
const int oMotor = 39;
|
||||||
|
const int oMag = 37;
|
||||||
|
const int oPump = 18;
|
||||||
|
const int oWash = 16;
|
||||||
|
const int oLED = 15;
|
||||||
|
|
||||||
|
// Global Variables
|
||||||
|
int waitingTime = 5000; // Default waiting time in milliseconds (5 seconds)
|
||||||
|
bool isWipIntmRunning = false; // Flag to track if WipIntm function is running
|
||||||
|
unsigned long previousTime = 0; // Variable to store the previous time for checking elapsed time
|
||||||
|
|
||||||
|
// Default state: WipOffPark
|
||||||
|
int currentState = 0;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// Initialize input pins
|
||||||
|
|
||||||
|
pinMode(inOff, INPUT_PULLUP);
|
||||||
|
pinMode(inPulse, INPUT_PULLUP);
|
||||||
|
pinMode(inLow, INPUT_PULLUP);
|
||||||
|
pinMode(inHigh, INPUT_PULLUP);
|
||||||
|
pinMode(inPump, INPUT_PULLUP);
|
||||||
|
pinMode(inPot, INPUT);
|
||||||
|
|
||||||
|
// Initialize output pins
|
||||||
|
pinMode(oMotor, OUTPUT);
|
||||||
|
pinMode(oMag, OUTPUT);
|
||||||
|
pinMode(oPump, OUTPUT);
|
||||||
|
pinMode(oWash, OUTPUT);
|
||||||
|
pinMode(oLED, OUTPUT);
|
||||||
|
|
||||||
|
// Default state: all Outputs are off (WipOffPark)
|
||||||
|
digitalWrite(oMotor, LOW);
|
||||||
|
digitalWrite(oMag, LOW);
|
||||||
|
digitalWrite(oPump, LOW);
|
||||||
|
digitalWrite(oWash, LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// Blink LED
|
||||||
|
digitalWrite(oLED, HIGH);
|
||||||
|
delay(100);
|
||||||
|
digitalWrite(oLED, LOW);
|
||||||
|
delay(100);
|
||||||
|
|
||||||
|
// Read input states
|
||||||
|
int offParkState = digitalRead(inOff);
|
||||||
|
int intmState = digitalRead(inPulse);
|
||||||
|
int loState = digitalRead(inLow);
|
||||||
|
int hiState = digitalRead(inHigh);
|
||||||
|
|
||||||
|
// Check input states and execute corresponding functions
|
||||||
|
if (offParkState == HIGH) {
|
||||||
|
WipOffPark();
|
||||||
|
currentState = 0; // Set current state to WipOffPark
|
||||||
|
} else if (intmState == HIGH) {
|
||||||
|
if (!isWipIntmRunning) {
|
||||||
|
WipIntm();
|
||||||
|
currentState = 1; // Set current state to WipIntm
|
||||||
|
}
|
||||||
|
} else if (loState == HIGH) {
|
||||||
|
WipLo();
|
||||||
|
currentState = 2; // Set current state to WipLo
|
||||||
|
} else if (hiState == HIGH) {
|
||||||
|
WipHi();
|
||||||
|
currentState = 3; // Set current state to WipHi
|
||||||
|
} else {
|
||||||
|
// Stop WipIntm function if no input is detected
|
||||||
|
if (currentState == 1 && isWipIntmRunning) {
|
||||||
|
isWipIntmRunning = false;
|
||||||
|
digitalWrite(oPump, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update waiting time based on potentiometer value
|
||||||
|
int potValue = analogRead(inPot);
|
||||||
|
waitingTime = map(potValue, 0, 1023, 5000, 30000); // 5 seconds to 30 seconds
|
||||||
|
|
||||||
|
// Check if the waiting time has elapsed for WipIntm function
|
||||||
|
if (currentState == 1 && isWipIntmRunning && millis() - previousTime >= waitingTime) {
|
||||||
|
previousTime = millis(); // Update the previous time for the next waiting period
|
||||||
|
digitalWrite(oPump, LOW);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(oPump, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipOffPark() {
|
||||||
|
digitalWrite(oMotor, LOW);
|
||||||
|
digitalWrite(oMag, LOW);
|
||||||
|
digitalWrite(oPump, HIGH);
|
||||||
|
digitalWrite(oWash, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipIntm() {
|
||||||
|
isWipIntmRunning = true; // Set the flag to indicate that WipIntm function is running
|
||||||
|
digitalWrite(oMotor, LOW);
|
||||||
|
digitalWrite(oMag, LOW);
|
||||||
|
digitalWrite(oPump, HIGH);
|
||||||
|
digitalWrite(oWash, HIGH);
|
||||||
|
|
||||||
|
while (digitalRead(inPulse) == HIGH && isWipIntmRunning) {
|
||||||
|
// WipIntm function code
|
||||||
|
int potValue = analogRead(inPot);
|
||||||
|
waitingTime = map(potValue, 0, 1023, 5000, 30000); // Update waiting time based on potentiometer value
|
||||||
|
|
||||||
|
unsigned long currentTime = millis();
|
||||||
|
if (currentTime - previousTime >= waitingTime) {
|
||||||
|
previousTime = currentTime;
|
||||||
|
digitalWrite(oPump, LOW);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(oPump, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
isWipIntmRunning = false; // Reset the flag after the loop ends
|
||||||
|
digitalWrite(oPump, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipLo() {
|
||||||
|
digitalWrite(oMotor, LOW);
|
||||||
|
digitalWrite(oMag, LOW);
|
||||||
|
digitalWrite(oPump, LOW);
|
||||||
|
digitalWrite(oWash, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipHi() {
|
||||||
|
digitalWrite(oMotor, HIGH);
|
||||||
|
digitalWrite(oMag, LOW);
|
||||||
|
digitalWrite(oPump, LOW);
|
||||||
|
digitalWrite(oWash, HIGH);
|
||||||
|
}
|
||||||
@@ -0,0 +1,139 @@
|
|||||||
|
// Pin Definitions
|
||||||
|
const int inOff = 3;
|
||||||
|
const int inPulse = 5;
|
||||||
|
const int inLow = 7;
|
||||||
|
const int inHigh = 9;
|
||||||
|
const int inPump = 11;
|
||||||
|
const int inPot = 12;
|
||||||
|
const int oMotor = 39;
|
||||||
|
const int oMag = 37;
|
||||||
|
const int oPump = 18;
|
||||||
|
const int oWash = 16;
|
||||||
|
const int oLED = 15;
|
||||||
|
|
||||||
|
// Global Variables
|
||||||
|
int waitingTime = 5000; // Default waiting time in milliseconds (5 seconds)
|
||||||
|
bool isWipIntmRunning = false; // Flag to track if WipIntm function is running
|
||||||
|
unsigned long previousTime = 0; // Variable to store the previous time for checking elapsed time
|
||||||
|
|
||||||
|
// Default state: WipOffPark
|
||||||
|
int currentState = 0;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// Initialize input pins
|
||||||
|
|
||||||
|
pinMode(inOff, INPUT_PULLUP);
|
||||||
|
pinMode(inPulse, INPUT_PULLUP);
|
||||||
|
pinMode(inLow, INPUT_PULLUP);
|
||||||
|
pinMode(inHigh, INPUT_PULLUP);
|
||||||
|
pinMode(inPump, INPUT_PULLUP);
|
||||||
|
pinMode(inPot, INPUT);
|
||||||
|
|
||||||
|
// Initialize output pins
|
||||||
|
pinMode(oMotor, OUTPUT);
|
||||||
|
pinMode(oMag, OUTPUT);
|
||||||
|
pinMode(oPump, OUTPUT);
|
||||||
|
pinMode(oWash, OUTPUT);
|
||||||
|
pinMode(oLED, OUTPUT);
|
||||||
|
|
||||||
|
// Default state: all Outputs are off (WipOffPark)
|
||||||
|
digitalWrite(oMotor, LOW);
|
||||||
|
digitalWrite(oMag, LOW);
|
||||||
|
digitalWrite(oPump, LOW);
|
||||||
|
digitalWrite(oWash, LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// Blink LED
|
||||||
|
digitalWrite(oLED, HIGH);
|
||||||
|
delay(100);
|
||||||
|
digitalWrite(oLED, LOW);
|
||||||
|
delay(100);
|
||||||
|
|
||||||
|
// Read input states
|
||||||
|
int offParkState = digitalRead(inOff);
|
||||||
|
int intmState = digitalRead(inPulse);
|
||||||
|
int loState = digitalRead(inLow);
|
||||||
|
int hiState = digitalRead(inHigh);
|
||||||
|
|
||||||
|
// Check input states and execute corresponding functions
|
||||||
|
if (offParkState == HIGH) {
|
||||||
|
WipOffPark();
|
||||||
|
currentState = 0; // Set current state to WipOffPark
|
||||||
|
} else if (intmState == HIGH) {
|
||||||
|
if (!isWipIntmRunning) {
|
||||||
|
WipIntm();
|
||||||
|
currentState = 1; // Set current state to WipIntm
|
||||||
|
}
|
||||||
|
} else if (loState == HIGH) {
|
||||||
|
WipLo();
|
||||||
|
currentState = 2; // Set current state to WipLo
|
||||||
|
} else if (hiState == HIGH) {
|
||||||
|
WipHi();
|
||||||
|
currentState = 3; // Set current state to WipHi
|
||||||
|
} else {
|
||||||
|
// Stop WipIntm function if no input is detected
|
||||||
|
if (currentState == 1 && isWipIntmRunning) {
|
||||||
|
isWipIntmRunning = false;
|
||||||
|
digitalWrite(oPump, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update waiting time based on potentiometer value
|
||||||
|
int potValue = analogRead(inPot);
|
||||||
|
waitingTime = map(potValue, 0, 1023, 5000, 30000); // 5 seconds to 30 seconds
|
||||||
|
|
||||||
|
// Check if the waiting time has elapsed for WipIntm function
|
||||||
|
if (currentState == 1 && isWipIntmRunning && millis() - previousTime >= waitingTime) {
|
||||||
|
previousTime = millis(); // Update the previous time for the next waiting period
|
||||||
|
digitalWrite(oPump, LOW);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(oPump, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipOffPark() {
|
||||||
|
digitalWrite(oMotor, LOW);
|
||||||
|
digitalWrite(oMag, LOW);
|
||||||
|
digitalWrite(oPump, HIGH);
|
||||||
|
digitalWrite(oWash, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipIntm() {
|
||||||
|
isWipIntmRunning = true; // Set the flag to indicate that WipIntm function is running
|
||||||
|
digitalWrite(oMotor, LOW);
|
||||||
|
digitalWrite(oMag, LOW);
|
||||||
|
digitalWrite(oPump, HIGH);
|
||||||
|
digitalWrite(oWash, HIGH);
|
||||||
|
|
||||||
|
while (digitalRead(inPulse) == HIGH && isWipIntmRunning) {
|
||||||
|
// WipIntm function code
|
||||||
|
int potValue = analogRead(inPot);
|
||||||
|
waitingTime = map(potValue, 0, 1023, 5000, 30000); // Update waiting time based on potentiometer value
|
||||||
|
|
||||||
|
unsigned long currentTime = millis();
|
||||||
|
if (currentTime - previousTime >= waitingTime) {
|
||||||
|
previousTime = currentTime;
|
||||||
|
digitalWrite(oPump, LOW);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(oPump, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
isWipIntmRunning = false; // Reset the flag after the loop ends
|
||||||
|
digitalWrite(oPump, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipLo() {
|
||||||
|
digitalWrite(oMotor, LOW);
|
||||||
|
digitalWrite(oMag, LOW);
|
||||||
|
digitalWrite(oPump, LOW);
|
||||||
|
digitalWrite(oWash, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipHi() {
|
||||||
|
digitalWrite(oMotor, HIGH);
|
||||||
|
digitalWrite(oMag, LOW);
|
||||||
|
digitalWrite(oPump, LOW);
|
||||||
|
digitalWrite(oWash, HIGH);
|
||||||
|
}
|
||||||
@@ -0,0 +1,228 @@
|
|||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
// Define pin numbers
|
||||||
|
const int RELAY_PIN_1 = 13;
|
||||||
|
const int RELAY_PIN_2 = 14;
|
||||||
|
const int RELAY_PIN_3 = 15;
|
||||||
|
const int RELAY_PIN_4 = 16;
|
||||||
|
const int RELAY_PIN_5 = 17;
|
||||||
|
const int RELAY_PIN_6 = 18;
|
||||||
|
const int RELAY_PIN_7 = 19;
|
||||||
|
const int RELAY_PIN_8 = 12;
|
||||||
|
|
||||||
|
const int WASHER_SWITCH_PIN = 11;
|
||||||
|
const int WIPER_SWITCH_PIN_1 = 2;
|
||||||
|
const int WIPER_SWITCH_PIN_2 = 3;
|
||||||
|
const int WIPER_SWITCH_PIN_3 = 4;
|
||||||
|
const int WIPER_SWITCH_PIN_4 = 5;
|
||||||
|
const int WIPER_SWITCH_PIN_5 = 6;
|
||||||
|
const int FAN_SWITCH_PIN_1 = 7;
|
||||||
|
const int FAN_SWITCH_PIN_2 = 8;
|
||||||
|
const int FAN_SWITCH_PIN_3 = 9;
|
||||||
|
const int FAN_SWITCH_PIN_4 = 10;
|
||||||
|
|
||||||
|
// Wiper motor states
|
||||||
|
bool isWiperParked = true;
|
||||||
|
bool isWiperIntermittentLow = false;
|
||||||
|
bool isWiperIntermittentHigh = false;
|
||||||
|
bool isWiperLow = false;
|
||||||
|
bool isWiperHigh = false;
|
||||||
|
|
||||||
|
// Washer motor state
|
||||||
|
bool isWasherOn = false;
|
||||||
|
|
||||||
|
// Fan motor states
|
||||||
|
bool isFanLow = false;
|
||||||
|
bool isFan1 = false;
|
||||||
|
bool isFan2 = false;
|
||||||
|
bool isFanHigh = false;
|
||||||
|
|
||||||
|
// Timer variables for intermittent states
|
||||||
|
unsigned long intermittentLowStartTime = 0;
|
||||||
|
unsigned long intermittentHighStartTime = 0;
|
||||||
|
const unsigned long intermittentLowInterval = 8000; // 8 seconds
|
||||||
|
const unsigned long intermittentHighInterval = 16000; // 16 seconds
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// Initialize relay pins as outputs
|
||||||
|
pinMode(RELAY_PIN_1, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_2, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_3, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_4, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_5, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_6, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_7, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_8, OUTPUT);
|
||||||
|
|
||||||
|
// Initialize switch pins as inputs
|
||||||
|
pinMode(WASHER_SWITCH_PIN, INPUT);
|
||||||
|
pinMode(WIPER_SWITCH_PIN_1, INPUT);
|
||||||
|
pinMode(WIPER_SWITCH_PIN_2, INPUT);
|
||||||
|
pinMode(WIPER_SWITCH_PIN_3, INPUT);
|
||||||
|
pinMode(WIPER_SWITCH_PIN_4, INPUT);
|
||||||
|
pinMode(WIPER_SWITCH_PIN_5, INPUT);
|
||||||
|
pinMode(FAN_SWITCH_PIN_1, INPUT);
|
||||||
|
pinMode(FAN_SWITCH_PIN_2, INPUT);
|
||||||
|
pinMode(FAN_SWITCH_PIN_3, INPUT);
|
||||||
|
pinMode(FAN_SWITCH_PIN_4, INPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
checkWiperSwitch();
|
||||||
|
checkWasherSwitch();
|
||||||
|
checkFanSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
void checkWiperSwitch() {
|
||||||
|
if (digitalRead(WIPER_SWITCH_PIN_1) == HIGH) {
|
||||||
|
// Wiper parking/off/default state
|
||||||
|
isWiperParked = true;
|
||||||
|
isWiperIntermittentLow = false;
|
||||||
|
isWiperIntermittentHigh = false;
|
||||||
|
isWiperLow = false;
|
||||||
|
isWiperHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_1, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_2, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_3, HIGH);
|
||||||
|
} else if (digitalRead(WIPER_SWITCH_PIN_2) == HIGH) {
|
||||||
|
// Intermittent low state
|
||||||
|
isWiperParked = false;
|
||||||
|
isWiperIntermittentLow = true;
|
||||||
|
isWiperIntermittentHigh = false;
|
||||||
|
isWiperLow = false;
|
||||||
|
isWiperHigh = false;
|
||||||
|
|
||||||
|
if (intermittentLowStartTime == 0) {
|
||||||
|
intermittentLowStartTime = millis();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (millis() - intermittentLowStartTime >= intermittentLowInterval) {
|
||||||
|
intermittentLowStartTime = millis();
|
||||||
|
digitalWrite(RELAY_PIN_3, LOW);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(RELAY_PIN_3, HIGH);
|
||||||
|
}
|
||||||
|
} else if (digitalRead(WIPER_SWITCH_PIN_3) == HIGH) {
|
||||||
|
// Intermittent high state
|
||||||
|
isWiperParked = false;
|
||||||
|
isWiperIntermittentLow = false;
|
||||||
|
isWiperIntermittentHigh = true;
|
||||||
|
isWiperLow = false;
|
||||||
|
isWiperHigh = false;
|
||||||
|
|
||||||
|
if (intermittentHighStartTime == 0) {
|
||||||
|
intermittentHighStartTime = millis();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (millis() - intermittentHighStartTime >= intermittentHighInterval) {
|
||||||
|
intermittentHighStartTime = millis();
|
||||||
|
digitalWrite(RELAY_PIN_3, LOW);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(RELAY_PIN_3, HIGH);
|
||||||
|
}
|
||||||
|
} else if (digitalRead(WIPER_SWITCH_PIN_4) == HIGH) {
|
||||||
|
// Wiper low state
|
||||||
|
isWiperParked = false;
|
||||||
|
isWiperIntermittentLow = false;
|
||||||
|
isWiperIntermittentHigh = false;
|
||||||
|
isWiperLow = true;
|
||||||
|
isWiperHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_1, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_2, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_3, LOW);
|
||||||
|
} else if (digitalRead(WIPER_SWITCH_PIN_5) == HIGH) {
|
||||||
|
// Wiper high state
|
||||||
|
isWiperParked = false;
|
||||||
|
isWiperIntermittentLow = false;
|
||||||
|
isWiperIntermittentHigh = false;
|
||||||
|
isWiperLow = false;
|
||||||
|
isWiperHigh = true;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_1, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_2, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_3, LOW);
|
||||||
|
} else {
|
||||||
|
// Default to wiper parking/off/default state
|
||||||
|
isWiperParked = true;
|
||||||
|
isWiperIntermittentLow = false;
|
||||||
|
isWiperIntermittentHigh = false;
|
||||||
|
isWiperLow = false;
|
||||||
|
isWiperHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_1, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_2, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_3, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void checkWasherSwitch() {
|
||||||
|
if (digitalRead(WASHER_SWITCH_PIN) == HIGH) {
|
||||||
|
// Washer motor control, relay 4
|
||||||
|
isWasherOn = true;
|
||||||
|
digitalWrite(RELAY_PIN_4, LOW);
|
||||||
|
} else {
|
||||||
|
isWasherOn = false;
|
||||||
|
digitalWrite(RELAY_PIN_4, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void checkFanSwitch() {
|
||||||
|
if (digitalRead(FAN_SWITCH_PIN_1) == HIGH) {
|
||||||
|
// Fan motor low state
|
||||||
|
isFanLow = true;
|
||||||
|
isFan1 = false;
|
||||||
|
isFan2 = false;
|
||||||
|
isFanHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_5, LOW); // Inverted
|
||||||
|
digitalWrite(RELAY_PIN_6, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_7, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_8, HIGH);
|
||||||
|
} else if (digitalRead(FAN_SWITCH_PIN_2) == HIGH) {
|
||||||
|
// Fan motor 1 state
|
||||||
|
isFanLow = false;
|
||||||
|
isFan1 = true;
|
||||||
|
isFan2 = false;
|
||||||
|
isFanHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_5, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_6, LOW); // Inverted
|
||||||
|
digitalWrite(RELAY_PIN_7, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_8, HIGH);
|
||||||
|
} else if (digitalRead(FAN_SWITCH_PIN_3) == HIGH) {
|
||||||
|
// Fan motor 2 state
|
||||||
|
isFanLow = false;
|
||||||
|
isFan1 = false;
|
||||||
|
isFan2 = true;
|
||||||
|
isFanHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_5, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_6, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_7, LOW); // Inverted
|
||||||
|
digitalWrite(RELAY_PIN_8, HIGH);
|
||||||
|
} else if (digitalRead(FAN_SWITCH_PIN_4) == HIGH) {
|
||||||
|
// Fan motor high state
|
||||||
|
isFanLow = false;
|
||||||
|
isFan1 = false;
|
||||||
|
isFan2 = false;
|
||||||
|
isFanHigh = true;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_5, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_6, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_7, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_8, LOW); // Inverted
|
||||||
|
} else {
|
||||||
|
// Default to fan motor off state
|
||||||
|
isFanLow = false;
|
||||||
|
isFan1 = false;
|
||||||
|
isFan2 = false;
|
||||||
|
isFanHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_5, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_6, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_7, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_8, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
56
BoopLabs_WiperFromScratch/BoopLabs_WiperFromScratch.ino
Normal file
56
BoopLabs_WiperFromScratch/BoopLabs_WiperFromScratch.ino
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
#include <esp_task_wdt.h>
|
||||||
|
|
||||||
|
#define oMag 10
|
||||||
|
#define oRelay 11
|
||||||
|
#define oPump 12
|
||||||
|
#define oTimer 13
|
||||||
|
|
||||||
|
#define iOff 2
|
||||||
|
#define iPulse 3
|
||||||
|
#define iLow 4
|
||||||
|
#define iHigh 5
|
||||||
|
#define iPump 6
|
||||||
|
|
||||||
|
const int iPot = 8;
|
||||||
|
const int bLed = 15;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// put your setup code here, to run once:
|
||||||
|
pinMode(oMag, OUTPUT);
|
||||||
|
pinMode(oRelay, OUTPUT);
|
||||||
|
pinMode(oPump, OUTPUT);
|
||||||
|
pinMode(oTimer, OUTPUT);
|
||||||
|
|
||||||
|
pinMode(iOff, INPUT_PULLUP);
|
||||||
|
pinMode(iPulse, INPUT_PULLUP);
|
||||||
|
pinMode(iLow, INPUT_PULLUP);
|
||||||
|
pinMode(iHigh, INPUT_PULLUP);
|
||||||
|
pinMode(iPump, INPUT_PULLUP);
|
||||||
|
|
||||||
|
pinMode(iPot, INPUT);
|
||||||
|
|
||||||
|
pinMode(bLed, OUTPUT);
|
||||||
|
|
||||||
|
esp_task_wdt_init(10, true); // Initialize watchdog with a timeout of 10 seconds, panic if triggered
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
esp_task_wdt_reset(); // Reset the watchdog timer
|
||||||
|
|
||||||
|
// Read Potentiometer
|
||||||
|
int iPotValue = analogRead(iPot);
|
||||||
|
int delayTime = map(iPotValue, 0, 1023, 5000, 45000);
|
||||||
|
|
||||||
|
// Initialize stuff
|
||||||
|
int iOffState = digitalRead(iOff);
|
||||||
|
int iPulseState = digitalRead(iPulse);
|
||||||
|
int iLowState = digitalRead(iLow);
|
||||||
|
int iHighState = digitalRead(iHigh);
|
||||||
|
int iPumpState = digitalRead(iPump);
|
||||||
|
// put your main code here, to run repeatedly:
|
||||||
|
|
||||||
|
digitalWrite(bLed, HIGH);
|
||||||
|
delay(500);
|
||||||
|
digitalWrite(bLed, LOW);
|
||||||
|
delay(delayTime);
|
||||||
|
}
|
||||||
177
BoopWiper_08042024-01/BoopWiper_08042024-01.ino
Normal file
177
BoopWiper_08042024-01/BoopWiper_08042024-01.ino
Normal file
@@ -0,0 +1,177 @@
|
|||||||
|
// Pin Definitions
|
||||||
|
const int iPot = 12;
|
||||||
|
const int iOff = 2;
|
||||||
|
const int iPulse = 3;
|
||||||
|
const int iLow = 4;
|
||||||
|
const int iHigh = 5;
|
||||||
|
const int iPump = 7;
|
||||||
|
const int oPWM = 37; // White LED
|
||||||
|
const int oMAG = 39; // Blue LED
|
||||||
|
const int oPump = 21; // Green LED
|
||||||
|
const int oLight = 18; // Red LED
|
||||||
|
|
||||||
|
// Global Variables
|
||||||
|
int waitingTime = 5000; // Default waiting time in milliseconds (5 seconds)
|
||||||
|
bool isWipIntmRunning = false; // Flag to track if WipIntm function is running
|
||||||
|
unsigned long previousTime = 0; // Variable to store the previous time for checking elapsed time
|
||||||
|
|
||||||
|
// Default state: WipOffPark
|
||||||
|
int currentState = 0;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(115200);
|
||||||
|
Serial.println("Hello, this is BoopWiper.");
|
||||||
|
// Initialize input pins
|
||||||
|
pinMode(iPot, INPUT);
|
||||||
|
pinMode(iOff, INPUT_PULLUP);
|
||||||
|
pinMode(iPulse, INPUT_PULLUP);
|
||||||
|
pinMode(iLow, INPUT_PULLUP);
|
||||||
|
pinMode(iHigh, INPUT_PULLUP);
|
||||||
|
pinMode(iPump, INPUT_PULLUP);
|
||||||
|
|
||||||
|
// Initialize output pins
|
||||||
|
pinMode(oPWM, OUTPUT);
|
||||||
|
pinMode(oMAG, OUTPUT);
|
||||||
|
pinMode(oPump, OUTPUT);
|
||||||
|
pinMode(oLight, OUTPUT);
|
||||||
|
|
||||||
|
// Default state: all relays off (WipOffPark)
|
||||||
|
digitalWrite(oPWM, LOW);
|
||||||
|
digitalWrite(oMAG, LOW);
|
||||||
|
digitalWrite(oPump, LOW);
|
||||||
|
digitalWrite(oLight, LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// Read input states
|
||||||
|
int offParkState = digitalRead(iOff);
|
||||||
|
int intmState = digitalRead(iPulse);
|
||||||
|
int loState = digitalRead(iLow);
|
||||||
|
int hiState = digitalRead(iHigh);
|
||||||
|
int pumpState = digitalRead(iPump);
|
||||||
|
|
||||||
|
// Check if iPump is pressed to turn on oPump
|
||||||
|
if (pumpState == LOW) {
|
||||||
|
digitalWrite(oPump, HIGH);
|
||||||
|
if (offParkState == LOW) {
|
||||||
|
// If iPump is pressed in WipOffPark state, set oPWM to 40% duty cycle and turn on oMAG
|
||||||
|
digitalWrite(oMAG, HIGH);
|
||||||
|
analogWrite(oPWM, 102); // Set oPWM to 40% duty cycle
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
digitalWrite(oPump, LOW);
|
||||||
|
if (offParkState == LOW) {
|
||||||
|
// If iPump is released in WipOffPark state, turn off oMAG and set oPWM to LOW
|
||||||
|
digitalWrite(oMAG, LOW);
|
||||||
|
digitalWrite(oPWM, LOW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if WipIntm state needs to be exited
|
||||||
|
if (currentState == 1 && isWipIntmRunning && intmState == HIGH) {
|
||||||
|
isWipIntmRunning = false;
|
||||||
|
digitalWrite(oMAG, LOW);
|
||||||
|
Serial.println("Pulse ended...");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check input states and execute corresponding functions
|
||||||
|
if (offParkState == LOW && pumpState == HIGH) {
|
||||||
|
WipOffPark();
|
||||||
|
currentState = 0; // Set current state to WipOffPark
|
||||||
|
} else if (intmState == LOW) {
|
||||||
|
if (!isWipIntmRunning) {
|
||||||
|
WipIntm();
|
||||||
|
currentState = 1; // Set current state to WipIntm
|
||||||
|
}
|
||||||
|
} else if (loState == LOW) {
|
||||||
|
WipLo();
|
||||||
|
currentState = 2; // Set current state to WipLo
|
||||||
|
} else if (hiState == LOW) {
|
||||||
|
WipHi();
|
||||||
|
currentState = 3; // Set current state to WipHi
|
||||||
|
} else {
|
||||||
|
// Stop WipIntm function if no input is detected
|
||||||
|
if (currentState == 1 && isWipIntmRunning) {
|
||||||
|
isWipIntmRunning = false;
|
||||||
|
Serial.println("Pulse is off again...");
|
||||||
|
digitalWrite(oMAG, LOW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update waiting time based on potentiometer value
|
||||||
|
int potValue = analogRead(iPot);
|
||||||
|
waitingTime = map(potValue, 0, 4095, 5000, 30000); // 5 seconds to 30 seconds
|
||||||
|
|
||||||
|
// Check if the waiting time has elapsed for WipIntm function
|
||||||
|
if (currentState == 1 && isWipIntmRunning && millis() - previousTime >= waitingTime) {
|
||||||
|
previousTime = millis(); // Update the previous time for the next waiting period
|
||||||
|
Serial.println("Warpp??");
|
||||||
|
digitalWrite(oMAG, HIGH);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(oMAG, LOW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipOffPark() {
|
||||||
|
Serial.println("I am now in off position, nothing will happen now!");
|
||||||
|
digitalWrite(oLight, LOW);
|
||||||
|
digitalWrite(oMAG, LOW);
|
||||||
|
//analogWrite(oPWM, 102);
|
||||||
|
delay(2000);
|
||||||
|
analogWrite(oPWM, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipIntm() {
|
||||||
|
isWipIntmRunning = true; // Set the flag to indicate that WipIntm function is running
|
||||||
|
Serial.println("Pulse mode!");
|
||||||
|
|
||||||
|
analogWrite(oPWM, 115);
|
||||||
|
digitalWrite(oMAG, LOW);
|
||||||
|
|
||||||
|
while (isWipIntmRunning) {
|
||||||
|
// WipIntm function code
|
||||||
|
int potValue = analogRead(iPot);
|
||||||
|
waitingTime = map(potValue, 0, 4095, 5000, 30000); // Update waiting time based on potentiometer value
|
||||||
|
|
||||||
|
unsigned long currentTime = millis();
|
||||||
|
if (currentTime - previousTime >= waitingTime) {
|
||||||
|
previousTime = currentTime;
|
||||||
|
Serial.println("Wipe...");
|
||||||
|
digitalWrite(oMAG, HIGH);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(oMAG, LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if iPump is pressed during WipIntm
|
||||||
|
int pumpState = digitalRead(iPump);
|
||||||
|
if (pumpState == LOW) {
|
||||||
|
Serial.println("Pulse and pumping");
|
||||||
|
digitalWrite(oMAG, HIGH); // Keep oMAG on
|
||||||
|
digitalWrite(oPump, HIGH);
|
||||||
|
} else {
|
||||||
|
Serial.println("Pulse and pump off");
|
||||||
|
digitalWrite(oMAG, LOW); // Turn off oMAG when iPump is released
|
||||||
|
digitalWrite(oPump, LOW);
|
||||||
|
isWipIntmRunning = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
isWipIntmRunning = false; // Reset the flag after the loop ends
|
||||||
|
Serial.println("Pulse ended...");
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipLo() {
|
||||||
|
Serial.println("Wipers are in low speed! 40% DutyCycle");
|
||||||
|
analogWrite(oPWM, 102); // Set oPWM to 40% duty cycle
|
||||||
|
digitalWrite(oMAG, HIGH);
|
||||||
|
digitalWrite(oLight, LOW);
|
||||||
|
delay(20);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipHi() {
|
||||||
|
Serial.println("Wipers are now in high speed! 75% Duty Cycle");
|
||||||
|
analogWrite(oPWM, 200);
|
||||||
|
digitalWrite(oMAG, HIGH);
|
||||||
|
digitalWrite(oLight, HIGH);
|
||||||
|
delay(20);
|
||||||
|
}
|
||||||
@@ -0,0 +1,177 @@
|
|||||||
|
// Pin Definitions
|
||||||
|
const int iPot = 12;
|
||||||
|
const int iOff = 2;
|
||||||
|
const int iPulse = 3;
|
||||||
|
const int iLow = 4;
|
||||||
|
const int iHigh = 5;
|
||||||
|
const int iPump = 7;
|
||||||
|
const int oPWM = 37; // White LED
|
||||||
|
const int oMAG = 39; // Blue LED
|
||||||
|
const int oPump = 21; // Green LED
|
||||||
|
const int oLight = 18; // Red LED
|
||||||
|
|
||||||
|
// Global Variables
|
||||||
|
int waitingTime = 5000; // Default waiting time in milliseconds (5 seconds)
|
||||||
|
bool isWipIntmRunning = false; // Flag to track if WipIntm function is running
|
||||||
|
unsigned long previousTime = 0; // Variable to store the previous time for checking elapsed time
|
||||||
|
|
||||||
|
// Default state: WipOffPark
|
||||||
|
int currentState = 0;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(115200);
|
||||||
|
Serial.println("Hello, this is BoopWiper.");
|
||||||
|
// Initialize input pins
|
||||||
|
pinMode(iPot, INPUT);
|
||||||
|
pinMode(iOff, INPUT_PULLUP);
|
||||||
|
pinMode(iPulse, INPUT_PULLUP);
|
||||||
|
pinMode(iLow, INPUT_PULLUP);
|
||||||
|
pinMode(iHigh, INPUT_PULLUP);
|
||||||
|
pinMode(iPump, INPUT_PULLUP);
|
||||||
|
|
||||||
|
// Initialize output pins
|
||||||
|
pinMode(oPWM, OUTPUT);
|
||||||
|
pinMode(oMAG, OUTPUT);
|
||||||
|
pinMode(oPump, OUTPUT);
|
||||||
|
pinMode(oLight, OUTPUT);
|
||||||
|
|
||||||
|
// Default state: all relays off (WipOffPark)
|
||||||
|
digitalWrite(oPWM, LOW);
|
||||||
|
digitalWrite(oMAG, LOW);
|
||||||
|
digitalWrite(oPump, LOW);
|
||||||
|
digitalWrite(oLight, LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// Read input states
|
||||||
|
int offParkState = digitalRead(iOff);
|
||||||
|
int intmState = digitalRead(iPulse);
|
||||||
|
int loState = digitalRead(iLow);
|
||||||
|
int hiState = digitalRead(iHigh);
|
||||||
|
int pumpState = digitalRead(iPump);
|
||||||
|
|
||||||
|
// Check if iPump is pressed to turn on oPump
|
||||||
|
if (pumpState == LOW) {
|
||||||
|
digitalWrite(oPump, HIGH);
|
||||||
|
if (offParkState == LOW) {
|
||||||
|
// If iPump is pressed in WipOffPark state, set oPWM to 40% duty cycle and turn on oMAG
|
||||||
|
digitalWrite(oMAG, HIGH);
|
||||||
|
analogWrite(oPWM, 102); // Set oPWM to 40% duty cycle
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
digitalWrite(oPump, LOW);
|
||||||
|
if (offParkState == LOW) {
|
||||||
|
// If iPump is released in WipOffPark state, turn off oMAG and set oPWM to LOW
|
||||||
|
digitalWrite(oMAG, LOW);
|
||||||
|
digitalWrite(oPWM, LOW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if WipIntm state needs to be exited
|
||||||
|
if (currentState == 1 && isWipIntmRunning && intmState == HIGH) {
|
||||||
|
isWipIntmRunning = false;
|
||||||
|
digitalWrite(oMAG, LOW);
|
||||||
|
Serial.println("Pulse ended...");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check input states and execute corresponding functions
|
||||||
|
if (offParkState == LOW && pumpState == HIGH) {
|
||||||
|
WipOffPark();
|
||||||
|
currentState = 0; // Set current state to WipOffPark
|
||||||
|
} else if (intmState == LOW) {
|
||||||
|
if (!isWipIntmRunning) {
|
||||||
|
WipIntm();
|
||||||
|
currentState = 1; // Set current state to WipIntm
|
||||||
|
}
|
||||||
|
} else if (loState == LOW) {
|
||||||
|
WipLo();
|
||||||
|
currentState = 2; // Set current state to WipLo
|
||||||
|
} else if (hiState == LOW) {
|
||||||
|
WipHi();
|
||||||
|
currentState = 3; // Set current state to WipHi
|
||||||
|
} else {
|
||||||
|
// Stop WipIntm function if no input is detected
|
||||||
|
if (currentState == 1 && isWipIntmRunning) {
|
||||||
|
isWipIntmRunning = false;
|
||||||
|
Serial.println("Pulse is off again...");
|
||||||
|
digitalWrite(oMAG, LOW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update waiting time based on potentiometer value
|
||||||
|
int potValue = analogRead(iPot);
|
||||||
|
waitingTime = map(potValue, 0, 4095, 5000, 30000); // 5 seconds to 30 seconds
|
||||||
|
|
||||||
|
// Check if the waiting time has elapsed for WipIntm function
|
||||||
|
if (currentState == 1 && isWipIntmRunning && millis() - previousTime >= waitingTime) {
|
||||||
|
previousTime = millis(); // Update the previous time for the next waiting period
|
||||||
|
Serial.println("Warpp??");
|
||||||
|
digitalWrite(oMAG, HIGH);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(oMAG, LOW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipOffPark() {
|
||||||
|
Serial.println("I am now in off position, nothing will happen now!");
|
||||||
|
digitalWrite(oLight, LOW);
|
||||||
|
digitalWrite(oMAG, LOW);
|
||||||
|
//analogWrite(oPWM, 102);
|
||||||
|
delay(2000);
|
||||||
|
analogWrite(oPWM, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipIntm() {
|
||||||
|
isWipIntmRunning = true; // Set the flag to indicate that WipIntm function is running
|
||||||
|
Serial.println("Pulse mode!");
|
||||||
|
|
||||||
|
analogWrite(oPWM, 115);
|
||||||
|
digitalWrite(oMAG, LOW);
|
||||||
|
|
||||||
|
while (isWipIntmRunning) {
|
||||||
|
// WipIntm function code
|
||||||
|
int potValue = analogRead(iPot);
|
||||||
|
waitingTime = map(potValue, 0, 4095, 5000, 30000); // Update waiting time based on potentiometer value
|
||||||
|
|
||||||
|
unsigned long currentTime = millis();
|
||||||
|
if (currentTime - previousTime >= waitingTime) {
|
||||||
|
previousTime = currentTime;
|
||||||
|
Serial.println("Wipe...");
|
||||||
|
digitalWrite(oMAG, HIGH);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(oMAG, LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if iPump is pressed during WipIntm
|
||||||
|
int pumpState = digitalRead(iPump);
|
||||||
|
if (pumpState == LOW) {
|
||||||
|
Serial.println("Pulse and pumping");
|
||||||
|
digitalWrite(oMAG, HIGH); // Keep oMAG on
|
||||||
|
digitalWrite(oPump, HIGH);
|
||||||
|
} else {
|
||||||
|
Serial.println("Pulse and pump off");
|
||||||
|
digitalWrite(oMAG, LOW); // Turn off oMAG when iPump is released
|
||||||
|
digitalWrite(oPump, LOW);
|
||||||
|
isWipIntmRunning = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
isWipIntmRunning = false; // Reset the flag after the loop ends
|
||||||
|
Serial.println("Pulse ended...");
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipLo() {
|
||||||
|
Serial.println("Wipers are in low speed! 40% DutyCycle");
|
||||||
|
analogWrite(oPWM, 102); // Set oPWM to 40% duty cycle
|
||||||
|
digitalWrite(oMAG, HIGH);
|
||||||
|
digitalWrite(oLight, LOW);
|
||||||
|
delay(20);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipHi() {
|
||||||
|
Serial.println("Wipers are now in high speed! 75% Duty Cycle");
|
||||||
|
analogWrite(oPWM, 200);
|
||||||
|
digitalWrite(oMAG, HIGH);
|
||||||
|
digitalWrite(oLight, HIGH);
|
||||||
|
delay(20);
|
||||||
|
}
|
||||||
@@ -0,0 +1,177 @@
|
|||||||
|
// Pin Definitions
|
||||||
|
const int iPot = 12;
|
||||||
|
const int iOff = 2;
|
||||||
|
const int iPulse = 3;
|
||||||
|
const int iLow = 4;
|
||||||
|
const int iHigh = 5;
|
||||||
|
const int iPump = 7;
|
||||||
|
const int oPWM = 37; // White LED
|
||||||
|
const int oMAG = 39; // Blue LED
|
||||||
|
const int oPump = 21; // Green LED
|
||||||
|
const int oLight = 18; // Red LED
|
||||||
|
|
||||||
|
// Global Variables
|
||||||
|
int waitingTime = 5000; // Default waiting time in milliseconds (5 seconds)
|
||||||
|
bool isWipIntmRunning = false; // Flag to track if WipIntm function is running
|
||||||
|
unsigned long previousTime = 0; // Variable to store the previous time for checking elapsed time
|
||||||
|
|
||||||
|
// Default state: WipOffPark
|
||||||
|
int currentState = 0;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(115200);
|
||||||
|
Serial.println("Hello, this is BoopWiper.");
|
||||||
|
// Initialize input pins
|
||||||
|
pinMode(iPot, INPUT);
|
||||||
|
pinMode(iOff, INPUT_PULLUP);
|
||||||
|
pinMode(iPulse, INPUT_PULLUP);
|
||||||
|
pinMode(iLow, INPUT_PULLUP);
|
||||||
|
pinMode(iHigh, INPUT_PULLUP);
|
||||||
|
pinMode(iPump, INPUT_PULLUP);
|
||||||
|
|
||||||
|
// Initialize output pins
|
||||||
|
pinMode(oPWM, OUTPUT);
|
||||||
|
pinMode(oMAG, OUTPUT);
|
||||||
|
pinMode(oPump, OUTPUT);
|
||||||
|
pinMode(oLight, OUTPUT);
|
||||||
|
|
||||||
|
// Default state: all relays off (WipOffPark)
|
||||||
|
digitalWrite(oPWM, LOW);
|
||||||
|
digitalWrite(oMAG, LOW);
|
||||||
|
digitalWrite(oPump, LOW);
|
||||||
|
digitalWrite(oLight, LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// Read input states
|
||||||
|
int offParkState = digitalRead(iOff);
|
||||||
|
int intmState = digitalRead(iPulse);
|
||||||
|
int loState = digitalRead(iLow);
|
||||||
|
int hiState = digitalRead(iHigh);
|
||||||
|
int pumpState = digitalRead(iPump);
|
||||||
|
|
||||||
|
// Check if iPump is pressed to turn on oPump
|
||||||
|
if (pumpState == LOW) {
|
||||||
|
digitalWrite(oPump, HIGH);
|
||||||
|
if (offParkState == LOW) {
|
||||||
|
// If iPump is pressed in WipOffPark state, set oPWM to 40% duty cycle and turn on oMAG
|
||||||
|
digitalWrite(oMAG, HIGH);
|
||||||
|
analogWrite(oPWM, 102); // Set oPWM to 40% duty cycle
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
digitalWrite(oPump, LOW);
|
||||||
|
if (offParkState == LOW) {
|
||||||
|
// If iPump is released in WipOffPark state, turn off oMAG and set oPWM to LOW
|
||||||
|
digitalWrite(oMAG, LOW);
|
||||||
|
digitalWrite(oPWM, LOW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if WipIntm state needs to be exited
|
||||||
|
if (currentState == 1 && isWipIntmRunning && intmState == HIGH) {
|
||||||
|
isWipIntmRunning = false;
|
||||||
|
digitalWrite(oMAG, LOW);
|
||||||
|
Serial.println("Pulse ended...");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check input states and execute corresponding functions
|
||||||
|
if (offParkState == LOW && pumpState == HIGH) {
|
||||||
|
WipOffPark();
|
||||||
|
currentState = 0; // Set current state to WipOffPark
|
||||||
|
} else if (intmState == LOW) {
|
||||||
|
if (!isWipIntmRunning) {
|
||||||
|
WipIntm();
|
||||||
|
currentState = 1; // Set current state to WipIntm
|
||||||
|
}
|
||||||
|
} else if (loState == LOW) {
|
||||||
|
WipLo();
|
||||||
|
currentState = 2; // Set current state to WipLo
|
||||||
|
} else if (hiState == LOW) {
|
||||||
|
WipHi();
|
||||||
|
currentState = 3; // Set current state to WipHi
|
||||||
|
} else {
|
||||||
|
// Stop WipIntm function if no input is detected
|
||||||
|
if (currentState == 1 && isWipIntmRunning) {
|
||||||
|
isWipIntmRunning = false;
|
||||||
|
Serial.println("Pulse is off again...");
|
||||||
|
digitalWrite(oMAG, LOW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update waiting time based on potentiometer value
|
||||||
|
int potValue = analogRead(iPot);
|
||||||
|
waitingTime = map(potValue, 0, 4095, 5000, 30000); // 5 seconds to 30 seconds
|
||||||
|
|
||||||
|
// Check if the waiting time has elapsed for WipIntm function
|
||||||
|
if (currentState == 1 && isWipIntmRunning && millis() - previousTime >= waitingTime) {
|
||||||
|
previousTime = millis(); // Update the previous time for the next waiting period
|
||||||
|
Serial.println("Warpp??");
|
||||||
|
digitalWrite(oMAG, HIGH);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(oMAG, LOW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipOffPark() {
|
||||||
|
Serial.println("I am now in off position, nothing will happen now!");
|
||||||
|
digitalWrite(oLight, LOW);
|
||||||
|
digitalWrite(oMAG, LOW);
|
||||||
|
//analogWrite(oPWM, 102);
|
||||||
|
delay(2000);
|
||||||
|
analogWrite(oPWM, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipIntm() {
|
||||||
|
isWipIntmRunning = true; // Set the flag to indicate that WipIntm function is running
|
||||||
|
// Serial.println("Pulse mode!");
|
||||||
|
|
||||||
|
analogWrite(oPWM, 115);
|
||||||
|
digitalWrite(oMAG, LOW);
|
||||||
|
|
||||||
|
while (isWipIntmRunning) {
|
||||||
|
// WipIntm function code
|
||||||
|
int potValue = analogRead(iPot);
|
||||||
|
waitingTime = map(potValue, 0, 4095, 5000, 30000); // Update waiting time based on potentiometer value
|
||||||
|
|
||||||
|
unsigned long currentTime = millis();
|
||||||
|
if (currentTime - previousTime >= waitingTime) {
|
||||||
|
previousTime = currentTime;
|
||||||
|
Serial.println("Wipe...");
|
||||||
|
digitalWrite(oMAG, HIGH);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(oMAG, LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if iPump is pressed during WipIntm
|
||||||
|
int pumpState = digitalRead(iPump);
|
||||||
|
if (pumpState == LOW) {
|
||||||
|
// Serial.println("Pulse and pumping");
|
||||||
|
digitalWrite(oMAG, HIGH); // Keep oMAG on
|
||||||
|
digitalWrite(oPump, HIGH);
|
||||||
|
} else {
|
||||||
|
// Serial.println("Pulse and pump off");
|
||||||
|
digitalWrite(oMAG, LOW); // Turn off oMAG when iPump is released
|
||||||
|
digitalWrite(oPump, LOW);
|
||||||
|
isWipIntmRunning = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// isWipIntmRunning = false; // Reset the flag after the loop ends
|
||||||
|
// Serial.println("Pulse ended...");
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipLo() {
|
||||||
|
// Serial.println("Wipers are in low speed! 40% DutyCycle");
|
||||||
|
analogWrite(oPWM, 102); // Set oPWM to 40% duty cycle
|
||||||
|
digitalWrite(oMAG, HIGH);
|
||||||
|
digitalWrite(oLight, LOW);
|
||||||
|
delay(20);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipHi() {
|
||||||
|
// Serial.println("Wipers are now in high speed! 75% Duty Cycle");
|
||||||
|
analogWrite(oPWM, 200);
|
||||||
|
digitalWrite(oMAG, HIGH);
|
||||||
|
digitalWrite(oLight, HIGH);
|
||||||
|
delay(20);
|
||||||
|
}
|
||||||
132
DINOCOOL_RLY/DINOCOOL_RLY.ino
Normal file
132
DINOCOOL_RLY/DINOCOOL_RLY.ino
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_SH110X.h>
|
||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
|
||||||
|
#define i2c_Address 0x3C // Change this if your OLED has a different I2C address
|
||||||
|
#define SCREEN_WIDTH 128
|
||||||
|
#define SCREEN_HEIGHT 64
|
||||||
|
#define OLED_RESET -1
|
||||||
|
#define ONE_WIRE_BUS1 2 // D2 pin for the first DS18B20 sensor
|
||||||
|
#define ONE_WIRE_BUS2 7 // D7 pin for the second DS18B20 sensor
|
||||||
|
#define FAN1_PIN 3 // D3 pin for FAN1
|
||||||
|
#define FAN2_PIN 4 // D4 pin for FAN2
|
||||||
|
#define OVERRIDE_FAN1_PIN 5 // D5 pin for overriding FAN1 (pulled to ground to activate)
|
||||||
|
#define OVERRIDE_FAN2_PIN 6 // D6 pin for overriding FAN2 (pulled to ground to activate)
|
||||||
|
|
||||||
|
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||||
|
OneWire oneWire1(ONE_WIRE_BUS1);
|
||||||
|
OneWire oneWire2(ONE_WIRE_BUS2);
|
||||||
|
DallasTemperature sensors1(&oneWire1);
|
||||||
|
DallasTemperature sensors2(&oneWire2);
|
||||||
|
|
||||||
|
bool fan1Active = false;
|
||||||
|
bool fan2Active = false;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
|
||||||
|
pinMode(FAN1_PIN, OUTPUT);
|
||||||
|
pinMode(FAN2_PIN, OUTPUT);
|
||||||
|
pinMode(OVERRIDE_FAN1_PIN, INPUT_PULLUP);
|
||||||
|
pinMode(OVERRIDE_FAN2_PIN, INPUT_PULLUP);
|
||||||
|
|
||||||
|
if (!display.begin(i2c_Address)) {
|
||||||
|
Serial.println(F("SH110X allocation failed"));
|
||||||
|
for (;;);
|
||||||
|
}
|
||||||
|
|
||||||
|
sensors1.begin(); // Initialize the first DS18B20 sensor
|
||||||
|
sensors2.begin(); // Initialize the second DS18B20 sensor
|
||||||
|
|
||||||
|
display.display();
|
||||||
|
delay(2000);
|
||||||
|
display.clearDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
// Set text size and color
|
||||||
|
display.setTextSize(1);
|
||||||
|
display.setTextColor(SH110X_WHITE);
|
||||||
|
|
||||||
|
// Read temperatures from both DS18B20 sensors
|
||||||
|
sensors1.requestTemperatures();
|
||||||
|
sensors2.requestTemperatures();
|
||||||
|
float temperatureC1 = sensors1.getTempCByIndex(0);
|
||||||
|
float temperatureC2 = sensors2.getTempCByIndex(0);
|
||||||
|
|
||||||
|
// Display temperatures on the screen in Celsius with one decimal place
|
||||||
|
display.setCursor(10, 10);
|
||||||
|
display.print("Temp1: ");
|
||||||
|
display.print(temperatureC1, 1);
|
||||||
|
display.print(" C");
|
||||||
|
|
||||||
|
display.setCursor(10, 20);
|
||||||
|
display.print("Temp2: ");
|
||||||
|
display.print(temperatureC2, 1);
|
||||||
|
display.print(" C");
|
||||||
|
|
||||||
|
// Calculate average temperature
|
||||||
|
float averageTemperature = (temperatureC1 + temperatureC2) / 2.0;
|
||||||
|
|
||||||
|
// Display average temperature on the screen
|
||||||
|
display.setCursor(10, 30);
|
||||||
|
display.print("Avg Temp: ");
|
||||||
|
display.print(averageTemperature, 1);
|
||||||
|
display.print(" C");
|
||||||
|
|
||||||
|
// Check for override inputs
|
||||||
|
bool overrideFan1 = digitalRead(OVERRIDE_FAN1_PIN) == LOW; // Pulled to ground to activate (active LOW)
|
||||||
|
bool overrideFan2 = digitalRead(OVERRIDE_FAN2_PIN) == LOW; // Pulled to ground to activate (active LOW)
|
||||||
|
|
||||||
|
// Control FANs based on override inputs and temperature thresholds
|
||||||
|
if (overrideFan2) {
|
||||||
|
digitalWrite(FAN1_PIN, HIGH); // Turn ON FAN1
|
||||||
|
digitalWrite(FAN2_PIN, HIGH); // Turn ON FAN2
|
||||||
|
fan1Active = true;
|
||||||
|
fan2Active = true;
|
||||||
|
} else if (overrideFan1) {
|
||||||
|
digitalWrite(FAN1_PIN, HIGH); // Turn ON FAN1
|
||||||
|
fan1Active = true;
|
||||||
|
fan2Active = false; // Deactivate FAN2 if FAN1 override is active
|
||||||
|
} else {
|
||||||
|
// Control FANs based on average temperature threshold
|
||||||
|
if (averageTemperature >= 99.0 && !fan1Active) {
|
||||||
|
digitalWrite(FAN1_PIN, HIGH); // Turn ON FAN1
|
||||||
|
fan1Active = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (averageTemperature >= 106.0 && !fan2Active) {
|
||||||
|
digitalWrite(FAN2_PIN, HIGH); // Turn ON FAN2
|
||||||
|
fan2Active = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (averageTemperature <= 95.0) {
|
||||||
|
digitalWrite(FAN1_PIN, LOW); // Turn OFF FAN1
|
||||||
|
fan1Active = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (averageTemperature <= 99.0) {
|
||||||
|
digitalWrite(FAN2_PIN, LOW); // Turn OFF FAN2
|
||||||
|
fan2Active = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Display FAN status
|
||||||
|
display.setCursor(10, 40);
|
||||||
|
display.print("FAN1: ");
|
||||||
|
display.print(fan1Active || overrideFan1 ? "ON" : "OFF");
|
||||||
|
|
||||||
|
display.setCursor(10, 50);
|
||||||
|
display.print("FAN2: ");
|
||||||
|
display.print(fan2Active || overrideFan2 ? "ON" : "OFF");
|
||||||
|
|
||||||
|
// Update the display
|
||||||
|
display.display();
|
||||||
|
|
||||||
|
// Delay for a while
|
||||||
|
delay(2000);
|
||||||
|
}
|
||||||
190
DINOCOOL_RLY_MK2/DINOCOOL_RLY_MK2.ino
Normal file
190
DINOCOOL_RLY_MK2/DINOCOOL_RLY_MK2.ino
Normal file
@@ -0,0 +1,190 @@
|
|||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_SH110X.h>
|
||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
#include <avr/wdt.h>
|
||||||
|
|
||||||
|
#define i2c_Address 0x3C // Change this if your OLED has a different I2C address
|
||||||
|
#define SCREEN_WIDTH 128
|
||||||
|
#define SCREEN_HEIGHT 64
|
||||||
|
#define OLED_RESET -1
|
||||||
|
#define ONE_WIRE_BUS1 2 // D2 pin for the first DS18B20 sensor
|
||||||
|
#define ONE_WIRE_BUS2 7 // D7 pin for the second DS18B20 sensor
|
||||||
|
#define FAN1_PIN 3 // D3 pin for FAN1
|
||||||
|
#define FAN2_PIN 4 // D4 pin for FAN2
|
||||||
|
#define OVERRIDE_FAN1_PIN 5 // D5 pin for overriding FAN1 (pulled to ground to activate)
|
||||||
|
#define OVERRIDE_FAN2_PIN 6 // D6 pin for overriding FAN2 (pulled to ground to activate)
|
||||||
|
|
||||||
|
// 21 characters wide
|
||||||
|
// 6 down (plus half)
|
||||||
|
|
||||||
|
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||||
|
OneWire oneWire1(ONE_WIRE_BUS1);
|
||||||
|
OneWire oneWire2(ONE_WIRE_BUS2);
|
||||||
|
DallasTemperature sensors1(&oneWire1);
|
||||||
|
DallasTemperature sensors2(&oneWire2);
|
||||||
|
|
||||||
|
bool fan1Active = false;
|
||||||
|
bool fan2Active = false;
|
||||||
|
|
||||||
|
void enableWatchdog() {
|
||||||
|
cli();
|
||||||
|
wdt_reset();
|
||||||
|
MCUSR = WDRF;
|
||||||
|
WDTCSR |= (1 << WDCE) | (1 << WDE);
|
||||||
|
WDTCSR = (1 << WDIE) | (1 << WDP3) | (1 << WDP0); // Interrupt every 8 seconds
|
||||||
|
sei();
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
|
||||||
|
pinMode(FAN1_PIN, OUTPUT);
|
||||||
|
pinMode(FAN2_PIN, OUTPUT);
|
||||||
|
pinMode(OVERRIDE_FAN1_PIN, INPUT_PULLUP);
|
||||||
|
pinMode(OVERRIDE_FAN2_PIN, INPUT_PULLUP);
|
||||||
|
|
||||||
|
if (!display.begin(i2c_Address)) {
|
||||||
|
Serial.println(F("SH110X allocation failed"));
|
||||||
|
for (;;);
|
||||||
|
}
|
||||||
|
|
||||||
|
sensors1.begin(); // Initialize the first DS18B20 sensor
|
||||||
|
sensors2.begin(); // Initialize the second DS18B20 sensor
|
||||||
|
|
||||||
|
enableWatchdog(); // Enable watchdog timer
|
||||||
|
|
||||||
|
display.display();
|
||||||
|
delay(2000);
|
||||||
|
display.clearDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
wdt_reset(); // Reset watchdog timer
|
||||||
|
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
// Set text size and color
|
||||||
|
display.setTextSize(1);
|
||||||
|
display.setTextColor(SH110X_WHITE);
|
||||||
|
|
||||||
|
// Read temperatures from both DS18B20 sensors
|
||||||
|
sensors1.requestTemperatures();
|
||||||
|
sensors2.requestTemperatures();
|
||||||
|
|
||||||
|
float temperatureC1 = sensors1.getTempCByIndex(0);
|
||||||
|
float temperatureC2 = sensors2.getTempCByIndex(0);
|
||||||
|
|
||||||
|
// Validate temperature readings
|
||||||
|
if (isValidTemperature(temperatureC1)) {
|
||||||
|
// Display temperatures on the screen in Celsius with one decimal place
|
||||||
|
display.setCursor(0, 0);
|
||||||
|
display.print("TempClt1: ");
|
||||||
|
display.print(temperatureC1, 1);
|
||||||
|
display.print(" C");
|
||||||
|
} else {
|
||||||
|
display.setCursor(0, 0);
|
||||||
|
display.print("TempClt1: Invalid");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isValidTemperature(temperatureC2)) {
|
||||||
|
display.setCursor(0, 10);
|
||||||
|
display.print("TempClt2: ");
|
||||||
|
display.print(temperatureC2, 1);
|
||||||
|
display.print(" C");
|
||||||
|
} else {
|
||||||
|
display.setCursor(0, 10);
|
||||||
|
display.print("TempClt2: Invalid");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for override inputs
|
||||||
|
bool overrideFan1 = digitalRead(OVERRIDE_FAN1_PIN) == LOW; // Pulled to ground to activate (active LOW)
|
||||||
|
bool overrideFan2 = digitalRead(OVERRIDE_FAN2_PIN) == LOW; // Pulled to ground to activate (active LOW)
|
||||||
|
|
||||||
|
// Control FANs based on override inputs and temperature thresholds
|
||||||
|
if (overrideFan2) {
|
||||||
|
digitalWrite(FAN1_PIN, HIGH); // Turn ON FAN1
|
||||||
|
digitalWrite(FAN2_PIN, HIGH); // Turn ON FAN2
|
||||||
|
fan1Active = true;
|
||||||
|
fan2Active = true;
|
||||||
|
} else if (overrideFan1) {
|
||||||
|
digitalWrite(FAN1_PIN, HIGH); // Turn ON FAN1
|
||||||
|
fan1Active = true;
|
||||||
|
fan2Active = false; // Deactivate FAN2 if FAN1 override is active
|
||||||
|
} else {
|
||||||
|
// Control FANs based on average temperature threshold
|
||||||
|
float averageTemperature = getAverageTemperature(temperatureC1, temperatureC2);
|
||||||
|
|
||||||
|
if (isValidTemperature(averageTemperature)) {
|
||||||
|
display.setCursor(0, 20);
|
||||||
|
display.print("Temp avg: ");
|
||||||
|
display.print(averageTemperature, 1);
|
||||||
|
display.print(" C");
|
||||||
|
|
||||||
|
if (averageTemperature >= 99.0 && !fan1Active) {
|
||||||
|
digitalWrite(FAN1_PIN, HIGH); // Turn ON FAN1
|
||||||
|
fan1Active = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (averageTemperature >= 106.0 && !fan2Active) {
|
||||||
|
digitalWrite(FAN2_PIN, HIGH); // Turn ON FAN2
|
||||||
|
fan2Active = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (averageTemperature <= 95.0) {
|
||||||
|
digitalWrite(FAN1_PIN, LOW); // Turn OFF FAN1
|
||||||
|
fan1Active = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (averageTemperature <= 99.0) {
|
||||||
|
digitalWrite(FAN2_PIN, LOW); // Turn OFF FAN2
|
||||||
|
fan2Active = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
display.setCursor(0, 20);
|
||||||
|
display.print("Temp avg: Invalid");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Display FAN status
|
||||||
|
display.setCursor(0, 30);
|
||||||
|
display.print("FAN1: ");
|
||||||
|
display.print(fan1Active || overrideFan1 ? "ON" : "OFF");
|
||||||
|
|
||||||
|
display.setCursor(64, 30);
|
||||||
|
display.print("FAN2: ");
|
||||||
|
display.print(fan2Active || overrideFan2 ? "ON" : "OFF");
|
||||||
|
|
||||||
|
display.setCursor(45, 55);
|
||||||
|
display.print("PRNDL21");
|
||||||
|
|
||||||
|
// Update the display
|
||||||
|
display.display();
|
||||||
|
|
||||||
|
// Delay for a while
|
||||||
|
delay(2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
float getAverageTemperature(float temp1, float temp2) {
|
||||||
|
// Calculate average temperature
|
||||||
|
if (isValidTemperature(temp1) && isValidTemperature(temp2)) {
|
||||||
|
return (temp1 + temp2) / 2.0;
|
||||||
|
} else if (isValidTemperature(temp1)) {
|
||||||
|
return temp1;
|
||||||
|
} else if (isValidTemperature(temp2)) {
|
||||||
|
return temp2;
|
||||||
|
} else {
|
||||||
|
return -127.0; // Invalid temperature
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isValidTemperature(float temp) {
|
||||||
|
// Check if temperature is within a reasonable range
|
||||||
|
return temp > -100.0 && temp < 150.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ISR(WDT_vect) {
|
||||||
|
// Watchdog Timer interrupt service routine
|
||||||
|
// You can add additional handling here if needed
|
||||||
|
}
|
||||||
195
DINOCOOL_RLY_MK3_OilSense/DINOCOOL_RLY_MK3_OilSense.ino
Normal file
195
DINOCOOL_RLY_MK3_OilSense/DINOCOOL_RLY_MK3_OilSense.ino
Normal file
@@ -0,0 +1,195 @@
|
|||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_SH110X.h>
|
||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
#include <avr/wdt.h>
|
||||||
|
|
||||||
|
#define i2c_Address 0x3C // Change this if your OLED has a different I2C address
|
||||||
|
#define SCREEN_WIDTH 128
|
||||||
|
#define SCREEN_HEIGHT 64
|
||||||
|
#define OLED_RESET -1
|
||||||
|
#define ONE_WIRE_BUS1 2 // D2 pin for the first DS18B20 sensor
|
||||||
|
#define ONE_WIRE_BUS2 7 // D7 pin for the second DS18B20 sensor
|
||||||
|
#define FAN1_PIN 3 // D3 pin for FAN1
|
||||||
|
#define FAN2_PIN 4 // D4 pin for FAN2
|
||||||
|
#define OVERRIDE_FAN1_PIN 5 // D5 pin for overriding FAN1 (pulled to ground to activate)
|
||||||
|
#define OVERRIDE_FAN2_PIN 6 // D6 pin for overriding FAN2 (pulled to ground to activate)
|
||||||
|
|
||||||
|
// 21 characters wide
|
||||||
|
// 6 down (plus half)
|
||||||
|
|
||||||
|
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||||
|
OneWire oneWire1(ONE_WIRE_BUS1);
|
||||||
|
OneWire oneWire2(ONE_WIRE_BUS2);
|
||||||
|
DallasTemperature sensors1(&oneWire1);
|
||||||
|
DallasTemperature sensors2(&oneWire2);
|
||||||
|
|
||||||
|
bool fan1Active = false;
|
||||||
|
bool fan2Active = false;
|
||||||
|
|
||||||
|
void enableWatchdog() {
|
||||||
|
cli();
|
||||||
|
wdt_reset();
|
||||||
|
MCUSR = WDRF;
|
||||||
|
WDTCSR |= (1 << WDCE) | (1 << WDE);
|
||||||
|
WDTCSR = (1 << WDIE) | (1 << WDP3) | (1 << WDP0); // Interrupt every 8 seconds
|
||||||
|
sei();
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
|
||||||
|
pinMode(FAN1_PIN, OUTPUT);
|
||||||
|
pinMode(FAN2_PIN, OUTPUT);
|
||||||
|
pinMode(OVERRIDE_FAN1_PIN, INPUT_PULLUP);
|
||||||
|
pinMode(OVERRIDE_FAN2_PIN, INPUT_PULLUP);
|
||||||
|
|
||||||
|
if (!display.begin(i2c_Address)) {
|
||||||
|
Serial.println(F("SH110X allocation failed"));
|
||||||
|
for (;;);
|
||||||
|
}
|
||||||
|
|
||||||
|
sensors1.begin(); // Initialize the first DS18B20 sensor
|
||||||
|
sensors2.begin(); // Initialize the second DS18B20 sensor
|
||||||
|
|
||||||
|
enableWatchdog(); // Enable watchdog timer
|
||||||
|
|
||||||
|
display.display();
|
||||||
|
delay(2000);
|
||||||
|
display.clearDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
wdt_reset(); // Reset watchdog timer
|
||||||
|
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
// Set text size and color
|
||||||
|
display.setTextSize(1);
|
||||||
|
display.setTextColor(SH110X_WHITE);
|
||||||
|
|
||||||
|
// Read temperatures from both DS18B20 sensors
|
||||||
|
sensors1.requestTemperatures();
|
||||||
|
sensors2.requestTemperatures();
|
||||||
|
|
||||||
|
float temperatureC1 = sensors1.getTempCByIndex(0);
|
||||||
|
float temperatureC2 = sensors2.getTempCByIndex(0);
|
||||||
|
|
||||||
|
// Validate temperature readings
|
||||||
|
if (isValidTemperature(temperatureC1)) {
|
||||||
|
// Display temperatures on the screen in Celsius with one decimal place
|
||||||
|
display.setCursor(0, 0);
|
||||||
|
display.print("TempClt1: ");
|
||||||
|
display.print(temperatureC1, 1);
|
||||||
|
display.print(" C");
|
||||||
|
} else {
|
||||||
|
display.setCursor(0, 0);
|
||||||
|
display.print("TempClt1: Invalid");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isValidTemperature(temperatureC2)) {
|
||||||
|
display.setCursor(0, 10);
|
||||||
|
display.print("TempClt2: ");
|
||||||
|
display.print(temperatureC2, 1);
|
||||||
|
display.print(" C");
|
||||||
|
} else {
|
||||||
|
display.setCursor(0, 10);
|
||||||
|
display.print("TempClt2: Invalid");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for override inputs
|
||||||
|
bool overrideFan1 = digitalRead(OVERRIDE_FAN1_PIN) == LOW; // Pulled to ground to activate (active LOW)
|
||||||
|
bool overrideFan2 = digitalRead(OVERRIDE_FAN2_PIN) == LOW; // Pulled to ground to activate (active LOW)
|
||||||
|
|
||||||
|
// Control FANs based on override inputs and temperature thresholds
|
||||||
|
if (overrideFan2) {
|
||||||
|
digitalWrite(FAN1_PIN, HIGH); // Turn ON FAN1
|
||||||
|
digitalWrite(FAN2_PIN, HIGH); // Turn ON FAN2
|
||||||
|
fan1Active = true;
|
||||||
|
fan2Active = true;
|
||||||
|
} else if (overrideFan1) {
|
||||||
|
digitalWrite(FAN1_PIN, HIGH); // Turn ON FAN1
|
||||||
|
fan1Active = true;
|
||||||
|
fan2Active = false; // Deactivate FAN2 if FAN1 override is active
|
||||||
|
} else {
|
||||||
|
// Control FANs based on average temperature threshold
|
||||||
|
float averageTemperature = getAverageTemperature(temperatureC1, temperatureC2);
|
||||||
|
|
||||||
|
if (isValidTemperature(averageTemperature)) {
|
||||||
|
display.setCursor(0, 20);
|
||||||
|
display.print("Temp avg: ");
|
||||||
|
display.print(averageTemperature, 1);
|
||||||
|
display.print(" C");
|
||||||
|
|
||||||
|
if (averageTemperature >= 99.0 && !fan1Active) {
|
||||||
|
digitalWrite(FAN1_PIN, HIGH); // Turn ON FAN1
|
||||||
|
fan1Active = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (averageTemperature >= 106.0 && !fan2Active) {
|
||||||
|
digitalWrite(FAN2_PIN, HIGH); // Turn ON FAN2
|
||||||
|
fan2Active = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (averageTemperature <= 95.0) {
|
||||||
|
digitalWrite(FAN1_PIN, LOW); // Turn OFF FAN1
|
||||||
|
fan1Active = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (averageTemperature <= 99.0) {
|
||||||
|
digitalWrite(FAN2_PIN, LOW); // Turn OFF FAN2
|
||||||
|
fan2Active = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
display.setCursor(0, 20);
|
||||||
|
display.print("Temp avg: Invalid");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Display FAN status
|
||||||
|
display.setCursor(0, 30);
|
||||||
|
display.print("FAN1: ");
|
||||||
|
display.print(fan1Active || overrideFan1 ? "ON" : "OFF");
|
||||||
|
|
||||||
|
display.setCursor(64, 30);
|
||||||
|
display.print("FAN2: ");
|
||||||
|
display.print(fan2Active || overrideFan2 ? "ON" : "OFF");
|
||||||
|
|
||||||
|
display.setCursor(0,40);
|
||||||
|
display.print("OilP 5.53b");
|
||||||
|
display.setCursor(64, 40);
|
||||||
|
display.print("OilT 87 C");
|
||||||
|
|
||||||
|
display.setCursor(45, 55);
|
||||||
|
display.print("PRNDL21");
|
||||||
|
|
||||||
|
// Update the display
|
||||||
|
display.display();
|
||||||
|
|
||||||
|
// Delay for a while
|
||||||
|
delay(2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
float getAverageTemperature(float temp1, float temp2) {
|
||||||
|
// Calculate average temperature
|
||||||
|
if (isValidTemperature(temp1) && isValidTemperature(temp2)) {
|
||||||
|
return (temp1 + temp2) / 2.0;
|
||||||
|
} else if (isValidTemperature(temp1)) {
|
||||||
|
return temp1;
|
||||||
|
} else if (isValidTemperature(temp2)) {
|
||||||
|
return temp2;
|
||||||
|
} else {
|
||||||
|
return -127.0; // Invalid temperature
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isValidTemperature(float temp) {
|
||||||
|
// Check if temperature is within a reasonable range
|
||||||
|
return temp > -100.0 && temp < 150.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ISR(WDT_vect) {
|
||||||
|
// Watchdog Timer interrupt service routine
|
||||||
|
// You can add additional handling here if needed
|
||||||
|
}
|
||||||
@@ -0,0 +1,241 @@
|
|||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_SH110X.h>
|
||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
#include <avr/wdt.h>
|
||||||
|
|
||||||
|
#define i2c_Address 0x3C // Change this if your OLED has a different I2C address
|
||||||
|
#define SCREEN_WIDTH 128
|
||||||
|
#define SCREEN_HEIGHT 64
|
||||||
|
#define OLED_RESET -1
|
||||||
|
#define ONE_WIRE_BUS1 2 // D2 pin for the first DS18B20 sensor
|
||||||
|
#define ONE_WIRE_BUS2 7 // D7 pin for the second DS18B20 sensor
|
||||||
|
#define FAN1_PIN 3 // D3 pin for FAN1
|
||||||
|
#define FAN2_PIN 4 // D4 pin for FAN2
|
||||||
|
#define OVERRIDE_FAN1_PIN 5 // D5 pin for overriding FAN1 (pulled to ground to activate)
|
||||||
|
#define OVERRIDE_FAN2_PIN 6 // D6 pin for overriding FAN2 (pulled to ground to activate)
|
||||||
|
|
||||||
|
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||||
|
OneWire oneWire1(ONE_WIRE_BUS1);
|
||||||
|
OneWire oneWire2(ONE_WIRE_BUS2);
|
||||||
|
DallasTemperature sensors1(&oneWire1);
|
||||||
|
DallasTemperature sensors2(&oneWire2);
|
||||||
|
|
||||||
|
bool fan1Active = false;
|
||||||
|
bool fan2Active = false;
|
||||||
|
|
||||||
|
float pressure = 0.0;
|
||||||
|
float temperature = 0.0;
|
||||||
|
|
||||||
|
int M3200address = 0x28; // 0x28, 0x36 or 0x46, depending on the sensor.
|
||||||
|
float maxPressure = 100; // pressure in PSI for this sensor, 100, 250, 500, ... 10k.
|
||||||
|
byte status;
|
||||||
|
|
||||||
|
unsigned long pressureMillis = 0;
|
||||||
|
const int pressureTiming = 500; // 500ms every data acquisition
|
||||||
|
|
||||||
|
void enableWatchdog() {
|
||||||
|
cli();
|
||||||
|
asm volatile("wdr");
|
||||||
|
MCUSR = 0;
|
||||||
|
WDTCSR |= (1 << WDCE) | (1 << WDE);
|
||||||
|
WDTCSR = (1 << WDIE) | (1 << WDP3) | (1 << WDP0); // Interrupt every 8 seconds
|
||||||
|
sei();
|
||||||
|
}
|
||||||
|
|
||||||
|
void fanControl(float averageTemperature) {
|
||||||
|
if (averageTemperature >= 99.0 && !fan1Active) {
|
||||||
|
digitalWrite(FAN1_PIN, HIGH); // Turn ON FAN1
|
||||||
|
fan1Active = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (averageTemperature >= 106.0 && !fan2Active) {
|
||||||
|
digitalWrite(FAN2_PIN, HIGH); // Turn ON FAN2
|
||||||
|
fan2Active = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (averageTemperature <= 95.0) {
|
||||||
|
digitalWrite(FAN1_PIN, LOW); // Turn OFF FAN1
|
||||||
|
fan1Active = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (averageTemperature <= 99.0) {
|
||||||
|
digitalWrite(FAN2_PIN, LOW); // Turn OFF FAN2
|
||||||
|
fan2Active = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayError(const char *message) {
|
||||||
|
display.setCursor(0, 20);
|
||||||
|
display.print(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
|
||||||
|
pinMode(FAN1_PIN, OUTPUT);
|
||||||
|
pinMode(FAN2_PIN, OUTPUT);
|
||||||
|
pinMode(OVERRIDE_FAN1_PIN, INPUT_PULLUP);
|
||||||
|
pinMode(OVERRIDE_FAN2_PIN, INPUT_PULLUP);
|
||||||
|
|
||||||
|
if (!display.begin(i2c_Address)) {
|
||||||
|
Serial.println(F("SH110X allocation failed"));
|
||||||
|
for (;;);
|
||||||
|
}
|
||||||
|
|
||||||
|
sensors1.begin(); // Initialize the first DS18B20 sensor
|
||||||
|
sensors2.begin(); // Initialize the second DS18B20 sensor
|
||||||
|
|
||||||
|
enableWatchdog(); // Enable watchdog timer
|
||||||
|
|
||||||
|
display.display();
|
||||||
|
delay(2000);
|
||||||
|
display.clearDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
wdt_reset(); // Reset watchdog timer
|
||||||
|
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
// Set text size and color
|
||||||
|
display.setTextSize(1);
|
||||||
|
display.setTextColor(SH110X_WHITE);
|
||||||
|
|
||||||
|
// Read temperatures from both DS18B20 sensors
|
||||||
|
sensors1.requestTemperatures();
|
||||||
|
sensors2.requestTemperatures();
|
||||||
|
|
||||||
|
float temperatureC1 = sensors1.getTempCByIndex(0);
|
||||||
|
float temperatureC2 = sensors2.getTempCByIndex(0);
|
||||||
|
|
||||||
|
// Validate temperature readings
|
||||||
|
if (isValidTemperature(temperatureC1)) {
|
||||||
|
// Display temperatures on the screen in Celsius with one decimal place
|
||||||
|
display.setCursor(0, 0);
|
||||||
|
display.print("TempCl1: ");
|
||||||
|
display.print(temperatureC1, 1);
|
||||||
|
display.print(" C");
|
||||||
|
} else {
|
||||||
|
displayError("TempCl1: Invalid");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isValidTemperature(temperatureC2)) {
|
||||||
|
display.setCursor(0, 10);
|
||||||
|
display.print("TempCl2: ");
|
||||||
|
display.print(temperatureC2, 1);
|
||||||
|
display.print(" C");
|
||||||
|
} else {
|
||||||
|
displayError("TempClt2: Invalid");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for override inputs
|
||||||
|
bool overrideFan1 = digitalRead(OVERRIDE_FAN1_PIN) == LOW; // Pulled to ground to activate (active LOW)
|
||||||
|
bool overrideFan2 = digitalRead(OVERRIDE_FAN2_PIN) == LOW; // Pulled to ground to activate (active LOW)
|
||||||
|
|
||||||
|
// Control FANs based on override inputs and temperature thresholds
|
||||||
|
if (overrideFan2) {
|
||||||
|
digitalWrite(FAN1_PIN, HIGH); // Turn ON FAN1
|
||||||
|
digitalWrite(FAN2_PIN, HIGH); // Turn ON FAN2
|
||||||
|
fan1Active = true;
|
||||||
|
fan2Active = true;
|
||||||
|
} else if (overrideFan1) {
|
||||||
|
digitalWrite(FAN1_PIN, HIGH); // Turn ON FAN1
|
||||||
|
fan1Active = true;
|
||||||
|
fan2Active = false; // Deactivate FAN2 if FAN1 override is active
|
||||||
|
} else {
|
||||||
|
// Control FANs based on average temperature threshold
|
||||||
|
float averageTemperature = getAverageTemperature(temperatureC1, temperatureC2);
|
||||||
|
|
||||||
|
if (isValidTemperature(averageTemperature)) {
|
||||||
|
display.setCursor(0, 20);
|
||||||
|
display.print("TempA: ");
|
||||||
|
display.print(averageTemperature, 1);
|
||||||
|
display.print(" C");
|
||||||
|
|
||||||
|
fanControl(averageTemperature);
|
||||||
|
} else {
|
||||||
|
displayError("Temp avg: Invalid");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Display FAN status
|
||||||
|
display.setCursor(0, 30);
|
||||||
|
display.print("FAN1: ");
|
||||||
|
display.print(fan1Active || overrideFan1 ? "ON" : "OFF");
|
||||||
|
|
||||||
|
display.setCursor(64, 30);
|
||||||
|
display.print("FAN2: ");
|
||||||
|
display.print(fan2Active || overrideFan2 ? "ON" : "OFF");
|
||||||
|
|
||||||
|
// Read data from the M3200 sensor
|
||||||
|
readM3200Sensor();
|
||||||
|
|
||||||
|
// Display M3200 sensor data
|
||||||
|
display.setCursor(0, 40);
|
||||||
|
display.print("OilP: ");
|
||||||
|
display.print(pressure, 1);
|
||||||
|
display.print(" PSI");
|
||||||
|
|
||||||
|
display.setCursor(0, 50);
|
||||||
|
display.print("Temp: ");
|
||||||
|
display.print(temperature);
|
||||||
|
display.print(" C");
|
||||||
|
|
||||||
|
// Update the display
|
||||||
|
display.display();
|
||||||
|
|
||||||
|
// Delay for a while
|
||||||
|
delay(2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
void readM3200Sensor() {
|
||||||
|
Wire.requestFrom(M3200address, 4); // request 4 bytes
|
||||||
|
int n = Wire.available();
|
||||||
|
if (n == 4) {
|
||||||
|
status = 0;
|
||||||
|
uint16_t rawP; // pressure data from sensor
|
||||||
|
uint16_t rawT; // temperature data from sensor
|
||||||
|
rawP = (uint16_t)Wire.read(); // upper 8 bits
|
||||||
|
rawP <<= 8;
|
||||||
|
rawP |= (uint16_t)Wire.read(); // lower 8 bits
|
||||||
|
rawT = (uint16_t)Wire.read(); // upper 8 bits
|
||||||
|
rawT <<= 8;
|
||||||
|
rawT |= (uint16_t)Wire.read(); // lower 8 bits
|
||||||
|
|
||||||
|
status = rawP >> 14; // The status is 0, 1, 2 or 3
|
||||||
|
rawP &= 0x3FFF; // keep 14 bits, remove status bits
|
||||||
|
|
||||||
|
rawT >>= 5; // the lowest 5 bits are not used
|
||||||
|
|
||||||
|
// The math could be done with integers, but I choose float for now
|
||||||
|
pressure = ((rawP - 1000.0) / (15000.0 - 1000.0)) * maxPressure;
|
||||||
|
temperature = ((rawT - 512.0) / (1075.0 - 512.0)) * 55.0;
|
||||||
|
} else {
|
||||||
|
displayError("M3200 Pressure Transducer not Detected");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
float getAverageTemperature(float temp1, float temp2) {
|
||||||
|
// Calculate average temperature
|
||||||
|
if (isValidTemperature(temp1) && isValidTemperature(temp2)) {
|
||||||
|
return (temp1 + temp2) / 2.0;
|
||||||
|
} else if (isValidTemperature(temp1)) {
|
||||||
|
return temp1;
|
||||||
|
} else if (isValidTemperature(temp2)) {
|
||||||
|
return temp2;
|
||||||
|
} else {
|
||||||
|
return -127.0; // Invalid temperature
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isValidTemperature(float temp) {
|
||||||
|
// Check if temperature is within a reasonable range
|
||||||
|
return temp > -100.0 && temp < 150.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ISR(WDT_vect) {
|
||||||
|
// Watchdog Timer interrupt service routine
|
||||||
|
// You can add additional handling here if needed
|
||||||
|
}
|
||||||
@@ -0,0 +1,227 @@
|
|||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_SH110X.h>
|
||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
#include <esp_task_wdt.h>
|
||||||
|
|
||||||
|
#define i2c_Address 0x3C // Change this if your OLED has a different I2C address
|
||||||
|
#define SCREEN_WIDTH 128
|
||||||
|
#define SCREEN_HEIGHT 64
|
||||||
|
#define OLED_RESET -1
|
||||||
|
#define ONE_WIRE_BUS1 2 // D2 pin for the first DS18B20 sensor
|
||||||
|
#define ONE_WIRE_BUS2 7 // D7 pin for the second DS18B20 sensor
|
||||||
|
#define FAN1_PIN 5 // D3 pin for FAN1
|
||||||
|
#define FAN2_PIN 6 // D4 pin for FAN2
|
||||||
|
#define OVERRIDE_FAN1_PIN 9 // D5 pin for overriding FAN1 (pulled to ground to activate)
|
||||||
|
#define OVERRIDE_FAN2_PIN 10 // D6 pin for overriding FAN2 (pulled to ground to activate)
|
||||||
|
|
||||||
|
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||||
|
OneWire oneWire1(ONE_WIRE_BUS1);
|
||||||
|
OneWire oneWire2(ONE_WIRE_BUS2);
|
||||||
|
DallasTemperature sensors1(&oneWire1);
|
||||||
|
DallasTemperature sensors2(&oneWire2);
|
||||||
|
|
||||||
|
bool fan1Active = false;
|
||||||
|
bool fan2Active = false;
|
||||||
|
|
||||||
|
float pressure = 0.0;
|
||||||
|
float temperature = 0.0;
|
||||||
|
|
||||||
|
int M3200address = 0x28; // 0x28, 0x36 or 0x46, depending on the sensor.
|
||||||
|
float maxPressure = 100; // pressure in PSI for this sensor, 100, 250, 500, ... 10k.
|
||||||
|
byte status;
|
||||||
|
|
||||||
|
unsigned long pressureMillis = 0;
|
||||||
|
const int pressureTiming = 500; // 500ms every data acquisition
|
||||||
|
|
||||||
|
void fanControl(float averageTemperature) {
|
||||||
|
if (averageTemperature >= 99.0 && !fan1Active) {
|
||||||
|
digitalWrite(FAN1_PIN, HIGH); // Turn ON FAN1
|
||||||
|
fan1Active = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (averageTemperature >= 106.0 && !fan2Active) {
|
||||||
|
digitalWrite(FAN2_PIN, HIGH); // Turn ON FAN2
|
||||||
|
fan2Active = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (averageTemperature <= 95.0) {
|
||||||
|
digitalWrite(FAN1_PIN, LOW); // Turn OFF FAN1
|
||||||
|
fan1Active = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (averageTemperature <= 99.0) {
|
||||||
|
digitalWrite(FAN2_PIN, LOW); // Turn OFF FAN2
|
||||||
|
fan2Active = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayError(const char *message) {
|
||||||
|
display.setCursor(0, 20);
|
||||||
|
display.print(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
|
||||||
|
pinMode(LED_BUILTIN, OUTPUT);
|
||||||
|
|
||||||
|
pinMode(FAN1_PIN, OUTPUT);
|
||||||
|
pinMode(FAN2_PIN, OUTPUT);
|
||||||
|
pinMode(OVERRIDE_FAN1_PIN, INPUT_PULLUP);
|
||||||
|
pinMode(OVERRIDE_FAN2_PIN, INPUT_PULLUP);
|
||||||
|
|
||||||
|
if (!display.begin(i2c_Address)) {
|
||||||
|
Serial.println(F("SH110X allocation failed"));
|
||||||
|
for (;;);
|
||||||
|
}
|
||||||
|
|
||||||
|
sensors1.begin(); // Initialize the first DS18B20 sensor
|
||||||
|
sensors2.begin(); // Initialize the second DS18B20 sensor
|
||||||
|
|
||||||
|
display.display();
|
||||||
|
delay(2000);
|
||||||
|
display.clearDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
digitalWrite(LED_BUILTIN, HIGH);
|
||||||
|
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
// Set text size and color
|
||||||
|
display.setTextSize(1);
|
||||||
|
display.setTextColor(SH110X_WHITE);
|
||||||
|
|
||||||
|
// Read temperatures from both DS18B20 sensors
|
||||||
|
sensors1.requestTemperatures();
|
||||||
|
sensors2.requestTemperatures();
|
||||||
|
|
||||||
|
float temperatureC1 = sensors1.getTempCByIndex(0);
|
||||||
|
float temperatureC2 = sensors2.getTempCByIndex(0);
|
||||||
|
|
||||||
|
// Validate temperature readings
|
||||||
|
if (isValidTemperature(temperatureC1)) {
|
||||||
|
// Display temperatures on the screen in Celsius with one decimal place
|
||||||
|
display.setCursor(0, 0);
|
||||||
|
display.print("Clt1 Temp: ");
|
||||||
|
display.print(temperatureC1, 1);
|
||||||
|
display.print(" C");
|
||||||
|
} else {
|
||||||
|
displayError("Clt1 Temp: Invalid");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isValidTemperature(temperatureC2)) {
|
||||||
|
display.setCursor(0, 10);
|
||||||
|
display.print("Clt2 Temp: ");
|
||||||
|
display.print(temperatureC2, 1);
|
||||||
|
display.print(" C");
|
||||||
|
} else {
|
||||||
|
displayError("Clt2 Temp: Invalid");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for override inputs
|
||||||
|
bool overrideFan1 = digitalRead(OVERRIDE_FAN1_PIN) == LOW; // Pulled to ground to activate (active LOW)
|
||||||
|
bool overrideFan2 = digitalRead(OVERRIDE_FAN2_PIN) == LOW; // Pulled to ground to activate (active LOW)
|
||||||
|
|
||||||
|
// Control FANs based on override inputs and temperature thresholds
|
||||||
|
if (overrideFan2) {
|
||||||
|
digitalWrite(FAN1_PIN, HIGH); // Turn ON FAN1
|
||||||
|
digitalWrite(FAN2_PIN, HIGH); // Turn ON FAN2
|
||||||
|
fan1Active = true;
|
||||||
|
fan2Active = true;
|
||||||
|
} else if (overrideFan1) {
|
||||||
|
digitalWrite(FAN1_PIN, HIGH); // Turn ON FAN1
|
||||||
|
fan1Active = true;
|
||||||
|
fan2Active = false; // Deactivate FAN2 if FAN1 override is active
|
||||||
|
} else {
|
||||||
|
// Control FANs based on average temperature threshold
|
||||||
|
float averageTemperature = getAverageTemperature(temperatureC1, temperatureC2);
|
||||||
|
|
||||||
|
if (isValidTemperature(averageTemperature)) {
|
||||||
|
display.setCursor(0, 20);
|
||||||
|
display.print("CltAvgTmp: ");
|
||||||
|
display.print(averageTemperature, 1);
|
||||||
|
display.print(" C");
|
||||||
|
|
||||||
|
fanControl(averageTemperature);
|
||||||
|
} else {
|
||||||
|
displayError("CltAvgTmp: Invalid");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Display FAN status
|
||||||
|
display.setCursor(0, 30);
|
||||||
|
display.print("FAN1: ");
|
||||||
|
display.print(fan1Active || overrideFan1 ? "ON" : "OFF");
|
||||||
|
|
||||||
|
display.setCursor(64, 30);
|
||||||
|
display.print("FAN2: ");
|
||||||
|
display.print(fan2Active || overrideFan2 ? "ON" : "OFF");
|
||||||
|
|
||||||
|
// Read data from the M3200 sensor
|
||||||
|
readM3200Sensor();
|
||||||
|
|
||||||
|
// Display M3200 sensor data
|
||||||
|
display.setCursor(0, 43);
|
||||||
|
display.print("Oil Pres: ");
|
||||||
|
display.print(pressure, 1);
|
||||||
|
display.print(" PSI");
|
||||||
|
|
||||||
|
display.setCursor(0, 53);
|
||||||
|
display.print("Oil Temp: ");
|
||||||
|
display.print(temperature);
|
||||||
|
display.print(" C");
|
||||||
|
|
||||||
|
// Update the display
|
||||||
|
display.display();
|
||||||
|
|
||||||
|
// Delay for a while
|
||||||
|
delay(2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
void readM3200Sensor() {
|
||||||
|
Wire.requestFrom(M3200address, 4); // request 4 bytes
|
||||||
|
int n = Wire.available();
|
||||||
|
if (n == 4) {
|
||||||
|
status = 0;
|
||||||
|
uint16_t rawP; // pressure data from sensor
|
||||||
|
uint16_t rawT; // temperature data from sensor
|
||||||
|
rawP = (uint16_t)Wire.read(); // upper 8 bits
|
||||||
|
rawP <<= 8;
|
||||||
|
rawP |= (uint16_t)Wire.read(); // lower 8 bits
|
||||||
|
rawT = (uint16_t)Wire.read(); // upper 8 bits
|
||||||
|
rawT <<= 8;
|
||||||
|
rawT |= (uint16_t)Wire.read(); // lower 8 bits
|
||||||
|
|
||||||
|
status = rawP >> 14; // The status is 0, 1, 2 or 3
|
||||||
|
rawP &= 0x3FFF; // keep 14 bits, remove status bits
|
||||||
|
|
||||||
|
rawT >>= 5; // the lowest 5 bits are not used
|
||||||
|
|
||||||
|
// The math could be done with integers, but I choose float for now
|
||||||
|
pressure = ((rawP - 1000.0) / (15000.0 - 1000.0)) * maxPressure;
|
||||||
|
temperature = ((rawT - 512.0) / (1075.0 - 512.0)) * 55.0;
|
||||||
|
} else {
|
||||||
|
displayError("M3200 Pressure Transducer not Detected");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
float getAverageTemperature(float temp1, float temp2) {
|
||||||
|
// Calculate average temperature
|
||||||
|
if (isValidTemperature(temp1) && isValidTemperature(temp2)) {
|
||||||
|
return (temp1 + temp2) / 2.0;
|
||||||
|
} else if (isValidTemperature(temp1)) {
|
||||||
|
return temp1;
|
||||||
|
} else if (isValidTemperature(temp2)) {
|
||||||
|
return temp2;
|
||||||
|
} else {
|
||||||
|
return -127.0; // Invalid temperature
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isValidTemperature(float temp) {
|
||||||
|
// Check if temperature is within a reasonable range
|
||||||
|
return temp > -100.0 && temp < 150.0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,227 @@
|
|||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_SH110X.h>
|
||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
#include <esp_task_wdt.h>
|
||||||
|
|
||||||
|
#define i2c_Address 0x3C // Change this if your OLED has a different I2C address
|
||||||
|
#define SCREEN_WIDTH 128
|
||||||
|
#define SCREEN_HEIGHT 64
|
||||||
|
#define OLED_RESET -1
|
||||||
|
#define ONE_WIRE_BUS1 2 // D2 pin for the first DS18B20 sensor
|
||||||
|
#define ONE_WIRE_BUS2 7 // D7 pin for the second DS18B20 sensor
|
||||||
|
#define FAN1_PIN 5 // D3 pin for FAN1
|
||||||
|
#define FAN2_PIN 6 // D4 pin for FAN2
|
||||||
|
#define OVERRIDE_FAN1_PIN 9 // D5 pin for overriding FAN1 (pulled to ground to activate)
|
||||||
|
#define OVERRIDE_FAN2_PIN 10 // D6 pin for overriding FAN2 (pulled to ground to activate)
|
||||||
|
|
||||||
|
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||||
|
OneWire oneWire1(ONE_WIRE_BUS1);
|
||||||
|
OneWire oneWire2(ONE_WIRE_BUS2);
|
||||||
|
DallasTemperature sensors1(&oneWire1);
|
||||||
|
DallasTemperature sensors2(&oneWire2);
|
||||||
|
|
||||||
|
bool fan1Active = false;
|
||||||
|
bool fan2Active = false;
|
||||||
|
|
||||||
|
float pressure = 0.0;
|
||||||
|
float temperature = 0.0;
|
||||||
|
|
||||||
|
int M3200address = 0x28; // 0x28, 0x36 or 0x46, depending on the sensor.
|
||||||
|
float maxPressure = 100; // pressure in PSI for this sensor, 100, 250, 500, ... 10k.
|
||||||
|
byte status;
|
||||||
|
|
||||||
|
unsigned long pressureMillis = 0;
|
||||||
|
const int pressureTiming = 500; // 500ms every data acquisition
|
||||||
|
|
||||||
|
void fanControl(float averageTemperature) {
|
||||||
|
if (averageTemperature >= 99.0 && !fan1Active) {
|
||||||
|
digitalWrite(FAN1_PIN, HIGH); // Turn ON FAN1
|
||||||
|
fan1Active = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (averageTemperature >= 106.0 && !fan2Active) {
|
||||||
|
digitalWrite(FAN2_PIN, HIGH); // Turn ON FAN2
|
||||||
|
fan2Active = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (averageTemperature <= 95.0) {
|
||||||
|
digitalWrite(FAN1_PIN, LOW); // Turn OFF FAN1
|
||||||
|
fan1Active = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (averageTemperature <= 99.0) {
|
||||||
|
digitalWrite(FAN2_PIN, LOW); // Turn OFF FAN2
|
||||||
|
fan2Active = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayError(const char *message) {
|
||||||
|
display.setCursor(0, 20);
|
||||||
|
display.print(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
|
||||||
|
pinMode(LED_BUILTIN, OUTPUT);
|
||||||
|
|
||||||
|
pinMode(FAN1_PIN, OUTPUT);
|
||||||
|
pinMode(FAN2_PIN, OUTPUT);
|
||||||
|
pinMode(OVERRIDE_FAN1_PIN, INPUT_PULLUP);
|
||||||
|
pinMode(OVERRIDE_FAN2_PIN, INPUT_PULLUP);
|
||||||
|
|
||||||
|
if (!display.begin(i2c_Address)) {
|
||||||
|
Serial.println(F("SH110X allocation failed"));
|
||||||
|
for (;;);
|
||||||
|
}
|
||||||
|
|
||||||
|
sensors1.begin(); // Initialize the first DS18B20 sensor
|
||||||
|
sensors2.begin(); // Initialize the second DS18B20 sensor
|
||||||
|
|
||||||
|
display.display();
|
||||||
|
delay(2000);
|
||||||
|
display.clearDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
digitalWrite(LED_BUILTIN, HIGH);
|
||||||
|
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
// Set text size and color
|
||||||
|
display.setTextSize(1);
|
||||||
|
display.setTextColor(SH110X_WHITE);
|
||||||
|
|
||||||
|
// Read temperatures from both DS18B20 sensors
|
||||||
|
sensors1.requestTemperatures();
|
||||||
|
sensors2.requestTemperatures();
|
||||||
|
|
||||||
|
float temperatureC1 = sensors1.getTempCByIndex(0);
|
||||||
|
float temperatureC2 = sensors2.getTempCByIndex(0);
|
||||||
|
|
||||||
|
// Validate temperature readings
|
||||||
|
if (isValidTemperature(temperatureC1)) {
|
||||||
|
// Display temperatures on the screen in Celsius with one decimal place
|
||||||
|
display.setCursor(0, 0);
|
||||||
|
display.print("Clt1 Temp: ");
|
||||||
|
display.print(temperatureC1, 1);
|
||||||
|
display.print(" C");
|
||||||
|
} else {
|
||||||
|
displayError("Clt1 Temp: Invalid");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isValidTemperature(temperatureC2)) {
|
||||||
|
display.setCursor(0, 10);
|
||||||
|
display.print("Clt2 Temp: ");
|
||||||
|
display.print(temperatureC2, 1);
|
||||||
|
display.print(" C");
|
||||||
|
} else {
|
||||||
|
displayError("Clt2 Temp: Invalid");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for override inputs
|
||||||
|
bool overrideFan1 = digitalRead(OVERRIDE_FAN1_PIN) == LOW; // Pulled to ground to activate (active LOW)
|
||||||
|
bool overrideFan2 = digitalRead(OVERRIDE_FAN2_PIN) == LOW; // Pulled to ground to activate (active LOW)
|
||||||
|
|
||||||
|
// Control FANs based on override inputs and temperature thresholds
|
||||||
|
if (overrideFan2) {
|
||||||
|
digitalWrite(FAN1_PIN, HIGH); // Turn ON FAN1
|
||||||
|
digitalWrite(FAN2_PIN, HIGH); // Turn ON FAN2
|
||||||
|
fan1Active = true;
|
||||||
|
fan2Active = true;
|
||||||
|
} else if (overrideFan1) {
|
||||||
|
digitalWrite(FAN1_PIN, HIGH); // Turn ON FAN1
|
||||||
|
fan1Active = true;
|
||||||
|
fan2Active = false; // Deactivate FAN2 if FAN1 override is active
|
||||||
|
} else {
|
||||||
|
// Control FANs based on average temperature threshold
|
||||||
|
float averageTemperature = getAverageTemperature(temperatureC1, temperatureC2);
|
||||||
|
|
||||||
|
if (isValidTemperature(averageTemperature)) {
|
||||||
|
display.setCursor(0, 20);
|
||||||
|
display.print("CltAvgTmp: ");
|
||||||
|
display.print(averageTemperature, 1);
|
||||||
|
display.print(" C");
|
||||||
|
|
||||||
|
fanControl(averageTemperature);
|
||||||
|
} else {
|
||||||
|
displayError("CltAvgTmp: Invalid");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Display FAN status
|
||||||
|
display.setCursor(0, 30);
|
||||||
|
display.print("FAN1: ");
|
||||||
|
display.print(fan1Active || overrideFan1 ? "ON" : "OFF");
|
||||||
|
|
||||||
|
display.setCursor(64, 30);
|
||||||
|
display.print("FAN2: ");
|
||||||
|
display.print(fan2Active || overrideFan2 ? "ON" : "OFF");
|
||||||
|
|
||||||
|
// Read data from the M3200 sensor
|
||||||
|
readM3200Sensor();
|
||||||
|
|
||||||
|
// Display M3200 sensor data
|
||||||
|
display.setCursor(0, 43);
|
||||||
|
display.print("Oil Pres: ");
|
||||||
|
display.print(pressure, 1);
|
||||||
|
display.print(" PSI");
|
||||||
|
|
||||||
|
display.setCursor(0, 53);
|
||||||
|
display.print("Oil Temp: ");
|
||||||
|
display.print(temperature);
|
||||||
|
display.print(" C");
|
||||||
|
|
||||||
|
// Update the display
|
||||||
|
display.display();
|
||||||
|
|
||||||
|
// Delay for a while
|
||||||
|
delay(2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
void readM3200Sensor() {
|
||||||
|
Wire.requestFrom(M3200address, 4); // request 4 bytes
|
||||||
|
int n = Wire.available();
|
||||||
|
if (n == 4) {
|
||||||
|
status = 0;
|
||||||
|
uint16_t rawP; // pressure data from sensor
|
||||||
|
uint16_t rawT; // temperature data from sensor
|
||||||
|
rawP = (uint16_t)Wire.read(); // upper 8 bits
|
||||||
|
rawP <<= 8;
|
||||||
|
rawP |= (uint16_t)Wire.read(); // lower 8 bits
|
||||||
|
rawT = (uint16_t)Wire.read(); // upper 8 bits
|
||||||
|
rawT <<= 8;
|
||||||
|
rawT |= (uint16_t)Wire.read(); // lower 8 bits
|
||||||
|
|
||||||
|
status = rawP >> 14; // The status is 0, 1, 2 or 3
|
||||||
|
rawP &= 0x3FFF; // keep 14 bits, remove status bits
|
||||||
|
|
||||||
|
rawT >>= 5; // the lowest 5 bits are not used
|
||||||
|
|
||||||
|
// The math could be done with integers, but I choose float for now
|
||||||
|
pressure = ((rawP - 1000.0) / (15000.0 - 1000.0)) * maxPressure;
|
||||||
|
temperature = ((rawT - 512.0) / (1075.0 - 512.0)) * 55.0;
|
||||||
|
} else {
|
||||||
|
displayError("M3200 Pressure Transducer not Detected");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
float getAverageTemperature(float temp1, float temp2) {
|
||||||
|
// Calculate average temperature
|
||||||
|
if (isValidTemperature(temp1) && isValidTemperature(temp2)) {
|
||||||
|
return (temp1 + temp2) / 2.0;
|
||||||
|
} else if (isValidTemperature(temp1)) {
|
||||||
|
return temp1;
|
||||||
|
} else if (isValidTemperature(temp2)) {
|
||||||
|
return temp2;
|
||||||
|
} else {
|
||||||
|
return -127.0; // Invalid temperature
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isValidTemperature(float temp) {
|
||||||
|
// Check if temperature is within a reasonable range
|
||||||
|
return temp > -100.0 && temp < 150.0;
|
||||||
|
}
|
||||||
113
FanControl_Simple/FanControl_Simple.ino
Normal file
113
FanControl_Simple/FanControl_Simple.ino
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
|
||||||
|
#define ONE_WIRE_BUS_CLT1 2
|
||||||
|
#define ONE_WIRE_BUS_CLT2 3
|
||||||
|
#define OVERRIDE_SWITCH_PIN 4
|
||||||
|
#define FAN1_PWM_PIN 8
|
||||||
|
#define FAN2_PWM_PIN 9
|
||||||
|
#define POTENTIOMETER_PIN 16
|
||||||
|
|
||||||
|
// Define temperature thresholds
|
||||||
|
#define FAN_ON_TEMP 95
|
||||||
|
#define FAN_OFF_TEMP (FAN_ON_TEMP - 10)
|
||||||
|
#define FAN_HIGH_TEMP (FAN_ON_TEMP + 10)
|
||||||
|
#define FAN_HIGH_DUTY_CYCLE 95
|
||||||
|
#define FAN_LOW_DUTY_CYCLE 40
|
||||||
|
#define OVERRIDE_DUTY_CYCLE 60
|
||||||
|
|
||||||
|
// Define variables
|
||||||
|
float temperature1 = 0;
|
||||||
|
float temperature2 = 0;
|
||||||
|
float averageTemp = 0;
|
||||||
|
bool fanOverride = false;
|
||||||
|
int fan1DutyCycle = 0;
|
||||||
|
int fan2DutyCycle = 0;
|
||||||
|
int overrideDutyCycle = 0;
|
||||||
|
|
||||||
|
OneWire oneWire_CLT1(ONE_WIRE_BUS_CLT1);
|
||||||
|
DallasTemperature sensor_CLT1(&oneWire_CLT1);
|
||||||
|
|
||||||
|
OneWire oneWire_CLT2(ONE_WIRE_BUS_CLT2);
|
||||||
|
DallasTemperature sensor_CLT2(&oneWire_CLT2);
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
pinMode(OVERRIDE_SWITCH_PIN, INPUT_PULLUP);
|
||||||
|
pinMode(FAN1_PWM_PIN, OUTPUT);
|
||||||
|
pinMode(FAN2_PWM_PIN, OUTPUT);
|
||||||
|
// Initialize Serial for debugging
|
||||||
|
Serial.begin(9600);
|
||||||
|
// Initialize temperature sensors
|
||||||
|
sensor_CLT1.begin();
|
||||||
|
sensor_CLT2.begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// Read temperatures
|
||||||
|
temperature1 = readTemperature(sensor_CLT1);
|
||||||
|
temperature2 = readTemperature(sensor_CLT2);
|
||||||
|
|
||||||
|
// Calculate average temperature
|
||||||
|
averageTemp = calculateAverageTemperature();
|
||||||
|
|
||||||
|
// Check if temperatures are valid
|
||||||
|
if (isValidTemperature(temperature1) && isValidTemperature(temperature2)) {
|
||||||
|
// Determine fan duty cycle based on temperature
|
||||||
|
calculateFanDutyCycle(averageTemp);
|
||||||
|
// Check for override switch
|
||||||
|
if (digitalRead(OVERRIDE_SWITCH_PIN) == LOW) {
|
||||||
|
// Override mode
|
||||||
|
fanOverride = true;
|
||||||
|
overrideDutyCycle = map(analogRead(POTENTIOMETER_PIN), 0, 1023, 0, 100);
|
||||||
|
analogWrite(FAN1_PWM_PIN, overrideDutyCycle);
|
||||||
|
analogWrite(FAN2_PWM_PIN, overrideDutyCycle);
|
||||||
|
} else {
|
||||||
|
// Normal operation
|
||||||
|
fanOverride = false;
|
||||||
|
analogWrite(FAN1_PWM_PIN, fan1DutyCycle);
|
||||||
|
analogWrite(FAN2_PWM_PIN, fan2DutyCycle);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Invalid temperatures, turn off fans
|
||||||
|
analogWrite(FAN1_PWM_PIN, 0);
|
||||||
|
analogWrite(FAN2_PWM_PIN, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output temperature, fan status, and override duty cycle to serial
|
||||||
|
Serial.print("Temperature 1: ");
|
||||||
|
Serial.print(temperature1);
|
||||||
|
Serial.print("°C, Temperature 2: ");
|
||||||
|
Serial.print(temperature2);
|
||||||
|
Serial.print("°C, Average Temperature: ");
|
||||||
|
Serial.print(averageTemp);
|
||||||
|
Serial.print("°C, Fan Override: ");
|
||||||
|
Serial.print(fanOverride ? "ON" : "OFF");
|
||||||
|
if (fanOverride) {
|
||||||
|
Serial.print(", Override Duty Cycle: ");
|
||||||
|
Serial.print(overrideDutyCycle);
|
||||||
|
Serial.print("%");
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
delay(1000); // Adjust delay as needed
|
||||||
|
}
|
||||||
|
|
||||||
|
float readTemperature(DallasTemperature sensor) {
|
||||||
|
sensor.requestTemperatures();
|
||||||
|
return sensor.getTempCByIndex(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float calculateAverageTemperature() {
|
||||||
|
return (temperature1 + temperature2) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isValidTemperature(float temp) {
|
||||||
|
return temp >= -20 && temp <= 130;
|
||||||
|
}
|
||||||
|
|
||||||
|
void calculateFanDutyCycle(float temp) {
|
||||||
|
if (temp >= FAN_ON_TEMP) {
|
||||||
|
fan1DutyCycle = fan2DutyCycle = (temp >= FAN_HIGH_TEMP) ? FAN_HIGH_DUTY_CYCLE : FAN_LOW_DUTY_CYCLE;
|
||||||
|
} else {
|
||||||
|
fan1DutyCycle = fan2DutyCycle = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
63
M32JM_Pres-Temp_Sensor/M32JM_Pres-Temp_Sensor.ino
Normal file
63
M32JM_Pres-Temp_Sensor/M32JM_Pres-Temp_Sensor.ino
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
#include <Wire.h>
|
||||||
|
|
||||||
|
|
||||||
|
int M3200address = 0x28; // 0x28, 0x36 or 0x46, depending on the sensor.
|
||||||
|
float maxPressure =100; // pressure in PSI for this sensor, 100, 250, 500, ... 10k.
|
||||||
|
byte status;
|
||||||
|
|
||||||
|
|
||||||
|
unsigned long pressureMillis = 0;
|
||||||
|
const int pressureTiming = 500; // 500ms every data acquisition
|
||||||
|
|
||||||
|
|
||||||
|
void setup (){
|
||||||
|
Serial.begin(9600);
|
||||||
|
Serial.println("M3200 initializing");
|
||||||
|
Wire.begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void loop(){
|
||||||
|
if (millis()-pressureMillis >= pressureTiming){
|
||||||
|
pressureMillis = millis();
|
||||||
|
Wire.requestFrom(M3200address,4); // request 4 bytes
|
||||||
|
int n = Wire.available();
|
||||||
|
if( n == 4){
|
||||||
|
status = 0;
|
||||||
|
uint16_t rawP; // pressure data from sensor
|
||||||
|
uint16_t rawT; // temperature data from sensor
|
||||||
|
rawP = (uint16_t) Wire.read(); // upper 8 bits
|
||||||
|
rawP <<= 8;
|
||||||
|
rawP |= (uint16_t) Wire.read(); // lower 8 bits
|
||||||
|
rawT = (uint16_t) Wire.read(); // upper 8 bits
|
||||||
|
rawT <<= 8;
|
||||||
|
rawT |= (uint16_t) Wire.read(); // lower 8 bits
|
||||||
|
|
||||||
|
|
||||||
|
status = rawP >> 14; // The status is 0, 1, 2 or 3
|
||||||
|
rawP &= 0x3FFF; // keep 14 bits, remove status bits
|
||||||
|
|
||||||
|
|
||||||
|
rawT >>= 5; // the lowest 5 bits are not used
|
||||||
|
|
||||||
|
// The math could be done with integers, but I choose float for now
|
||||||
|
float pressure = ((rawP - 1000.0) / (15000.0 - 1000.0)) * maxPressure;
|
||||||
|
float temperature = ((rawT - 512.0) / (1075.0 - 512.0)) * 55.0;
|
||||||
|
|
||||||
|
|
||||||
|
Serial.print("Status = ");
|
||||||
|
Serial.println(status);
|
||||||
|
Serial.print( "Pressure = ");
|
||||||
|
Serial.println( pressure);
|
||||||
|
Serial.print( "Temperature = ");
|
||||||
|
Serial.println( temperature);
|
||||||
|
Serial.println("-------------------------------------");
|
||||||
|
|
||||||
|
|
||||||
|
}else{
|
||||||
|
Serial.println( "M3200 Pressure Transducer not Detected");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
49
OLED_BOLT/OLED_BOLT.ino
Normal file
49
OLED_BOLT/OLED_BOLT.ino
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_SH110X.h>
|
||||||
|
#include <Fonts/FreeSans9pt7b.h>
|
||||||
|
|
||||||
|
#define i2c_Address 0x3C // Change this if your OLED has a different I2C address
|
||||||
|
#define SCREEN_WIDTH 128
|
||||||
|
#define SCREEN_HEIGHT 64
|
||||||
|
#define OLED_RESET -1
|
||||||
|
|
||||||
|
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
|
||||||
|
if(!display.begin(i2c_Address)) {
|
||||||
|
Serial.println(F("SH110X allocation failed"));
|
||||||
|
for(;;);
|
||||||
|
}
|
||||||
|
display.clearDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
// Set a larger text size and color
|
||||||
|
//display.setTextSize(3); // Increase the text size
|
||||||
|
display.setFont(&FreeSans9pt7b);
|
||||||
|
display.setTextColor(SH110X_WHITE);
|
||||||
|
|
||||||
|
// Get the width and height of the text
|
||||||
|
int16_t x1, y1;
|
||||||
|
uint16_t w, h;
|
||||||
|
display.getTextBounds("BOLT", 0, 0, &x1, &y1, &w, &h);
|
||||||
|
|
||||||
|
// Calculate the X and Y coordinates for centering
|
||||||
|
int16_t x = (SCREEN_WIDTH - w) / 2;
|
||||||
|
int16_t y = (SCREEN_HEIGHT - h) / 2;
|
||||||
|
|
||||||
|
// Display "BOLT" in the center of the screen
|
||||||
|
display.setCursor(x, y);
|
||||||
|
display.print("BOLT");
|
||||||
|
|
||||||
|
// Update the display
|
||||||
|
display.display();
|
||||||
|
|
||||||
|
// Delay for a while
|
||||||
|
delay(2000);
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_SH110X.h>
|
||||||
|
|
||||||
|
#define i2c_Address 0x3C // Change this if your OLED has a different I2C address
|
||||||
|
#define SCREEN_WIDTH 128
|
||||||
|
#define SCREEN_HEIGHT 64
|
||||||
|
#define OLED_RESET -1
|
||||||
|
|
||||||
|
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
|
||||||
|
if(!display.begin(i2c_Address)) {
|
||||||
|
Serial.println(F("SH110X allocation failed"));
|
||||||
|
for(;;);
|
||||||
|
}
|
||||||
|
|
||||||
|
display.display();
|
||||||
|
delay(2000);
|
||||||
|
display.clearDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
display.setTextSize(1);
|
||||||
|
display.setTextColor(SH110X_WHITE);
|
||||||
|
|
||||||
|
// Display temperature on the screen in Celsius with one decimal place
|
||||||
|
display.setCursor(10, 10);
|
||||||
|
display.print("Temp:");
|
||||||
|
display.setCursor(40, 10);
|
||||||
|
display.print("-127.00"); // Display one decimal place
|
||||||
|
|
||||||
|
display.setCursor(10, 20);
|
||||||
|
display.print("Fan%:");
|
||||||
|
display.setCursor(40, 20);
|
||||||
|
display.print("44");
|
||||||
|
|
||||||
|
// Update the display
|
||||||
|
display.display();
|
||||||
|
}
|
||||||
356
OLED_ESP32_S2_Mini/OLED_ESP32_S2_Mini.ino
Normal file
356
OLED_ESP32_S2_Mini/OLED_ESP32_S2_Mini.ino
Normal file
@@ -0,0 +1,356 @@
|
|||||||
|
/*********************************************************************
|
||||||
|
This is an example for our Monochrome OLEDs based on SH110X drivers
|
||||||
|
|
||||||
|
This example is for a 128x64 size display using I2C to communicate
|
||||||
|
3 pins are required to interface (2 I2C and one reset)
|
||||||
|
|
||||||
|
Adafruit invests time and resources providing this open source code,
|
||||||
|
please support Adafruit and open-source hardware by purchasing
|
||||||
|
products from Adafruit!
|
||||||
|
|
||||||
|
Written by Limor Fried/Ladyada for Adafruit Industries.
|
||||||
|
BSD license, check license.txt for more information
|
||||||
|
All text above, and the splash screen must be included in any redistribution
|
||||||
|
|
||||||
|
i2c SH1106 modified by Rupert Hirst 12/09/21
|
||||||
|
*********************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_SH110X.h>
|
||||||
|
|
||||||
|
/* Uncomment the initialize the I2C address , uncomment only one, If you get a totally blank screen try the other*/
|
||||||
|
#define i2c_Address 0x3c //initialize with the I2C addr 0x3C Typically eBay OLED's
|
||||||
|
//#define i2c_Address 0x3d //initialize with the I2C addr 0x3D Typically Adafruit OLED's
|
||||||
|
|
||||||
|
#define SCREEN_WIDTH 128 // OLED display width, in pixels
|
||||||
|
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
|
||||||
|
#define OLED_RESET -1 // QT-PY / XIAO
|
||||||
|
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||||
|
|
||||||
|
|
||||||
|
#define NUMFLAKES 10
|
||||||
|
#define XPOS 0
|
||||||
|
#define YPOS 1
|
||||||
|
#define DELTAY 2
|
||||||
|
|
||||||
|
|
||||||
|
#define LOGO16_GLCD_HEIGHT 16
|
||||||
|
#define LOGO16_GLCD_WIDTH 16
|
||||||
|
static const unsigned char PROGMEM logo16_glcd_bmp[] =
|
||||||
|
{ B00000000, B11000000,
|
||||||
|
B00000001, B11000000,
|
||||||
|
B00000001, B11000000,
|
||||||
|
B00000011, B11100000,
|
||||||
|
B11110011, B11100000,
|
||||||
|
B11111110, B11111000,
|
||||||
|
B01111110, B11111111,
|
||||||
|
B00110011, B10011111,
|
||||||
|
B00011111, B11111100,
|
||||||
|
B00001101, B01110000,
|
||||||
|
B00011011, B10100000,
|
||||||
|
B00111111, B11100000,
|
||||||
|
B00111111, B11110000,
|
||||||
|
B01111100, B11110000,
|
||||||
|
B01110000, B01110000,
|
||||||
|
B00000000, B00110000
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
|
||||||
|
Serial.begin(9600);
|
||||||
|
|
||||||
|
// Show image buffer on the display hardware.
|
||||||
|
// Since the buffer is intialized with an Adafruit splashscreen
|
||||||
|
// internally, this will display the splashscreen.
|
||||||
|
|
||||||
|
delay(250); // wait for the OLED to power up
|
||||||
|
display.begin(i2c_Address, true); // Address 0x3C default
|
||||||
|
//display.setContrast (0); // dim display
|
||||||
|
|
||||||
|
display.display();
|
||||||
|
delay(2000);
|
||||||
|
|
||||||
|
// Clear the buffer.
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
// draw a single pixel
|
||||||
|
display.drawPixel(10, 10, SH110X_WHITE);
|
||||||
|
// Show the display buffer on the hardware.
|
||||||
|
// NOTE: You _must_ call display after making any drawing commands
|
||||||
|
// to make them visible on the display hardware!
|
||||||
|
display.display();
|
||||||
|
delay(2000);
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
// draw many lines
|
||||||
|
testdrawline();
|
||||||
|
display.display();
|
||||||
|
delay(2000);
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
// draw rectangles
|
||||||
|
testdrawrect();
|
||||||
|
display.display();
|
||||||
|
delay(2000);
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
// draw multiple rectangles
|
||||||
|
testfillrect();
|
||||||
|
display.display();
|
||||||
|
delay(2000);
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
// draw mulitple circles
|
||||||
|
testdrawcircle();
|
||||||
|
display.display();
|
||||||
|
delay(2000);
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
// draw a SH110X_WHITE circle, 10 pixel radius
|
||||||
|
display.fillCircle(display.width() / 2, display.height() / 2, 10, SH110X_WHITE);
|
||||||
|
display.display();
|
||||||
|
delay(2000);
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
testdrawroundrect();
|
||||||
|
delay(2000);
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
testfillroundrect();
|
||||||
|
delay(2000);
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
testdrawtriangle();
|
||||||
|
delay(2000);
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
testfilltriangle();
|
||||||
|
delay(2000);
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
// draw the first ~12 characters in the font
|
||||||
|
testdrawchar();
|
||||||
|
display.display();
|
||||||
|
delay(2000);
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// text display tests
|
||||||
|
display.setTextSize(1);
|
||||||
|
display.setTextColor(SH110X_WHITE);
|
||||||
|
display.setCursor(0, 0);
|
||||||
|
display.println("Failure is always an option");
|
||||||
|
display.setTextColor(SH110X_BLACK, SH110X_WHITE); // 'inverted' text
|
||||||
|
display.println(3.141592);
|
||||||
|
display.setTextSize(2);
|
||||||
|
display.setTextColor(SH110X_WHITE);
|
||||||
|
display.print("0x"); display.println(0xDEADBEEF, HEX);
|
||||||
|
display.display();
|
||||||
|
delay(2000);
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
// miniature bitmap display
|
||||||
|
display.drawBitmap(30, 16, logo16_glcd_bmp, 16, 16, 1);
|
||||||
|
display.display();
|
||||||
|
delay(1);
|
||||||
|
|
||||||
|
// invert the display
|
||||||
|
display.invertDisplay(true);
|
||||||
|
delay(1000);
|
||||||
|
display.invertDisplay(false);
|
||||||
|
delay(1000);
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
// draw a bitmap icon and 'animate' movement
|
||||||
|
testdrawbitmap(logo16_glcd_bmp, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) {
|
||||||
|
uint8_t icons[NUMFLAKES][3];
|
||||||
|
|
||||||
|
// initialize
|
||||||
|
for (uint8_t f = 0; f < NUMFLAKES; f++) {
|
||||||
|
icons[f][XPOS] = random(display.width());
|
||||||
|
icons[f][YPOS] = 0;
|
||||||
|
icons[f][DELTAY] = random(5) + 1;
|
||||||
|
|
||||||
|
Serial.print("x: ");
|
||||||
|
Serial.print(icons[f][XPOS], DEC);
|
||||||
|
Serial.print(" y: ");
|
||||||
|
Serial.print(icons[f][YPOS], DEC);
|
||||||
|
Serial.print(" dy: ");
|
||||||
|
Serial.println(icons[f][DELTAY], DEC);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
// draw each icon
|
||||||
|
for (uint8_t f = 0; f < NUMFLAKES; f++) {
|
||||||
|
display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, SH110X_WHITE);
|
||||||
|
}
|
||||||
|
display.display();
|
||||||
|
delay(200);
|
||||||
|
|
||||||
|
// then erase it + move it
|
||||||
|
for (uint8_t f = 0; f < NUMFLAKES; f++) {
|
||||||
|
display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, SH110X_BLACK);
|
||||||
|
// move it
|
||||||
|
icons[f][YPOS] += icons[f][DELTAY];
|
||||||
|
// if its gone, reinit
|
||||||
|
if (icons[f][YPOS] > display.height()) {
|
||||||
|
icons[f][XPOS] = random(display.width());
|
||||||
|
icons[f][YPOS] = 0;
|
||||||
|
icons[f][DELTAY] = random(5) + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void testdrawchar(void) {
|
||||||
|
display.setTextSize(1);
|
||||||
|
display.setTextColor(SH110X_WHITE);
|
||||||
|
display.setCursor(0, 0);
|
||||||
|
|
||||||
|
for (uint8_t i = 0; i < 168; i++) {
|
||||||
|
if (i == '\n') continue;
|
||||||
|
display.write(i);
|
||||||
|
if ((i > 0) && (i % 21 == 0))
|
||||||
|
display.println();
|
||||||
|
}
|
||||||
|
display.display();
|
||||||
|
delay(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void testdrawcircle(void) {
|
||||||
|
for (int16_t i = 0; i < display.height(); i += 2) {
|
||||||
|
display.drawCircle(display.width() / 2, display.height() / 2, i, SH110X_WHITE);
|
||||||
|
display.display();
|
||||||
|
delay(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void testfillrect(void) {
|
||||||
|
uint8_t color = 1;
|
||||||
|
for (int16_t i = 0; i < display.height() / 2; i += 3) {
|
||||||
|
// alternate colors
|
||||||
|
display.fillRect(i, i, display.width() - i * 2, display.height() - i * 2, color % 2);
|
||||||
|
display.display();
|
||||||
|
delay(1);
|
||||||
|
color++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void testdrawtriangle(void) {
|
||||||
|
for (int16_t i = 0; i < min(display.width(), display.height()) / 2; i += 5) {
|
||||||
|
display.drawTriangle(display.width() / 2, display.height() / 2 - i,
|
||||||
|
display.width() / 2 - i, display.height() / 2 + i,
|
||||||
|
display.width() / 2 + i, display.height() / 2 + i, SH110X_WHITE);
|
||||||
|
display.display();
|
||||||
|
delay(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void testfilltriangle(void) {
|
||||||
|
uint8_t color = SH110X_WHITE;
|
||||||
|
for (int16_t i = min(display.width(), display.height()) / 2; i > 0; i -= 5) {
|
||||||
|
display.fillTriangle(display.width() / 2, display.height() / 2 - i,
|
||||||
|
display.width() / 2 - i, display.height() / 2 + i,
|
||||||
|
display.width() / 2 + i, display.height() / 2 + i, SH110X_WHITE);
|
||||||
|
if (color == SH110X_WHITE) color = SH110X_BLACK;
|
||||||
|
else color = SH110X_WHITE;
|
||||||
|
display.display();
|
||||||
|
delay(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void testdrawroundrect(void) {
|
||||||
|
for (int16_t i = 0; i < display.height() / 2 - 2; i += 2) {
|
||||||
|
display.drawRoundRect(i, i, display.width() - 2 * i, display.height() - 2 * i, display.height() / 4, SH110X_WHITE);
|
||||||
|
display.display();
|
||||||
|
delay(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void testfillroundrect(void) {
|
||||||
|
uint8_t color = SH110X_WHITE;
|
||||||
|
for (int16_t i = 0; i < display.height() / 2 - 2; i += 2) {
|
||||||
|
display.fillRoundRect(i, i, display.width() - 2 * i, display.height() - 2 * i, display.height() / 4, color);
|
||||||
|
if (color == SH110X_WHITE) color = SH110X_BLACK;
|
||||||
|
else color = SH110X_WHITE;
|
||||||
|
display.display();
|
||||||
|
delay(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void testdrawrect(void) {
|
||||||
|
for (int16_t i = 0; i < display.height() / 2; i += 2) {
|
||||||
|
display.drawRect(i, i, display.width() - 2 * i, display.height() - 2 * i, SH110X_WHITE);
|
||||||
|
display.display();
|
||||||
|
delay(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void testdrawline() {
|
||||||
|
for (int16_t i = 0; i < display.width(); i += 4) {
|
||||||
|
display.drawLine(0, 0, i, display.height() - 1, SH110X_WHITE);
|
||||||
|
display.display();
|
||||||
|
delay(1);
|
||||||
|
}
|
||||||
|
for (int16_t i = 0; i < display.height(); i += 4) {
|
||||||
|
display.drawLine(0, 0, display.width() - 1, i, SH110X_WHITE);
|
||||||
|
display.display();
|
||||||
|
delay(1);
|
||||||
|
}
|
||||||
|
delay(250);
|
||||||
|
|
||||||
|
display.clearDisplay();
|
||||||
|
for (int16_t i = 0; i < display.width(); i += 4) {
|
||||||
|
display.drawLine(0, display.height() - 1, i, 0, SH110X_WHITE);
|
||||||
|
display.display();
|
||||||
|
delay(1);
|
||||||
|
}
|
||||||
|
for (int16_t i = display.height() - 1; i >= 0; i -= 4) {
|
||||||
|
display.drawLine(0, display.height() - 1, display.width() - 1, i, SH110X_WHITE);
|
||||||
|
display.display();
|
||||||
|
delay(1);
|
||||||
|
}
|
||||||
|
delay(250);
|
||||||
|
|
||||||
|
display.clearDisplay();
|
||||||
|
for (int16_t i = display.width() - 1; i >= 0; i -= 4) {
|
||||||
|
display.drawLine(display.width() - 1, display.height() - 1, i, 0, SH110X_WHITE);
|
||||||
|
display.display();
|
||||||
|
delay(1);
|
||||||
|
}
|
||||||
|
for (int16_t i = display.height() - 1; i >= 0; i -= 4) {
|
||||||
|
display.drawLine(display.width() - 1, display.height() - 1, 0, i, SH110X_WHITE);
|
||||||
|
display.display();
|
||||||
|
delay(1);
|
||||||
|
}
|
||||||
|
delay(250);
|
||||||
|
|
||||||
|
display.clearDisplay();
|
||||||
|
for (int16_t i = 0; i < display.height(); i += 4) {
|
||||||
|
display.drawLine(display.width() - 1, 0, 0, i, SH110X_WHITE);
|
||||||
|
display.display();
|
||||||
|
delay(1);
|
||||||
|
}
|
||||||
|
for (int16_t i = 0; i < display.width(); i += 4) {
|
||||||
|
display.drawLine(display.width() - 1, 0, i, display.height() - 1, SH110X_WHITE);
|
||||||
|
display.display();
|
||||||
|
delay(1);
|
||||||
|
}
|
||||||
|
delay(250);
|
||||||
|
}
|
||||||
46
OLED_Find/OLED_Find.ino
Normal file
46
OLED_Find/OLED_Find.ino
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
/* I2C Address Finder
|
||||||
|
* for " Arduino LCD I2C Tutorial| How to Program LCD Display"
|
||||||
|
* subscribe for more arduino Tuorials and Projects
|
||||||
|
|
||||||
|
https://www.youtube.com/channel/UCM6rbuieQBBLFsxs...
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void setup()
|
||||||
|
|
||||||
|
{
|
||||||
|
Serial.begin (115200);
|
||||||
|
while (!Serial)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.println ();
|
||||||
|
Serial.println ("I2C scanner. Scanning ...");
|
||||||
|
byte count = 0;
|
||||||
|
pinMode(13,OUTPUT);
|
||||||
|
digitalWrite(13,HIGH);
|
||||||
|
Wire.begin();
|
||||||
|
for (byte i = 1; i < 120; i++)
|
||||||
|
{
|
||||||
|
Wire.beginTransmission (i);
|
||||||
|
if (Wire.endTransmission () == 0)
|
||||||
|
{
|
||||||
|
Serial.print ("Found address: ");
|
||||||
|
Serial.print (i, DEC);
|
||||||
|
Serial.print (" (0x");
|
||||||
|
Serial.print (i, HEX);
|
||||||
|
Serial.println (")");
|
||||||
|
count++;
|
||||||
|
delay (1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Serial.println ("Done.");
|
||||||
|
Serial.print ("Found ");
|
||||||
|
Serial.print (count, DEC);
|
||||||
|
Serial.println (" device(s).");
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {}
|
||||||
81
OLED_M32JM/OLED_M32JM.ino
Normal file
81
OLED_M32JM/OLED_M32JM.ino
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_SH110X.h>
|
||||||
|
|
||||||
|
#define oled_Address 0x3C // Change this if your OLED has a different I2C address
|
||||||
|
#define SCREEN_WIDTH 128
|
||||||
|
#define SCREEN_HEIGHT 64
|
||||||
|
#define OLED_RESET -1
|
||||||
|
|
||||||
|
int M3200address = 0x28; // 0x28, 0x36 or 0x46, depending on the sensor.
|
||||||
|
float maxPressure = 100; // pressure in PSI for this sensor, 100, 250, 500, ... 10k.
|
||||||
|
byte status;
|
||||||
|
|
||||||
|
unsigned long pressureMillis = 0;
|
||||||
|
const int pressureTiming = 500; // 500ms every data acquisition
|
||||||
|
|
||||||
|
// Define the OLED display
|
||||||
|
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
Serial.println("M3200 initializing");
|
||||||
|
Wire.begin();
|
||||||
|
|
||||||
|
// Initialize the OLED display
|
||||||
|
if (!display.begin(oled_Address)) {
|
||||||
|
Serial.println("SSD1306 allocation failed");
|
||||||
|
for (;;);
|
||||||
|
}
|
||||||
|
|
||||||
|
display.display(); // Clear the display buffer
|
||||||
|
delay(2000); // Pause for 2 seconds
|
||||||
|
display.clearDisplay(); // Clear the display buffer
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
if (millis() - pressureMillis >= pressureTiming) {
|
||||||
|
pressureMillis = millis();
|
||||||
|
Wire.requestFrom(M3200address, 4); // request 4 bytes
|
||||||
|
int n = Wire.available();
|
||||||
|
|
||||||
|
if (n == 4) {
|
||||||
|
status = 0;
|
||||||
|
uint16_t rawP; // pressure data from sensor
|
||||||
|
uint16_t rawT; // temperature data from sensor
|
||||||
|
rawP = (uint16_t) Wire.read(); // upper 8 bits
|
||||||
|
rawP <<= 8;
|
||||||
|
rawP |= (uint16_t) Wire.read(); // lower 8 bits
|
||||||
|
rawT = (uint16_t) Wire.read(); // upper 8 bits
|
||||||
|
rawT <<= 8;
|
||||||
|
rawT |= (uint16_t) Wire.read(); // lower 8 bits
|
||||||
|
|
||||||
|
status = rawP >> 14; // The status is 0, 1, 2 or 3
|
||||||
|
rawP &= 0x3FFF; // keep 14 bits, remove status bits
|
||||||
|
|
||||||
|
rawT >>= 5; // the lowest 5 bits are not used
|
||||||
|
|
||||||
|
float pressure = ((rawP - 1000.0) / (15000.0 - 1000.0)) * maxPressure;
|
||||||
|
float temperature = ((rawT - 512.0) / (1075.0 - 512.0)) * 55.0;
|
||||||
|
|
||||||
|
// Display data on OLED
|
||||||
|
display.clearDisplay();
|
||||||
|
display.setTextSize(1);
|
||||||
|
display.setTextColor(SH110X_WHITE);
|
||||||
|
display.setCursor(0, 0);
|
||||||
|
display.print("Status: ");
|
||||||
|
display.println(status);
|
||||||
|
display.print("Pressure: ");
|
||||||
|
display.print(pressure);
|
||||||
|
display.println(" PSI");
|
||||||
|
display.print("Temperature: ");
|
||||||
|
display.print(temperature);
|
||||||
|
display.println(" C");
|
||||||
|
display.display();
|
||||||
|
|
||||||
|
Serial.println("-------------------------------------");
|
||||||
|
} else {
|
||||||
|
Serial.println("M3200 Pressure Transducer not Detected");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,108 @@
|
|||||||
|
//Current setup on test-arduino. 16.06.2024
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_SH110X.h>
|
||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
|
||||||
|
#define oled_Address 0x3C // Change this if your OLED has a different I2C address
|
||||||
|
#define SCREEN_WIDTH 128
|
||||||
|
#define SCREEN_HEIGHT 64
|
||||||
|
#define OLED_RESET -1
|
||||||
|
#define ONE_WIRE_BUS1 7 // D2 pin for the first DS18B20 sensor
|
||||||
|
#define ONE_WIRE_BUS2 9 // D7 pin for the second DS18B20 sensor
|
||||||
|
|
||||||
|
int M3200address = 0x28; // 0x28, 0x36, or 0x46, depending on the sensor.
|
||||||
|
float maxPressure = 100; // pressure in PSI for this sensor, 100, 250, 500, ... 10k.
|
||||||
|
byte status;
|
||||||
|
|
||||||
|
unsigned long pressureMillis = 0;
|
||||||
|
const int pressureTiming = 1000; // 500ms every data acquisition
|
||||||
|
|
||||||
|
// Define the OLED display
|
||||||
|
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||||
|
OneWire oneWire1(ONE_WIRE_BUS1);
|
||||||
|
OneWire oneWire2(ONE_WIRE_BUS2);
|
||||||
|
DallasTemperature sensors1(&oneWire1);
|
||||||
|
DallasTemperature sensors2(&oneWire2);
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
sensors1.begin(); // Initialize the first DS18B20 sensor
|
||||||
|
sensors2.begin(); // Initialize the second DS18B20 sensor
|
||||||
|
|
||||||
|
Serial.begin(9600);
|
||||||
|
Serial.println("M3200 initializing");
|
||||||
|
Wire.begin();
|
||||||
|
|
||||||
|
// Initialize the OLED display
|
||||||
|
if (!display.begin(oled_Address)) {
|
||||||
|
Serial.println("SH110X allocation failed");
|
||||||
|
for (;;);
|
||||||
|
}
|
||||||
|
|
||||||
|
display.display(); // Clear the display buffer
|
||||||
|
delay(2000); // Pause for 2 seconds
|
||||||
|
display.clearDisplay(); // Clear the display buffer
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
if (millis() - pressureMillis >= pressureTiming) {
|
||||||
|
pressureMillis = millis();
|
||||||
|
Wire.requestFrom(M3200address, 4); // request 4 bytes
|
||||||
|
int n = Wire.available();
|
||||||
|
|
||||||
|
if (n == 4) {
|
||||||
|
status = 0;
|
||||||
|
uint16_t rawP; // pressure data from sensor
|
||||||
|
uint16_t rawT; // temperature data from sensor
|
||||||
|
rawP = (uint16_t) Wire.read(); // upper 8 bits
|
||||||
|
rawP <<= 8;
|
||||||
|
rawP |= (uint16_t) Wire.read(); // lower 8 bits
|
||||||
|
rawT = (uint16_t) Wire.read(); // upper 8 bits
|
||||||
|
rawT <<= 8;
|
||||||
|
rawT |= (uint16_t) Wire.read(); // lower 8 bits
|
||||||
|
|
||||||
|
status = rawP >> 14; // The status is 0, 1, 2, or 3
|
||||||
|
rawP &= 0x3FFF; // keep 14 bits, remove status bits
|
||||||
|
|
||||||
|
rawT >>= 5; // the lowest 5 bits are not used
|
||||||
|
|
||||||
|
float pressure = ((rawP - 1000.0) / (15000.0 - 1000.0)) * maxPressure;
|
||||||
|
float temperature0 = ((rawT - 512.0) / (1075.0 - 512.0)) * 55.0;
|
||||||
|
sensors1.requestTemperatures();
|
||||||
|
sensors2.requestTemperatures();
|
||||||
|
float temperature1 = sensors1.getTempCByIndex(0); // Read temperature from first DS18B20
|
||||||
|
float temperature2 = sensors2.getTempCByIndex(0); // Read temperature from second DS18B20
|
||||||
|
|
||||||
|
// Display data on OLED
|
||||||
|
display.clearDisplay();
|
||||||
|
display.setTextSize(1);
|
||||||
|
display.setTextColor(SH110X_WHITE);
|
||||||
|
display.setCursor(0, 0);
|
||||||
|
display.print("Oil Pres: ");
|
||||||
|
display.print(pressure);
|
||||||
|
display.print(" PSI");
|
||||||
|
display.setCursor(0, 10);
|
||||||
|
display.print("Oil Temp: ");
|
||||||
|
display.print(temperature0);
|
||||||
|
display.println(" C");
|
||||||
|
display.setCursor(0, 40);
|
||||||
|
display.print("Temp 1: ");
|
||||||
|
display.print(temperature1);
|
||||||
|
display.print(" C");
|
||||||
|
display.setCursor(0, 50);
|
||||||
|
display.print("Temp 22: ");
|
||||||
|
display.print(temperature2);
|
||||||
|
display.print(" C");
|
||||||
|
display.display();
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
|
||||||
|
} else {
|
||||||
|
Serial.println("M3200 Pressure Transducer not Detected");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
54
OLED_Temperature_DS18B20/OLED_Temperature_DS18B20.ino
Normal file
54
OLED_Temperature_DS18B20/OLED_Temperature_DS18B20.ino
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_SH110X.h>
|
||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
|
||||||
|
#define i2c_Address 0x3C // Change this if your OLED has a different I2C address
|
||||||
|
#define SCREEN_WIDTH 128
|
||||||
|
#define SCREEN_HEIGHT 64
|
||||||
|
#define OLED_RESET -1
|
||||||
|
#define ONE_WIRE_BUS 2 // D2 pin for DS18B20 sensor
|
||||||
|
|
||||||
|
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||||
|
OneWire oneWire(ONE_WIRE_BUS);
|
||||||
|
DallasTemperature sensors(&oneWire);
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
|
||||||
|
if (!display.begin(i2c_Address)) {
|
||||||
|
Serial.println(F("SH110X allocation failed"));
|
||||||
|
for (;;);
|
||||||
|
}
|
||||||
|
|
||||||
|
sensors.begin(); // Initialize DS18B20 sensor
|
||||||
|
|
||||||
|
display.display();
|
||||||
|
delay(2000);
|
||||||
|
display.clearDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
// Set text size and color
|
||||||
|
display.setTextSize(2);
|
||||||
|
display.setTextColor(SH110X_WHITE);
|
||||||
|
|
||||||
|
// Read temperature from DS18B20 sensor
|
||||||
|
sensors.requestTemperatures();
|
||||||
|
float temperatureC = sensors.getTempCByIndex(0);
|
||||||
|
|
||||||
|
// Display temperature on the screen in Celsius with one decimal place
|
||||||
|
display.setCursor(10, 10);
|
||||||
|
display.print("Temp:");
|
||||||
|
display.setCursor(10, 30);
|
||||||
|
display.print(temperatureC, 1); // Display one decimal place
|
||||||
|
|
||||||
|
// Update the display
|
||||||
|
display.display();
|
||||||
|
|
||||||
|
// Delay for a while
|
||||||
|
delay(2000);
|
||||||
|
}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_SH110X.h>
|
||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
|
||||||
|
#define i2c_Address 0x3C // Change this if your OLED has a different I2C address
|
||||||
|
#define SCREEN_WIDTH 128
|
||||||
|
#define SCREEN_HEIGHT 64
|
||||||
|
#define OLED_RESET -1
|
||||||
|
#define ONE_WIRE_BUS 2 // D2 pin for DS18B20 sensor
|
||||||
|
|
||||||
|
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||||
|
OneWire oneWire(ONE_WIRE_BUS);
|
||||||
|
DallasTemperature sensors(&oneWire);
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
|
||||||
|
if (!display.begin(i2c_Address)) {
|
||||||
|
Serial.println(F("SH110X allocation failed"));
|
||||||
|
for (;;);
|
||||||
|
}
|
||||||
|
|
||||||
|
sensors.begin(); // Initialize DS18B20 sensor
|
||||||
|
|
||||||
|
display.display();
|
||||||
|
delay(2000);
|
||||||
|
display.clearDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
// Set text size and color
|
||||||
|
display.setTextSize(1);
|
||||||
|
display.setTextColor(SH110X_WHITE);
|
||||||
|
|
||||||
|
// Read temperature from DS18B20 sensor
|
||||||
|
sensors.requestTemperatures();
|
||||||
|
float temperatureC = sensors.getTempCByIndex(0);
|
||||||
|
|
||||||
|
// Display temperature on the screen in Celsius with one decimal place
|
||||||
|
display.setCursor(10, 10);
|
||||||
|
display.print("Clt Temp: ");
|
||||||
|
display.print(temperatureC, 1); // Display one decimal place
|
||||||
|
display.print(" C");
|
||||||
|
|
||||||
|
// Update the display
|
||||||
|
display.display();
|
||||||
|
|
||||||
|
// Delay for a while
|
||||||
|
delay(2000);
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
#include <AltSoftSerial.h>
|
||||||
|
|
||||||
|
//AltSoftSerial uses pin 8=RX and pin 9=TX on Nano and compatible Arduinos.
|
||||||
|
AltSoftSerial pwmSerial;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// put your setup code here, to run once:
|
||||||
|
Serial.begin(9600);
|
||||||
|
pwmSerial.begin(9600);
|
||||||
|
|
||||||
|
delay(50);
|
||||||
|
pwmSerial.print("F1.20");
|
||||||
|
delay(50);
|
||||||
|
pwmSerial.print("D1:000");
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// put your main code here, to run repeatedly:
|
||||||
|
|
||||||
|
}
|
||||||
23
PWM_Test/PWM_Test.ino
Normal file
23
PWM_Test/PWM_Test.ino
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
const int potPin = A0; // analog pin for potentiometer
|
||||||
|
const int pwmPin = 6; // PWM pin connected to the transistor gate
|
||||||
|
const int pwm2Pin = 5;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
pinMode(pwmPin, OUTPUT); // set pwmPin as output
|
||||||
|
pinMode(pwm2Pin, OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// read the potentiometer value (0-1023)
|
||||||
|
int potValue = analogRead(potPin);
|
||||||
|
|
||||||
|
// map the potentiometer value to a PWM value (0-255)
|
||||||
|
int pwmValue = map(potValue, 0, 1023, 0, 255);
|
||||||
|
|
||||||
|
// write the PWM value to the PWM pin
|
||||||
|
analogWrite(pwmPin, pwmValue);
|
||||||
|
analogWrite(pwm2Pin, pwmValue);
|
||||||
|
|
||||||
|
// slight delay to stabilize readings
|
||||||
|
delay(10);
|
||||||
|
}
|
||||||
128
PontiacDino3/PontiacDino3.ino
Normal file
128
PontiacDino3/PontiacDino3.ino
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
// Pin Definitions
|
||||||
|
const int Sw0PotPin = A6;
|
||||||
|
const int Sw1OffParkPin = 2;
|
||||||
|
const int Sw1IntmPin = 3;
|
||||||
|
const int Sw1LoPin = 4;
|
||||||
|
const int Sw1HiPin = 5;
|
||||||
|
const int Rly1LoPin = 13;
|
||||||
|
const int Rly2HiPin = 14;
|
||||||
|
const int Rly3GndPin = 15;
|
||||||
|
const int Rly4WshPin = 16;
|
||||||
|
|
||||||
|
// Global Variables
|
||||||
|
int waitingTime = 5000; // Default waiting time in milliseconds (5 seconds)
|
||||||
|
bool isWipIntmRunning = false; // Flag to track if WipIntm function is running
|
||||||
|
unsigned long previousTime = 0; // Variable to store the previous time for checking elapsed time
|
||||||
|
|
||||||
|
// Default state: WipOffPark
|
||||||
|
int currentState = 0;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// Initialize input pins
|
||||||
|
pinMode(Sw0PotPin, INPUT);
|
||||||
|
pinMode(Sw1OffParkPin, INPUT);
|
||||||
|
pinMode(Sw1IntmPin, INPUT);
|
||||||
|
pinMode(Sw1LoPin, INPUT);
|
||||||
|
pinMode(Sw1HiPin, INPUT);
|
||||||
|
|
||||||
|
// Initialize output pins
|
||||||
|
pinMode(Rly1LoPin, OUTPUT);
|
||||||
|
pinMode(Rly2HiPin, OUTPUT);
|
||||||
|
pinMode(Rly3GndPin, OUTPUT);
|
||||||
|
pinMode(Rly4WshPin, OUTPUT);
|
||||||
|
|
||||||
|
// Default state: all relays off (WipOffPark)
|
||||||
|
digitalWrite(Rly1LoPin, LOW);
|
||||||
|
digitalWrite(Rly2HiPin, LOW);
|
||||||
|
digitalWrite(Rly3GndPin, HIGH);
|
||||||
|
digitalWrite(Rly4WshPin, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// Read input states
|
||||||
|
int offParkState = digitalRead(Sw1OffParkPin);
|
||||||
|
int intmState = digitalRead(Sw1IntmPin);
|
||||||
|
int loState = digitalRead(Sw1LoPin);
|
||||||
|
int hiState = digitalRead(Sw1HiPin);
|
||||||
|
|
||||||
|
// Check input states and execute corresponding functions
|
||||||
|
if (offParkState == HIGH) {
|
||||||
|
WipOffPark();
|
||||||
|
currentState = 0; // Set current state to WipOffPark
|
||||||
|
} else if (intmState == HIGH) {
|
||||||
|
if (!isWipIntmRunning) {
|
||||||
|
WipIntm();
|
||||||
|
currentState = 1; // Set current state to WipIntm
|
||||||
|
}
|
||||||
|
} else if (loState == HIGH) {
|
||||||
|
WipLo();
|
||||||
|
currentState = 2; // Set current state to WipLo
|
||||||
|
} else if (hiState == HIGH) {
|
||||||
|
WipHi();
|
||||||
|
currentState = 3; // Set current state to WipHi
|
||||||
|
} else {
|
||||||
|
// Stop WipIntm function if no input is detected
|
||||||
|
if (currentState == 1 && isWipIntmRunning) {
|
||||||
|
isWipIntmRunning = false;
|
||||||
|
digitalWrite(Rly3GndPin, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update waiting time based on potentiometer value
|
||||||
|
int potValue = analogRead(Sw0PotPin);
|
||||||
|
waitingTime = map(potValue, 0, 1023, 5000, 30000); // 5 seconds to 30 seconds
|
||||||
|
|
||||||
|
// Check if the waiting time has elapsed for WipIntm function
|
||||||
|
if (currentState == 1 && isWipIntmRunning && millis() - previousTime >= waitingTime) {
|
||||||
|
previousTime = millis(); // Update the previous time for the next waiting period
|
||||||
|
digitalWrite(Rly3GndPin, LOW);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(Rly3GndPin, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipOffPark() {
|
||||||
|
digitalWrite(Rly1LoPin, LOW);
|
||||||
|
digitalWrite(Rly2HiPin, LOW);
|
||||||
|
digitalWrite(Rly3GndPin, HIGH);
|
||||||
|
digitalWrite(Rly4WshPin, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipIntm() {
|
||||||
|
isWipIntmRunning = true; // Set the flag to indicate that WipIntm function is running
|
||||||
|
digitalWrite(Rly1LoPin, LOW);
|
||||||
|
digitalWrite(Rly2HiPin, LOW);
|
||||||
|
digitalWrite(Rly3GndPin, HIGH);
|
||||||
|
digitalWrite(Rly4WshPin, HIGH);
|
||||||
|
|
||||||
|
while (digitalRead(Sw1IntmPin) == HIGH && isWipIntmRunning) {
|
||||||
|
// WipIntm function code
|
||||||
|
int potValue = analogRead(Sw0PotPin);
|
||||||
|
waitingTime = map(potValue, 0, 1023, 5000, 30000); // Update waiting time based on potentiometer value
|
||||||
|
|
||||||
|
unsigned long currentTime = millis();
|
||||||
|
if (currentTime - previousTime >= waitingTime) {
|
||||||
|
previousTime = currentTime;
|
||||||
|
digitalWrite(Rly3GndPin, LOW);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(Rly3GndPin, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
isWipIntmRunning = false; // Reset the flag after the loop ends
|
||||||
|
digitalWrite(Rly3GndPin, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipLo() {
|
||||||
|
digitalWrite(Rly1LoPin, LOW);
|
||||||
|
digitalWrite(Rly2HiPin, LOW);
|
||||||
|
digitalWrite(Rly3GndPin, LOW);
|
||||||
|
digitalWrite(Rly4WshPin, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipHi() {
|
||||||
|
digitalWrite(Rly1LoPin, HIGH);
|
||||||
|
digitalWrite(Rly2HiPin, LOW);
|
||||||
|
digitalWrite(Rly3GndPin, HIGH);
|
||||||
|
digitalWrite(Rly4WshPin, LOW);
|
||||||
|
}
|
||||||
204
PontiacDino4/PontiacDino4.ino
Normal file
204
PontiacDino4/PontiacDino4.ino
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
// Pin Definitions
|
||||||
|
const int Sw0PotPin = A6;
|
||||||
|
const int Sw1OffParkPin = 2;
|
||||||
|
const int Sw1IntmPin = 3;
|
||||||
|
const int Sw1LoPin = 4;
|
||||||
|
const int Sw1HiPin = 5;
|
||||||
|
const int Sw2LoPin = 7;
|
||||||
|
const int Sw2OnePin = 8;
|
||||||
|
const int Sw2TwoPin = 9;
|
||||||
|
const int Sw2HiPin = 10;
|
||||||
|
const int Sw3WashPin = 11;
|
||||||
|
const int Rly1LoPin = 13;
|
||||||
|
const int Rly2HiPin = 14;
|
||||||
|
const int Rly3GndPin = 15;
|
||||||
|
const int Rly4WshPin = 16;
|
||||||
|
const int RlyFanLoPin = 17;
|
||||||
|
const int RlyFanOnePin = 18;
|
||||||
|
const int RlyFanTwoPin = 19;
|
||||||
|
const int RlyFanHiPin = 12;
|
||||||
|
|
||||||
|
// Global Variables
|
||||||
|
int waitingTime = 5000; // Default waiting time in milliseconds (5 seconds)
|
||||||
|
bool isWipIntmRunning = false; // Flag to track if WipIntm function is running
|
||||||
|
unsigned long previousTime = 0; // Variable to store the previous time for checking elapsed time
|
||||||
|
|
||||||
|
// Default state: WipOffPark
|
||||||
|
int currentState = 0;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// Initialize input pins
|
||||||
|
pinMode(Sw0PotPin, INPUT);
|
||||||
|
pinMode(Sw1OffParkPin, INPUT);
|
||||||
|
pinMode(Sw1IntmPin, INPUT);
|
||||||
|
pinMode(Sw1LoPin, INPUT);
|
||||||
|
pinMode(Sw1HiPin, INPUT);
|
||||||
|
pinMode(Sw2LoPin, INPUT);
|
||||||
|
pinMode(Sw2OnePin, INPUT);
|
||||||
|
pinMode(Sw2TwoPin, INPUT);
|
||||||
|
pinMode(Sw2HiPin, INPUT);
|
||||||
|
pinMode(Sw3WashPin, INPUT);
|
||||||
|
|
||||||
|
// Initialize output pins
|
||||||
|
pinMode(Rly1LoPin, OUTPUT);
|
||||||
|
pinMode(Rly2HiPin, OUTPUT);
|
||||||
|
pinMode(Rly3GndPin, OUTPUT);
|
||||||
|
pinMode(Rly4WshPin, OUTPUT);
|
||||||
|
pinMode(RlyFanLoPin, OUTPUT);
|
||||||
|
pinMode(RlyFanOnePin, OUTPUT);
|
||||||
|
pinMode(RlyFanTwoPin, OUTPUT);
|
||||||
|
pinMode(RlyFanHiPin, OUTPUT);
|
||||||
|
|
||||||
|
// Default state: all relays off (WipOffPark)
|
||||||
|
digitalWrite(Rly1LoPin, LOW);
|
||||||
|
digitalWrite(Rly2HiPin, LOW);
|
||||||
|
digitalWrite(Rly3GndPin, HIGH);
|
||||||
|
digitalWrite(Rly4WshPin, HIGH);
|
||||||
|
digitalWrite(RlyFanLoPin, HIGH);
|
||||||
|
digitalWrite(RlyFanOnePin, HIGH);
|
||||||
|
digitalWrite(RlyFanTwoPin, HIGH);
|
||||||
|
digitalWrite(RlyFanHiPin, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// Read input states
|
||||||
|
int offParkState = digitalRead(Sw1OffParkPin);
|
||||||
|
int intmState = digitalRead(Sw1IntmPin);
|
||||||
|
int loState = digitalRead(Sw1LoPin);
|
||||||
|
int hiState = digitalRead(Sw1HiPin);
|
||||||
|
int sw2LoState = digitalRead(Sw2LoPin);
|
||||||
|
int sw2OneState = digitalRead(Sw2OnePin);
|
||||||
|
int sw2TwoState = digitalRead(Sw2TwoPin);
|
||||||
|
int sw2HiState = digitalRead(Sw2HiPin);
|
||||||
|
int sw3WashState = digitalRead(Sw3WashPin);
|
||||||
|
|
||||||
|
// Check input states and execute corresponding functions
|
||||||
|
if (offParkState == HIGH) {
|
||||||
|
WipOffPark();
|
||||||
|
currentState = 0; // Set current state to WipOffPark
|
||||||
|
} else if (intmState == HIGH) {
|
||||||
|
if (!isWipIntmRunning) {
|
||||||
|
WipIntm();
|
||||||
|
currentState = 1; // Set current state to WipIntm
|
||||||
|
}
|
||||||
|
} else if (loState == HIGH) {
|
||||||
|
WipLo();
|
||||||
|
currentState = 2; // Set current state to WipLo
|
||||||
|
} else if (hiState == HIGH) {
|
||||||
|
WipHi();
|
||||||
|
currentState = 3; // Set current state to WipHi
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sw2LoState == HIGH) {
|
||||||
|
Switch2Lo();
|
||||||
|
} else if (sw2OneState == HIGH) {
|
||||||
|
Switch2One();
|
||||||
|
} else if (sw2TwoState == HIGH) {
|
||||||
|
Switch2Two();
|
||||||
|
} else if (sw2HiState == HIGH) {
|
||||||
|
Switch2Hi();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sw3WashState == HIGH) {
|
||||||
|
Switch3Wash();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stop WipIntm function if no input is detected
|
||||||
|
if (currentState == 1 && isWipIntmRunning && intmState != HIGH) {
|
||||||
|
isWipIntmRunning = false;
|
||||||
|
digitalWrite(Rly3GndPin, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update waiting time based on potentiometer value
|
||||||
|
int potValue = analogRead(Sw0PotPin);
|
||||||
|
waitingTime = map(potValue, 0, 1023, 5000, 30000); // 5 seconds to 30 seconds
|
||||||
|
|
||||||
|
// Check if the waiting time has elapsed for WipIntm function
|
||||||
|
if (currentState == 1 && isWipIntmRunning && millis() - previousTime >= waitingTime) {
|
||||||
|
previousTime = millis(); // Update the previous time for the next waiting period
|
||||||
|
digitalWrite(Rly3GndPin, LOW);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(Rly3GndPin, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipOffPark() {
|
||||||
|
digitalWrite(Rly1LoPin, LOW);
|
||||||
|
digitalWrite(Rly2HiPin, LOW);
|
||||||
|
digitalWrite(Rly3GndPin, HIGH);
|
||||||
|
digitalWrite(Rly4WshPin, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipIntm() {
|
||||||
|
isWipIntmRunning = true; // Set the flag to indicate that WipIntm function is running
|
||||||
|
digitalWrite(Rly1LoPin, LOW);
|
||||||
|
digitalWrite(Rly2HiPin, LOW);
|
||||||
|
digitalWrite(Rly3GndPin, HIGH);
|
||||||
|
digitalWrite(Rly4WshPin, HIGH);
|
||||||
|
|
||||||
|
while (digitalRead(Sw1IntmPin) == HIGH && isWipIntmRunning) {
|
||||||
|
// WipIntm function code
|
||||||
|
int potValue = analogRead(Sw0PotPin);
|
||||||
|
waitingTime = map(potValue, 0, 1023, 5000, 30000); // Update waiting time based on potentiometer value
|
||||||
|
|
||||||
|
unsigned long currentTime = millis();
|
||||||
|
if (currentTime - previousTime >= waitingTime) {
|
||||||
|
previousTime = currentTime;
|
||||||
|
digitalWrite(Rly3GndPin, LOW);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(Rly3GndPin, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
isWipIntmRunning = false; // Reset the flag after the loop ends
|
||||||
|
digitalWrite(Rly3GndPin, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipLo() {
|
||||||
|
digitalWrite(Rly1LoPin, LOW);
|
||||||
|
digitalWrite(Rly2HiPin, LOW);
|
||||||
|
digitalWrite(Rly3GndPin, LOW);
|
||||||
|
digitalWrite(Rly4WshPin, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipHi() {
|
||||||
|
digitalWrite(Rly1LoPin, HIGH);
|
||||||
|
digitalWrite(Rly2HiPin, LOW);
|
||||||
|
digitalWrite(Rly3GndPin, HIGH);
|
||||||
|
digitalWrite(Rly4WshPin, LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Switch2Lo() {
|
||||||
|
digitalWrite(RlyFanLoPin, HIGH);
|
||||||
|
digitalWrite(RlyFanOnePin, HIGH);
|
||||||
|
digitalWrite(RlyFanTwoPin, HIGH);
|
||||||
|
digitalWrite(RlyFanHiPin, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Switch2One() {
|
||||||
|
digitalWrite(RlyFanLoPin, LOW);
|
||||||
|
digitalWrite(RlyFanOnePin, HIGH);
|
||||||
|
digitalWrite(RlyFanTwoPin, HIGH);
|
||||||
|
digitalWrite(RlyFanHiPin, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Switch2Two() {
|
||||||
|
digitalWrite(RlyFanLoPin, HIGH);
|
||||||
|
digitalWrite(RlyFanOnePin, LOW);
|
||||||
|
digitalWrite(RlyFanTwoPin, HIGH);
|
||||||
|
digitalWrite(RlyFanHiPin, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Switch2Hi() {
|
||||||
|
digitalWrite(RlyFanLoPin, HIGH);
|
||||||
|
digitalWrite(RlyFanOnePin, HIGH);
|
||||||
|
digitalWrite(RlyFanTwoPin, LOW);
|
||||||
|
digitalWrite(RlyFanHiPin, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Switch3Wash() {
|
||||||
|
digitalWrite(Rly1LoPin, HIGH);
|
||||||
|
digitalWrite(Rly2HiPin, LOW);
|
||||||
|
digitalWrite(Rly3GndPin, HIGH);
|
||||||
|
digitalWrite(Rly4WshPin, LOW);
|
||||||
|
}
|
||||||
128
PontiacWiperOKakaDino5/PontiacWiperOKakaDino5.ino
Normal file
128
PontiacWiperOKakaDino5/PontiacWiperOKakaDino5.ino
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
// Pin Definitions
|
||||||
|
const int Sw0PotPin = A6;
|
||||||
|
const int Sw1OffParkPin = 2;
|
||||||
|
const int Sw1IntmPin = 3;
|
||||||
|
const int Sw1LoPin = 4;
|
||||||
|
const int Sw1HiPin = 5;
|
||||||
|
const int Rly1LoPin = 13;
|
||||||
|
const int Rly2HiPin = 14;
|
||||||
|
const int Rly3GndPin = 15;
|
||||||
|
const int Rly4WshPin = 16;
|
||||||
|
|
||||||
|
// Global Variables
|
||||||
|
int waitingTime = 5000; // Default waiting time in milliseconds (5 seconds)
|
||||||
|
bool isWipIntmRunning = false; // Flag to track if WipIntm function is running
|
||||||
|
unsigned long previousTime = 0; // Variable to store the previous time for checking elapsed time
|
||||||
|
|
||||||
|
// Default state: WipOffPark
|
||||||
|
int currentState = 0;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// Initialize input pins
|
||||||
|
pinMode(Sw0PotPin, INPUT);
|
||||||
|
pinMode(Sw1OffParkPin, INPUT);
|
||||||
|
pinMode(Sw1IntmPin, INPUT);
|
||||||
|
pinMode(Sw1LoPin, INPUT);
|
||||||
|
pinMode(Sw1HiPin, INPUT);
|
||||||
|
|
||||||
|
// Initialize output pins
|
||||||
|
pinMode(Rly1LoPin, OUTPUT);
|
||||||
|
pinMode(Rly2HiPin, OUTPUT);
|
||||||
|
pinMode(Rly3GndPin, OUTPUT);
|
||||||
|
pinMode(Rly4WshPin, OUTPUT);
|
||||||
|
|
||||||
|
// Default state: all relays off (WipOffPark)
|
||||||
|
digitalWrite(Rly1LoPin, LOW);
|
||||||
|
digitalWrite(Rly2HiPin, LOW);
|
||||||
|
digitalWrite(Rly3GndPin, HIGH);
|
||||||
|
digitalWrite(Rly4WshPin, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// Read input states
|
||||||
|
int offParkState = digitalRead(Sw1OffParkPin);
|
||||||
|
int intmState = digitalRead(Sw1IntmPin);
|
||||||
|
int loState = digitalRead(Sw1LoPin);
|
||||||
|
int hiState = digitalRead(Sw1HiPin);
|
||||||
|
|
||||||
|
// Check input states and execute corresponding functions
|
||||||
|
if (offParkState == HIGH) {
|
||||||
|
WipOffPark();
|
||||||
|
currentState = 0; // Set current state to WipOffPark
|
||||||
|
} else if (intmState == HIGH) {
|
||||||
|
if (!isWipIntmRunning) {
|
||||||
|
WipIntm();
|
||||||
|
currentState = 1; // Set current state to WipIntm
|
||||||
|
}
|
||||||
|
} else if (loState == HIGH) {
|
||||||
|
WipLo();
|
||||||
|
currentState = 2; // Set current state to WipLo
|
||||||
|
} else if (hiState == HIGH) {
|
||||||
|
WipHi();
|
||||||
|
currentState = 3; // Set current state to WipHi
|
||||||
|
} else {
|
||||||
|
// Stop WipIntm function if no input is detected
|
||||||
|
if (currentState == 1 && isWipIntmRunning) {
|
||||||
|
isWipIntmRunning = false;
|
||||||
|
digitalWrite(Rly3GndPin, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update waiting time based on potentiometer value
|
||||||
|
int potValue = analogRead(Sw0PotPin);
|
||||||
|
waitingTime = map(potValue, 0, 1023, 5000, 30000); // 5 seconds to 30 seconds
|
||||||
|
|
||||||
|
// Check if the waiting time has elapsed for WipIntm function
|
||||||
|
if (currentState == 1 && isWipIntmRunning && millis() - previousTime >= waitingTime) {
|
||||||
|
previousTime = millis(); // Update the previous time for the next waiting period
|
||||||
|
digitalWrite(Rly3GndPin, LOW);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(Rly3GndPin, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipOffPark() {
|
||||||
|
digitalWrite(Rly1LoPin, LOW);
|
||||||
|
digitalWrite(Rly2HiPin, LOW);
|
||||||
|
digitalWrite(Rly3GndPin, HIGH);
|
||||||
|
digitalWrite(Rly4WshPin, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipIntm() {
|
||||||
|
isWipIntmRunning = true; // Set the flag to indicate that WipIntm function is running
|
||||||
|
digitalWrite(Rly1LoPin, LOW);
|
||||||
|
digitalWrite(Rly2HiPin, LOW);
|
||||||
|
digitalWrite(Rly3GndPin, HIGH);
|
||||||
|
digitalWrite(Rly4WshPin, HIGH);
|
||||||
|
|
||||||
|
while (digitalRead(Sw1IntmPin) == HIGH && isWipIntmRunning) {
|
||||||
|
// WipIntm function code
|
||||||
|
int potValue = analogRead(Sw0PotPin);
|
||||||
|
waitingTime = map(potValue, 0, 1023, 5000, 30000); // Update waiting time based on potentiometer value
|
||||||
|
|
||||||
|
unsigned long currentTime = millis();
|
||||||
|
if (currentTime - previousTime >= waitingTime) {
|
||||||
|
previousTime = currentTime;
|
||||||
|
digitalWrite(Rly3GndPin, LOW);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(Rly3GndPin, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
isWipIntmRunning = false; // Reset the flag after the loop ends
|
||||||
|
digitalWrite(Rly3GndPin, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipLo() {
|
||||||
|
digitalWrite(Rly1LoPin, LOW);
|
||||||
|
digitalWrite(Rly2HiPin, LOW);
|
||||||
|
digitalWrite(Rly3GndPin, LOW);
|
||||||
|
digitalWrite(Rly4WshPin, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WipHi() {
|
||||||
|
digitalWrite(Rly1LoPin, HIGH);
|
||||||
|
digitalWrite(Rly2HiPin, LOW);
|
||||||
|
digitalWrite(Rly3GndPin, LOW);
|
||||||
|
digitalWrite(Rly4WshPin, HIGH);
|
||||||
|
}
|
||||||
5
README.md
Normal file
5
README.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# Arduino projects
|
||||||
|
|
||||||
|
*All my Arduino projects in one place.*
|
||||||
|
|
||||||
|
|
||||||
124
TempOLED/TempOLED.ino
Normal file
124
TempOLED/TempOLED.ino
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_SSD1306.h>
|
||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
|
||||||
|
// Define OLED display parameters
|
||||||
|
#define SCREEN_WIDTH 128
|
||||||
|
#define SCREEN_HEIGHT 64
|
||||||
|
#define OLED_RESET -1
|
||||||
|
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||||
|
|
||||||
|
// Define DS18B20 data pin
|
||||||
|
#define ONE_WIRE_BUS 2
|
||||||
|
OneWire oneWire(ONE_WIRE_BUS);
|
||||||
|
DallasTemperature sensors(&oneWire);
|
||||||
|
|
||||||
|
// Define digital output pins
|
||||||
|
const int outputPin1 = 3;
|
||||||
|
const int outputPin2 = 4;
|
||||||
|
|
||||||
|
// Define digital input pins for overrides
|
||||||
|
const int inputPin1 = 5;
|
||||||
|
const int inputPin2 = 6;
|
||||||
|
|
||||||
|
// Variables to track digital input states
|
||||||
|
bool input1State = false;
|
||||||
|
bool input2State = false;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// Initialize the OLED display
|
||||||
|
if(!display.begin(0x3C, OLED_RESET, SDA, SCL)) {
|
||||||
|
Serial.println(F("SSD1306 allocation failed"));
|
||||||
|
for(;;);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize DS18B20 sensor
|
||||||
|
sensors.begin();
|
||||||
|
|
||||||
|
// Set digital output pins as OUTPUT
|
||||||
|
pinMode(outputPin1, OUTPUT);
|
||||||
|
pinMode(outputPin2, OUTPUT);
|
||||||
|
|
||||||
|
// Set digital input pins as INPUT_PULLUP
|
||||||
|
pinMode(inputPin1, INPUT_PULLUP);
|
||||||
|
pinMode(inputPin2, INPUT_PULLUP);
|
||||||
|
|
||||||
|
// Initialize Serial communication
|
||||||
|
Serial.begin(9600);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// Request temperature from DS18B20 sensor
|
||||||
|
sensors.requestTemperatures();
|
||||||
|
float temperatureC = sensors.getTempCByIndex(0);
|
||||||
|
|
||||||
|
// Display temperature on OLED
|
||||||
|
display.clearDisplay();
|
||||||
|
display.setTextSize(1);
|
||||||
|
display.setTextColor(SSD1306_WHITE);
|
||||||
|
display.setCursor(0,0);
|
||||||
|
display.print(F("Temperature: "));
|
||||||
|
display.print(temperatureC);
|
||||||
|
display.print(F("C"));
|
||||||
|
|
||||||
|
// Display blank line
|
||||||
|
display.setCursor(0, 20);
|
||||||
|
display.println();
|
||||||
|
|
||||||
|
// Display digital output status
|
||||||
|
display.print(F("Fan 1: "));
|
||||||
|
display.setTextColor(digitalRead(outputPin1) == HIGH ? SSD1306_WHITE : SSD1306_WHITE);
|
||||||
|
display.println(digitalRead(outputPin1) == HIGH ? "On" : "Off");
|
||||||
|
display.setTextColor(SSD1306_WHITE);
|
||||||
|
|
||||||
|
display.print(F("Fan 2: "));
|
||||||
|
display.setTextColor(digitalRead(outputPin2) == HIGH ? SSD1306_WHITE : SSD1306_WHITE);
|
||||||
|
display.println(digitalRead(outputPin2) == HIGH ? "On" : "Off");
|
||||||
|
display.setTextColor(SSD1306_WHITE);
|
||||||
|
|
||||||
|
display.display();
|
||||||
|
|
||||||
|
// Check temperature thresholds and control digital outputs
|
||||||
|
if (temperatureC >= 97) {
|
||||||
|
digitalWrite(outputPin1, HIGH);
|
||||||
|
} else if (temperatureC <= 86) {
|
||||||
|
digitalWrite(outputPin1, LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (temperatureC >= 106) {
|
||||||
|
digitalWrite(outputPin2, HIGH);
|
||||||
|
} else if (temperatureC <= 94) {
|
||||||
|
digitalWrite(outputPin2, LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check digital input overrides
|
||||||
|
bool newInput1State = digitalRead(inputPin1) == HIGH;
|
||||||
|
bool newInput2State = digitalRead(inputPin2) == HIGH;
|
||||||
|
|
||||||
|
if (newInput1State && !input1State) {
|
||||||
|
// Digital input 1 turned on, turn on Fan 1
|
||||||
|
digitalWrite(outputPin1, HIGH);
|
||||||
|
} else if (newInput2State && !input2State && !newInput1State) {
|
||||||
|
// Digital input 2 turned on (and input 1 is off), turn on Fan 1 and Fan 2
|
||||||
|
digitalWrite(outputPin1, HIGH);
|
||||||
|
digitalWrite(outputPin2, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update input states
|
||||||
|
input1State = newInput1State;
|
||||||
|
input2State = newInput2State;
|
||||||
|
|
||||||
|
// Print temperature and output status to Serial Monitor
|
||||||
|
Serial.print(F("Temperature: "));
|
||||||
|
Serial.print(temperatureC);
|
||||||
|
Serial.println(F("C"));
|
||||||
|
Serial.print(F("Fan 1: "));
|
||||||
|
Serial.println(digitalRead(outputPin1) == HIGH ? "On" : "Off");
|
||||||
|
Serial.print(F("Fan 2: "));
|
||||||
|
Serial.println(digitalRead(outputPin2) == HIGH ? "On" : "Off");
|
||||||
|
|
||||||
|
// Delay for a moment to avoid rapid updates
|
||||||
|
delay(1000);
|
||||||
|
}
|
||||||
@@ -0,0 +1,166 @@
|
|||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_SH110X.h>
|
||||||
|
|
||||||
|
#define i2c_Address 0x3C // OLED Adress.
|
||||||
|
#define SCREEN_WIDTH 128
|
||||||
|
#define SCREEN_HEIGHT 64
|
||||||
|
#define OLED_RESET -1
|
||||||
|
|
||||||
|
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||||
|
|
||||||
|
float tempForFanStartup = 22.0; // 82c/175.0F target low temp. below this temperature, the fan will be off
|
||||||
|
float tempForFanOnFull = 31.0; // 105c/210.0F target High temp. above this temperature, the fan will be on at full power
|
||||||
|
float tempForIdiotLight = 26.0; //115c
|
||||||
|
|
||||||
|
float voltsForFanStartup = 2.0; // Roughly the signal voltage that triggers the mazda module's slowest speed.
|
||||||
|
// A higher voltage here will effectively increase the fans lowest speed target.
|
||||||
|
|
||||||
|
const int fanPwmOutPin = 6; // Arduino forces this pin to 0 or 5 volts.
|
||||||
|
const int idiotLightPin = 8;
|
||||||
|
const int tempSensorPin = 7; // Pin to read from the DS1820 temp sensor.
|
||||||
|
const int temp2SensorPin = 9;
|
||||||
|
const int LEDpin = 15;
|
||||||
|
int pwmDuty; // The calculated PWM duty is stored here
|
||||||
|
float pwmMinStartupDuty; // the starting duty is stored here (mazda module starts fans at about 24 % duty)
|
||||||
|
float currTemperature; // the temperature in C is stored here
|
||||||
|
float curr2Temperature; // redundant temp sensor in C stored here
|
||||||
|
float idiotLight;
|
||||||
|
|
||||||
|
OneWire oneWire1 (tempSensorPin);
|
||||||
|
DallasTemperature sensorClt1(&oneWire1);
|
||||||
|
OneWire oneWire2 (temp2SensorPin);
|
||||||
|
DallasTemperature sensorClt2(&oneWire2);
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(115200); // set up serial port for 115200 baud (optional)
|
||||||
|
sensorClt1.begin();
|
||||||
|
sensorClt2.begin();
|
||||||
|
sensorClt1.requestTemperatures();
|
||||||
|
currTemperature = sensorClt1.getTempCByIndex(0);
|
||||||
|
sensorClt2.requestTemperatures();
|
||||||
|
curr2Temperature = sensorClt2.getTempCByIndex(0);
|
||||||
|
//pinMode(tempSensorPin, INPUT);
|
||||||
|
//pinMode(temp2SensorPin, INPUT);
|
||||||
|
|
||||||
|
pinMode(LEDpin, OUTPUT);
|
||||||
|
//analogWrite(fanPwmOutPin, 0); // turn the fan off at start
|
||||||
|
digitalWrite(idiotLightPin, LOW);
|
||||||
|
idiotLight = LOW;
|
||||||
|
|
||||||
|
ledcSetup(0, 20000, 8);
|
||||||
|
ledcAttachPin(fanPwmOutPin, 0);
|
||||||
|
|
||||||
|
ledcWrite(0, 0);
|
||||||
|
|
||||||
|
if (!display.begin(i2c_Address)) {
|
||||||
|
Serial.println(F("SH110X allocation failed"));
|
||||||
|
for (;;);
|
||||||
|
}
|
||||||
|
|
||||||
|
pwmMinStartupDuty = (voltsForFanStartup / 5.0) * 255.0; // convert the Mazda starting voltage to a PWM duty
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
readAndTranslateTempSensor();
|
||||||
|
calculate_and_send_PWM();
|
||||||
|
idiotLightAlarm();
|
||||||
|
displayOutput();
|
||||||
|
LEDblink();
|
||||||
|
//print_to_serial_port();
|
||||||
|
delay(20);
|
||||||
|
}
|
||||||
|
|
||||||
|
void calculate_and_send_PWM() {
|
||||||
|
if (currTemperature < tempForFanStartup) { // If the temperature is below the lowest setpoint, turn fan off
|
||||||
|
//analogWrite(fanPwmOutPin, 0); // PWM duty = 0 percent
|
||||||
|
ledcWrite(0, 0);
|
||||||
|
pwmDuty = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (currTemperature > tempForFanOnFull) { // If the temperature is above the highest setpoint, turn fan on full
|
||||||
|
//analogWrite(fanPwmOutPin, 255); // PWM duty = 100 percent
|
||||||
|
ledcWrite(0, 255);
|
||||||
|
pwmDuty = 255;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
float tempRange = tempForFanOnFull - tempForFanStartup ; // start calculating duty cycle
|
||||||
|
float pwmRange = 255.0 - pwmMinStartupDuty ;
|
||||||
|
float pwmDutyPct = (currTemperature - tempForFanStartup) / tempRange ;
|
||||||
|
|
||||||
|
pwmDuty = (int) (pwmMinStartupDuty + (pwmDutyPct * pwmRange) +.5); // actual PWM duty is calculated here
|
||||||
|
|
||||||
|
if (pwmDuty > 255) { // make sure duty ended up between 255 and 0
|
||||||
|
pwmDuty = 255;
|
||||||
|
}
|
||||||
|
if (pwmDuty < 0) {
|
||||||
|
pwmDuty = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//analogWrite(fanPwmOutPin, pwmDuty); // write PWM duty to PWM output pin
|
||||||
|
ledcWrite(0, pwmDuty);
|
||||||
|
}
|
||||||
|
|
||||||
|
void readAndTranslateTempSensor() {
|
||||||
|
//float currTemperature;
|
||||||
|
sensorClt1.requestTemperatures();
|
||||||
|
currTemperature = sensorClt1.getTempCByIndex(0);
|
||||||
|
|
||||||
|
sensorClt2.requestTemperatures();
|
||||||
|
curr2Temperature = sensorClt2.getTempCByIndex(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayOutput() {
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
display.setTextSize(1);
|
||||||
|
display.setTextColor(SH110X_WHITE);
|
||||||
|
|
||||||
|
// Display temperature on the screen in Celsius with one decimal place
|
||||||
|
display.setCursor(10, 10);
|
||||||
|
display.print("Temp:");
|
||||||
|
display.setCursor(40, 10);
|
||||||
|
display.print(currTemperature, 2); // Display one decimal place
|
||||||
|
display.setCursor(80, 10);
|
||||||
|
display.print("/ ");
|
||||||
|
display.print(curr2Temperature, 2);
|
||||||
|
|
||||||
|
display.setCursor(10, 20);
|
||||||
|
display.print("PWMd:");
|
||||||
|
display.setCursor(40, 20);
|
||||||
|
display.print(pwmDuty);
|
||||||
|
|
||||||
|
display.setCursor(10, 30);
|
||||||
|
display.print("Lamp:");
|
||||||
|
display.setCursor(40, 30);
|
||||||
|
display.print(idiotLight, 0);
|
||||||
|
|
||||||
|
// Update the display
|
||||||
|
display.display();
|
||||||
|
}
|
||||||
|
|
||||||
|
void idiotLightAlarm() {
|
||||||
|
if (currTemperature > tempForIdiotLight) {
|
||||||
|
digitalWrite(idiotLightPin, HIGH);
|
||||||
|
idiotLight = HIGH;
|
||||||
|
}
|
||||||
|
else if (currTemperature < tempForIdiotLight) {
|
||||||
|
digitalWrite(idiotLightPin, LOW);
|
||||||
|
idiotLight = LOW;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LEDblink() {
|
||||||
|
digitalWrite(LEDpin, HIGH);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(LEDpin, LOW);
|
||||||
|
delay(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_to_serial_port() {
|
||||||
|
Serial.print(F("currTemperature C: ")); Serial.print(currTemperature);
|
||||||
|
Serial.print(F(" pwmDuty: ")); Serial.println(pwmDuty);
|
||||||
|
}
|
||||||
228
WiperFanWasher_Almost_OK/WiperFanWasher_Almost_OK.ino
Normal file
228
WiperFanWasher_Almost_OK/WiperFanWasher_Almost_OK.ino
Normal file
@@ -0,0 +1,228 @@
|
|||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
// Define pin numbers
|
||||||
|
const int RELAY_PIN_1 = 13;
|
||||||
|
const int RELAY_PIN_2 = 14;
|
||||||
|
const int RELAY_PIN_3 = 15;
|
||||||
|
const int RELAY_PIN_4 = 16;
|
||||||
|
const int RELAY_PIN_5 = 17;
|
||||||
|
const int RELAY_PIN_6 = 18;
|
||||||
|
const int RELAY_PIN_7 = 19;
|
||||||
|
const int RELAY_PIN_8 = 12;
|
||||||
|
|
||||||
|
const int WASHER_SWITCH_PIN = 11;
|
||||||
|
const int WIPER_SWITCH_PIN_1 = 2;
|
||||||
|
const int WIPER_SWITCH_PIN_2 = 3;
|
||||||
|
const int WIPER_SWITCH_PIN_3 = 4;
|
||||||
|
const int WIPER_SWITCH_PIN_4 = 5;
|
||||||
|
const int WIPER_SWITCH_PIN_5 = 6;
|
||||||
|
const int FAN_SWITCH_PIN_1 = 7;
|
||||||
|
const int FAN_SWITCH_PIN_2 = 8;
|
||||||
|
const int FAN_SWITCH_PIN_3 = 9;
|
||||||
|
const int FAN_SWITCH_PIN_4 = 10;
|
||||||
|
|
||||||
|
// Wiper motor states
|
||||||
|
bool isWiperParked = true;
|
||||||
|
bool isWiperIntermittentLow = false;
|
||||||
|
bool isWiperIntermittentHigh = false;
|
||||||
|
bool isWiperLow = false;
|
||||||
|
bool isWiperHigh = false;
|
||||||
|
|
||||||
|
// Washer motor state
|
||||||
|
bool isWasherOn = false;
|
||||||
|
|
||||||
|
// Fan motor states
|
||||||
|
bool isFanLow = false;
|
||||||
|
bool isFan1 = false;
|
||||||
|
bool isFan2 = false;
|
||||||
|
bool isFanHigh = false;
|
||||||
|
|
||||||
|
// Timer variables for intermittent states
|
||||||
|
unsigned long intermittentLowStartTime = 0;
|
||||||
|
unsigned long intermittentHighStartTime = 0;
|
||||||
|
const unsigned long intermittentLowInterval = 8000; // 8 seconds
|
||||||
|
const unsigned long intermittentHighInterval = 12000; // 12 seconds
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// Initialize relay pins as outputs
|
||||||
|
pinMode(RELAY_PIN_1, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_2, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_3, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_4, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_5, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_6, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_7, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_8, OUTPUT);
|
||||||
|
|
||||||
|
// Initialize switch pins as inputs
|
||||||
|
pinMode(WASHER_SWITCH_PIN, INPUT);
|
||||||
|
pinMode(WIPER_SWITCH_PIN_1, INPUT);
|
||||||
|
pinMode(WIPER_SWITCH_PIN_2, INPUT);
|
||||||
|
pinMode(WIPER_SWITCH_PIN_3, INPUT);
|
||||||
|
pinMode(WIPER_SWITCH_PIN_4, INPUT);
|
||||||
|
pinMode(WIPER_SWITCH_PIN_5, INPUT);
|
||||||
|
pinMode(FAN_SWITCH_PIN_1, INPUT);
|
||||||
|
pinMode(FAN_SWITCH_PIN_2, INPUT);
|
||||||
|
pinMode(FAN_SWITCH_PIN_3, INPUT);
|
||||||
|
pinMode(FAN_SWITCH_PIN_4, INPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
checkWiperSwitch();
|
||||||
|
checkWasherSwitch();
|
||||||
|
checkFanSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
void checkWiperSwitch() {
|
||||||
|
if (digitalRead(WIPER_SWITCH_PIN_1) == HIGH) {
|
||||||
|
// Wiper parking/off/default state
|
||||||
|
isWiperParked = true;
|
||||||
|
isWiperIntermittentLow = false;
|
||||||
|
isWiperIntermittentHigh = false;
|
||||||
|
isWiperLow = false;
|
||||||
|
isWiperHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_1, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_2, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_3, HIGH);
|
||||||
|
} else if (digitalRead(WIPER_SWITCH_PIN_2) == HIGH) {
|
||||||
|
// Intermittent low state
|
||||||
|
isWiperParked = false;
|
||||||
|
isWiperIntermittentLow = true;
|
||||||
|
isWiperIntermittentHigh = false;
|
||||||
|
isWiperLow = false;
|
||||||
|
isWiperHigh = false;
|
||||||
|
|
||||||
|
if (intermittentLowStartTime == 0) {
|
||||||
|
intermittentLowStartTime = millis();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (millis() - intermittentLowStartTime >= intermittentLowInterval) {
|
||||||
|
intermittentLowStartTime = millis();
|
||||||
|
digitalWrite(RELAY_PIN_3, LOW);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(RELAY_PIN_3, HIGH);
|
||||||
|
}
|
||||||
|
} else if (digitalRead(WIPER_SWITCH_PIN_3) == HIGH) {
|
||||||
|
// Intermittent high state
|
||||||
|
isWiperParked = false;
|
||||||
|
isWiperIntermittentLow = false;
|
||||||
|
isWiperIntermittentHigh = true;
|
||||||
|
isWiperLow = false;
|
||||||
|
isWiperHigh = false;
|
||||||
|
|
||||||
|
if (intermittentHighStartTime == 0) {
|
||||||
|
intermittentHighStartTime = millis();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (millis() - intermittentHighStartTime >= intermittentHighInterval) {
|
||||||
|
intermittentHighStartTime = millis();
|
||||||
|
digitalWrite(RELAY_PIN_3, HIGH);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(RELAY_PIN_3, LOW);
|
||||||
|
}
|
||||||
|
} else if (digitalRead(WIPER_SWITCH_PIN_4) == HIGH) {
|
||||||
|
// Wiper low state
|
||||||
|
isWiperParked = false;
|
||||||
|
isWiperIntermittentLow = false;
|
||||||
|
isWiperIntermittentHigh = false;
|
||||||
|
isWiperLow = true;
|
||||||
|
isWiperHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_1, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_2, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_3, LOW);
|
||||||
|
} else if (digitalRead(WIPER_SWITCH_PIN_5) == HIGH) {
|
||||||
|
// Wiper high state
|
||||||
|
isWiperParked = false;
|
||||||
|
isWiperIntermittentLow = false;
|
||||||
|
isWiperIntermittentHigh = false;
|
||||||
|
isWiperLow = false;
|
||||||
|
isWiperHigh = true;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_1, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_2, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_3, LOW);
|
||||||
|
} else {
|
||||||
|
// Default to wiper parking/off/default state
|
||||||
|
isWiperParked = true;
|
||||||
|
isWiperIntermittentLow = false;
|
||||||
|
isWiperIntermittentHigh = false;
|
||||||
|
isWiperLow = false;
|
||||||
|
isWiperHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_1, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_2, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_3, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void checkWasherSwitch() {
|
||||||
|
if (digitalRead(WASHER_SWITCH_PIN) == HIGH) {
|
||||||
|
// Washer motor control
|
||||||
|
isWasherOn = true;
|
||||||
|
digitalWrite(RELAY_PIN_4, LOW); // Inverted
|
||||||
|
} else {
|
||||||
|
isWasherOn = false;
|
||||||
|
digitalWrite(RELAY_PIN_4, HIGH); // Inverted
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void checkFanSwitch() {
|
||||||
|
if (digitalRead(FAN_SWITCH_PIN_1) == HIGH) {
|
||||||
|
// Fan motor low state
|
||||||
|
isFanLow = true;
|
||||||
|
isFan1 = false;
|
||||||
|
isFan2 = false;
|
||||||
|
isFanHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_5, LOW); // Inverted
|
||||||
|
digitalWrite(RELAY_PIN_6, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_7, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_8, HIGH);
|
||||||
|
} else if (digitalRead(FAN_SWITCH_PIN_2) == HIGH) {
|
||||||
|
// Fan motor 1 state
|
||||||
|
isFanLow = false;
|
||||||
|
isFan1 = true;
|
||||||
|
isFan2 = false;
|
||||||
|
isFanHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_5, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_6, LOW); // Inverted
|
||||||
|
digitalWrite(RELAY_PIN_7, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_8, HIGH);
|
||||||
|
} else if (digitalRead(FAN_SWITCH_PIN_3) == HIGH) {
|
||||||
|
// Fan motor 2 state
|
||||||
|
isFanLow = false;
|
||||||
|
isFan1 = false;
|
||||||
|
isFan2 = true;
|
||||||
|
isFanHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_5, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_6, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_7, LOW); // Inverted
|
||||||
|
digitalWrite(RELAY_PIN_8, HIGH);
|
||||||
|
} else if (digitalRead(FAN_SWITCH_PIN_4) == HIGH) {
|
||||||
|
// Fan motor high state
|
||||||
|
isFanLow = false;
|
||||||
|
isFan1 = false;
|
||||||
|
isFan2 = false;
|
||||||
|
isFanHigh = true;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_5, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_6, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_7, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_8, LOW); // Inverted
|
||||||
|
} else {
|
||||||
|
// Default to fan motor off state
|
||||||
|
isFanLow = false;
|
||||||
|
isFan1 = false;
|
||||||
|
isFan2 = false;
|
||||||
|
isFanHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_5, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_6, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_7, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_8, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,228 @@
|
|||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
// Define pin numbers
|
||||||
|
const int RELAY_PIN_1 = 13;
|
||||||
|
const int RELAY_PIN_2 = 14;
|
||||||
|
const int RELAY_PIN_3 = 15;
|
||||||
|
const int RELAY_PIN_4 = 16;
|
||||||
|
const int RELAY_PIN_5 = 17;
|
||||||
|
const int RELAY_PIN_6 = 18;
|
||||||
|
const int RELAY_PIN_7 = 19;
|
||||||
|
const int RELAY_PIN_8 = 12;
|
||||||
|
|
||||||
|
const int WASHER_SWITCH_PIN = 11;
|
||||||
|
const int WIPER_SWITCH_PIN_1 = 2;
|
||||||
|
const int WIPER_SWITCH_PIN_2 = 3;
|
||||||
|
const int WIPER_SWITCH_PIN_3 = 4;
|
||||||
|
const int WIPER_SWITCH_PIN_4 = 5;
|
||||||
|
const int WIPER_SWITCH_PIN_5 = 6;
|
||||||
|
const int FAN_SWITCH_PIN_1 = 7;
|
||||||
|
const int FAN_SWITCH_PIN_2 = 8;
|
||||||
|
const int FAN_SWITCH_PIN_3 = 9;
|
||||||
|
const int FAN_SWITCH_PIN_4 = 10;
|
||||||
|
|
||||||
|
// Wiper motor states
|
||||||
|
bool isWiperParked = true;
|
||||||
|
bool isWiperIntermittentLow = false;
|
||||||
|
bool isWiperIntermittentHigh = false;
|
||||||
|
bool isWiperLow = false;
|
||||||
|
bool isWiperHigh = false;
|
||||||
|
|
||||||
|
// Washer motor state
|
||||||
|
bool isWasherOn = false;
|
||||||
|
|
||||||
|
// Fan motor states
|
||||||
|
bool isFanLow = false;
|
||||||
|
bool isFan1 = false;
|
||||||
|
bool isFan2 = false;
|
||||||
|
bool isFanHigh = false;
|
||||||
|
|
||||||
|
// Timer variables for intermittent states
|
||||||
|
unsigned long intermittentLowStartTime = 0;
|
||||||
|
unsigned long intermittentHighStartTime = 0;
|
||||||
|
const unsigned long intermittentLowInterval = 8000; // 8 seconds
|
||||||
|
const unsigned long intermittentHighInterval = 16000; // 16 seconds
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// Initialize relay pins as outputs
|
||||||
|
pinMode(RELAY_PIN_1, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_2, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_3, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_4, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_5, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_6, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_7, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_8, OUTPUT);
|
||||||
|
|
||||||
|
// Initialize switch pins as inputs
|
||||||
|
pinMode(WASHER_SWITCH_PIN, INPUT);
|
||||||
|
pinMode(WIPER_SWITCH_PIN_1, INPUT);
|
||||||
|
pinMode(WIPER_SWITCH_PIN_2, INPUT);
|
||||||
|
pinMode(WIPER_SWITCH_PIN_3, INPUT);
|
||||||
|
pinMode(WIPER_SWITCH_PIN_4, INPUT);
|
||||||
|
pinMode(WIPER_SWITCH_PIN_5, INPUT);
|
||||||
|
pinMode(FAN_SWITCH_PIN_1, INPUT);
|
||||||
|
pinMode(FAN_SWITCH_PIN_2, INPUT);
|
||||||
|
pinMode(FAN_SWITCH_PIN_3, INPUT);
|
||||||
|
pinMode(FAN_SWITCH_PIN_4, INPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
checkWiperSwitch();
|
||||||
|
checkWasherSwitch();
|
||||||
|
checkFanSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
void checkWiperSwitch() {
|
||||||
|
if (digitalRead(WIPER_SWITCH_PIN_1) == HIGH) {
|
||||||
|
// Wiper parking/off/default state
|
||||||
|
isWiperParked = true;
|
||||||
|
isWiperIntermittentLow = false;
|
||||||
|
isWiperIntermittentHigh = false;
|
||||||
|
isWiperLow = false;
|
||||||
|
isWiperHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_1, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_2, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_3, HIGH);
|
||||||
|
} else if (digitalRead(WIPER_SWITCH_PIN_2) == HIGH) {
|
||||||
|
// Intermittent low state
|
||||||
|
isWiperParked = false;
|
||||||
|
isWiperIntermittentLow = true;
|
||||||
|
isWiperIntermittentHigh = false;
|
||||||
|
isWiperLow = false;
|
||||||
|
isWiperHigh = false;
|
||||||
|
|
||||||
|
if (intermittentLowStartTime == 0) {
|
||||||
|
intermittentLowStartTime = millis();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (millis() - intermittentLowStartTime >= intermittentLowInterval) {
|
||||||
|
intermittentLowStartTime = millis();
|
||||||
|
digitalWrite(RELAY_PIN_3, LOW);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(RELAY_PIN_3, HIGH);
|
||||||
|
}
|
||||||
|
} else if (digitalRead(WIPER_SWITCH_PIN_3) == HIGH) {
|
||||||
|
// Intermittent high state
|
||||||
|
isWiperParked = false;
|
||||||
|
isWiperIntermittentLow = false;
|
||||||
|
isWiperIntermittentHigh = true;
|
||||||
|
isWiperLow = false;
|
||||||
|
isWiperHigh = false;
|
||||||
|
|
||||||
|
if (intermittentHighStartTime == 0) {
|
||||||
|
intermittentHighStartTime = millis();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (millis() - intermittentHighStartTime >= intermittentHighInterval) {
|
||||||
|
intermittentHighStartTime = millis();
|
||||||
|
digitalWrite(RELAY_PIN_3, LOW);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(RELAY_PIN_3, HIGH);
|
||||||
|
}
|
||||||
|
} else if (digitalRead(WIPER_SWITCH_PIN_4) == HIGH) {
|
||||||
|
// Wiper low state
|
||||||
|
isWiperParked = false;
|
||||||
|
isWiperIntermittentLow = false;
|
||||||
|
isWiperIntermittentHigh = false;
|
||||||
|
isWiperLow = true;
|
||||||
|
isWiperHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_1, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_2, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_3, LOW);
|
||||||
|
} else if (digitalRead(WIPER_SWITCH_PIN_5) == HIGH) {
|
||||||
|
// Wiper high state
|
||||||
|
isWiperParked = false;
|
||||||
|
isWiperIntermittentLow = false;
|
||||||
|
isWiperIntermittentHigh = false;
|
||||||
|
isWiperLow = false;
|
||||||
|
isWiperHigh = true;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_1, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_2, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_3, LOW);
|
||||||
|
} else {
|
||||||
|
// Default to wiper parking/off/default state
|
||||||
|
isWiperParked = true;
|
||||||
|
isWiperIntermittentLow = false;
|
||||||
|
isWiperIntermittentHigh = false;
|
||||||
|
isWiperLow = false;
|
||||||
|
isWiperHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_1, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_2, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_3, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void checkWasherSwitch() {
|
||||||
|
if (digitalRead(WASHER_SWITCH_PIN) == HIGH) {
|
||||||
|
// Washer motor control, relay 4
|
||||||
|
isWasherOn = true;
|
||||||
|
digitalWrite(RELAY_PIN_4, LOW);
|
||||||
|
} else {
|
||||||
|
isWasherOn = false;
|
||||||
|
digitalWrite(RELAY_PIN_4, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void checkFanSwitch() {
|
||||||
|
if (digitalRead(FAN_SWITCH_PIN_1) == HIGH) {
|
||||||
|
// Fan motor low state
|
||||||
|
isFanLow = true;
|
||||||
|
isFan1 = false;
|
||||||
|
isFan2 = false;
|
||||||
|
isFanHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_5, LOW); // Inverted
|
||||||
|
digitalWrite(RELAY_PIN_6, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_7, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_8, HIGH);
|
||||||
|
} else if (digitalRead(FAN_SWITCH_PIN_2) == HIGH) {
|
||||||
|
// Fan motor 1 state
|
||||||
|
isFanLow = false;
|
||||||
|
isFan1 = true;
|
||||||
|
isFan2 = false;
|
||||||
|
isFanHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_5, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_6, LOW); // Inverted
|
||||||
|
digitalWrite(RELAY_PIN_7, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_8, HIGH);
|
||||||
|
} else if (digitalRead(FAN_SWITCH_PIN_3) == HIGH) {
|
||||||
|
// Fan motor 2 state
|
||||||
|
isFanLow = false;
|
||||||
|
isFan1 = false;
|
||||||
|
isFan2 = true;
|
||||||
|
isFanHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_5, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_6, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_7, LOW); // Inverted
|
||||||
|
digitalWrite(RELAY_PIN_8, HIGH);
|
||||||
|
} else if (digitalRead(FAN_SWITCH_PIN_4) == HIGH) {
|
||||||
|
// Fan motor high state
|
||||||
|
isFanLow = false;
|
||||||
|
isFan1 = false;
|
||||||
|
isFan2 = false;
|
||||||
|
isFanHigh = true;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_5, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_6, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_7, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_8, LOW); // Inverted
|
||||||
|
} else {
|
||||||
|
// Default to fan motor off state
|
||||||
|
isFanLow = false;
|
||||||
|
isFan1 = false;
|
||||||
|
isFan2 = false;
|
||||||
|
isFanHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_5, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_6, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_7, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_8, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
228
WiperFanWasher_OK_minor_bugs/WiperFanWasher_OK_minor_bugs.ino
Normal file
228
WiperFanWasher_OK_minor_bugs/WiperFanWasher_OK_minor_bugs.ino
Normal file
@@ -0,0 +1,228 @@
|
|||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
// Define pin numbers
|
||||||
|
const int RELAY_PIN_1 = 13;
|
||||||
|
const int RELAY_PIN_2 = 14;
|
||||||
|
const int RELAY_PIN_3 = 15;
|
||||||
|
const int RELAY_PIN_4 = 16;
|
||||||
|
const int RELAY_PIN_5 = 17;
|
||||||
|
const int RELAY_PIN_6 = 18;
|
||||||
|
const int RELAY_PIN_7 = 19;
|
||||||
|
const int RELAY_PIN_8 = 12;
|
||||||
|
|
||||||
|
const int WASHER_SWITCH_PIN = 11;
|
||||||
|
const int WIPER_SWITCH_PIN_1 = 2;
|
||||||
|
const int WIPER_SWITCH_PIN_2 = 3;
|
||||||
|
const int WIPER_SWITCH_PIN_3 = 4;
|
||||||
|
const int WIPER_SWITCH_PIN_4 = 5;
|
||||||
|
const int WIPER_SWITCH_PIN_5 = 6;
|
||||||
|
const int FAN_SWITCH_PIN_1 = 7;
|
||||||
|
const int FAN_SWITCH_PIN_2 = 8;
|
||||||
|
const int FAN_SWITCH_PIN_3 = 9;
|
||||||
|
const int FAN_SWITCH_PIN_4 = 10;
|
||||||
|
|
||||||
|
// Wiper motor states
|
||||||
|
bool isWiperParked = true;
|
||||||
|
bool isWiperIntermittentLow = false;
|
||||||
|
bool isWiperIntermittentHigh = false;
|
||||||
|
bool isWiperLow = false;
|
||||||
|
bool isWiperHigh = false;
|
||||||
|
|
||||||
|
// Washer motor state
|
||||||
|
bool isWasherOn = false;
|
||||||
|
|
||||||
|
// Fan motor states
|
||||||
|
bool isFanLow = false;
|
||||||
|
bool isFan1 = false;
|
||||||
|
bool isFan2 = false;
|
||||||
|
bool isFanHigh = false;
|
||||||
|
|
||||||
|
// Timer variables for intermittent states
|
||||||
|
unsigned long intermittentLowStartTime = 0;
|
||||||
|
unsigned long intermittentHighStartTime = 0;
|
||||||
|
const unsigned long intermittentLowInterval = 8000; // 8 seconds
|
||||||
|
const unsigned long intermittentHighInterval = 16000; // 16 seconds
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// Initialize relay pins as outputs
|
||||||
|
pinMode(RELAY_PIN_1, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_2, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_3, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_4, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_5, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_6, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_7, OUTPUT);
|
||||||
|
pinMode(RELAY_PIN_8, OUTPUT);
|
||||||
|
|
||||||
|
// Initialize switch pins as inputs
|
||||||
|
pinMode(WASHER_SWITCH_PIN, INPUT);
|
||||||
|
pinMode(WIPER_SWITCH_PIN_1, INPUT);
|
||||||
|
pinMode(WIPER_SWITCH_PIN_2, INPUT);
|
||||||
|
pinMode(WIPER_SWITCH_PIN_3, INPUT);
|
||||||
|
pinMode(WIPER_SWITCH_PIN_4, INPUT);
|
||||||
|
pinMode(WIPER_SWITCH_PIN_5, INPUT);
|
||||||
|
pinMode(FAN_SWITCH_PIN_1, INPUT);
|
||||||
|
pinMode(FAN_SWITCH_PIN_2, INPUT);
|
||||||
|
pinMode(FAN_SWITCH_PIN_3, INPUT);
|
||||||
|
pinMode(FAN_SWITCH_PIN_4, INPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
checkWiperSwitch();
|
||||||
|
checkWasherSwitch();
|
||||||
|
checkFanSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
void checkWiperSwitch() {
|
||||||
|
if (digitalRead(WIPER_SWITCH_PIN_1) == HIGH) {
|
||||||
|
// Wiper parking/off/default state
|
||||||
|
isWiperParked = true;
|
||||||
|
isWiperIntermittentLow = false;
|
||||||
|
isWiperIntermittentHigh = false;
|
||||||
|
isWiperLow = false;
|
||||||
|
isWiperHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_1, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_2, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_3, HIGH);
|
||||||
|
} else if (digitalRead(WIPER_SWITCH_PIN_2) == HIGH) {
|
||||||
|
// Intermittent low state
|
||||||
|
isWiperParked = false;
|
||||||
|
isWiperIntermittentLow = true;
|
||||||
|
isWiperIntermittentHigh = false;
|
||||||
|
isWiperLow = false;
|
||||||
|
isWiperHigh = false;
|
||||||
|
|
||||||
|
if (intermittentLowStartTime == 0) {
|
||||||
|
intermittentLowStartTime = millis();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (millis() - intermittentLowStartTime >= intermittentLowInterval) {
|
||||||
|
intermittentLowStartTime = millis();
|
||||||
|
digitalWrite(RELAY_PIN_3, LOW);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(RELAY_PIN_3, HIGH);
|
||||||
|
}
|
||||||
|
} else if (digitalRead(WIPER_SWITCH_PIN_3) == HIGH) {
|
||||||
|
// Intermittent high state
|
||||||
|
isWiperParked = false;
|
||||||
|
isWiperIntermittentLow = false;
|
||||||
|
isWiperIntermittentHigh = true;
|
||||||
|
isWiperLow = false;
|
||||||
|
isWiperHigh = false;
|
||||||
|
|
||||||
|
if (intermittentHighStartTime == 0) {
|
||||||
|
intermittentHighStartTime = millis();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (millis() - intermittentHighStartTime >= intermittentHighInterval) {
|
||||||
|
intermittentHighStartTime = millis();
|
||||||
|
digitalWrite(RELAY_PIN_3, LOW);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(RELAY_PIN_3, HIGH);
|
||||||
|
}
|
||||||
|
} else if (digitalRead(WIPER_SWITCH_PIN_4) == HIGH) {
|
||||||
|
// Wiper low state
|
||||||
|
isWiperParked = false;
|
||||||
|
isWiperIntermittentLow = false;
|
||||||
|
isWiperIntermittentHigh = false;
|
||||||
|
isWiperLow = true;
|
||||||
|
isWiperHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_1, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_2, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_3, LOW);
|
||||||
|
} else if (digitalRead(WIPER_SWITCH_PIN_5) == HIGH) {
|
||||||
|
// Wiper high state
|
||||||
|
isWiperParked = false;
|
||||||
|
isWiperIntermittentLow = false;
|
||||||
|
isWiperIntermittentHigh = false;
|
||||||
|
isWiperLow = false;
|
||||||
|
isWiperHigh = true;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_1, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_2, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_3, LOW);
|
||||||
|
} else {
|
||||||
|
// Default to wiper parking/off/default state
|
||||||
|
isWiperParked = true;
|
||||||
|
isWiperIntermittentLow = false;
|
||||||
|
isWiperIntermittentHigh = false;
|
||||||
|
isWiperLow = false;
|
||||||
|
isWiperHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_1, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_2, LOW);
|
||||||
|
digitalWrite(RELAY_PIN_3, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void checkWasherSwitch() {
|
||||||
|
if (digitalRead(WASHER_SWITCH_PIN) == HIGH) {
|
||||||
|
// Washer motor control, relay 4
|
||||||
|
isWasherOn = true;
|
||||||
|
digitalWrite(RELAY_PIN_4, LOW);
|
||||||
|
} else {
|
||||||
|
isWasherOn = false;
|
||||||
|
digitalWrite(RELAY_PIN_4, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void checkFanSwitch() {
|
||||||
|
if (digitalRead(FAN_SWITCH_PIN_1) == HIGH) {
|
||||||
|
// Fan motor low state
|
||||||
|
isFanLow = true;
|
||||||
|
isFan1 = false;
|
||||||
|
isFan2 = false;
|
||||||
|
isFanHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_5, LOW); // Inverted
|
||||||
|
digitalWrite(RELAY_PIN_6, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_7, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_8, HIGH);
|
||||||
|
} else if (digitalRead(FAN_SWITCH_PIN_2) == HIGH) {
|
||||||
|
// Fan motor 1 state
|
||||||
|
isFanLow = false;
|
||||||
|
isFan1 = true;
|
||||||
|
isFan2 = false;
|
||||||
|
isFanHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_5, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_6, LOW); // Inverted
|
||||||
|
digitalWrite(RELAY_PIN_7, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_8, HIGH);
|
||||||
|
} else if (digitalRead(FAN_SWITCH_PIN_3) == HIGH) {
|
||||||
|
// Fan motor 2 state
|
||||||
|
isFanLow = false;
|
||||||
|
isFan1 = false;
|
||||||
|
isFan2 = true;
|
||||||
|
isFanHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_5, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_6, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_7, LOW); // Inverted
|
||||||
|
digitalWrite(RELAY_PIN_8, HIGH);
|
||||||
|
} else if (digitalRead(FAN_SWITCH_PIN_4) == HIGH) {
|
||||||
|
// Fan motor high state
|
||||||
|
isFanLow = false;
|
||||||
|
isFan1 = false;
|
||||||
|
isFan2 = false;
|
||||||
|
isFanHigh = true;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_5, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_6, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_7, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_8, LOW); // Inverted
|
||||||
|
} else {
|
||||||
|
// Default to fan motor off state
|
||||||
|
isFanLow = false;
|
||||||
|
isFan1 = false;
|
||||||
|
isFan2 = false;
|
||||||
|
isFanHigh = false;
|
||||||
|
|
||||||
|
digitalWrite(RELAY_PIN_5, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_6, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_7, HIGH);
|
||||||
|
digitalWrite(RELAY_PIN_8, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
// Define the analog input pin
|
||||||
|
const int analogInputPin = A0;
|
||||||
|
|
||||||
|
// Declare the global variable to store the AFR value
|
||||||
|
float AFR;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// Initialize the serial communication
|
||||||
|
Serial.begin(9600);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// Read the analog input value (0-1023)
|
||||||
|
int analogValue = analogRead(analogInputPin);
|
||||||
|
|
||||||
|
// Convert the analog value to a voltage (0-5V)
|
||||||
|
float voltage = analogValue * (5.0 / 1023.0);
|
||||||
|
|
||||||
|
// Calculate the AFR value
|
||||||
|
AFR = 2 * voltage + 9.6;
|
||||||
|
|
||||||
|
// Output the AFR value to the serial monitor with one decimal place
|
||||||
|
Serial.print("AFR: ");
|
||||||
|
Serial.println(AFR, 1);
|
||||||
|
|
||||||
|
// Add a small delay to avoid spamming the serial monitor
|
||||||
|
delay(500);
|
||||||
|
}
|
||||||
5
_Lab_Micropython/boot.py
Normal file
5
_Lab_Micropython/boot.py
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# This file is executed on every boot (including wake-boot from deepsleep)
|
||||||
|
#import esp
|
||||||
|
#esp.osdebug(None)
|
||||||
|
#import webrepl
|
||||||
|
#webrepl.start()
|
||||||
10
_Lab_Micropython/main.py
Normal file
10
_Lab_Micropython/main.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# This program was created in Arduino Lab for MicroPython
|
||||||
|
|
||||||
|
import machine
|
||||||
|
import time
|
||||||
|
led = machine.Pin(15, machine.Pin.OUT)
|
||||||
|
while True:
|
||||||
|
led.value(1)
|
||||||
|
time.sleep(1)
|
||||||
|
led.value(0)
|
||||||
|
time.sleep(1)
|
||||||
85
_Lab_Micropython/main_zeitronix.py
Normal file
85
_Lab_Micropython/main_zeitronix.py
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
import board
|
||||||
|
import busio
|
||||||
|
import time
|
||||||
|
import adafruit_sdcard
|
||||||
|
#import adafruit_pcf8523
|
||||||
|
import microcontroller
|
||||||
|
import digitalio
|
||||||
|
import storage
|
||||||
|
import os
|
||||||
|
|
||||||
|
switch = digitalio.DigitalInOut(board.A5)
|
||||||
|
switch.direction = digitalio.Direction.INPUT
|
||||||
|
switch.pull = digitalio.Pull.UP
|
||||||
|
|
||||||
|
#Zeitronix Packet format, bytes[]
|
||||||
|
#[0] always 0
|
||||||
|
#[1] always 1
|
||||||
|
#[2] always 2
|
||||||
|
#[3] AFR
|
||||||
|
#[4] EGT Low
|
||||||
|
#[5] EGT High
|
||||||
|
#[6] RPM Low
|
||||||
|
#[7] RPM High
|
||||||
|
#[8] MAP Low
|
||||||
|
#[9] MAP High
|
||||||
|
#[10] TPS
|
||||||
|
#[11] USER1
|
||||||
|
#[12] Config Register1
|
||||||
|
#[13] Config Register2
|
||||||
|
|
||||||
|
#led = digitalio.DigitalInOut(board.D13)
|
||||||
|
#led.direction = digitalio.Direction.OUTPUT
|
||||||
|
|
||||||
|
SD_CS = board.D10
|
||||||
|
# Connect to the sdcard and mount the filesystem.
|
||||||
|
spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
|
||||||
|
cs = digitalio.DigitalInOut(SD_CS)
|
||||||
|
sdcard = adafruit_sdcard.SDCard(spi, cs)
|
||||||
|
vfs = storage.VfsFat(sdcard)
|
||||||
|
storage.mount(vfs, "/sd")
|
||||||
|
|
||||||
|
uart = busio.UART(board.TX, board.RX, baudrate=9600, timeout=10)
|
||||||
|
|
||||||
|
#date = rtc.datetime() # will use this for the filename
|
||||||
|
# this board doesn't seem to have enough ram for the rtc library & sd & everything else going on here.. getting an allocation error
|
||||||
|
#filename = str(date.tm_year) + "-" + str(date.tm_mon) + "-" + str(date.tm_mday) + "-" + str(date.tm_hour) + "" + str(date.tm_min)
|
||||||
|
filename = "2017-09-11-test"
|
||||||
|
filename += ".csv"
|
||||||
|
|
||||||
|
def getPacket():
|
||||||
|
rcdbyte = [None] * 3
|
||||||
|
packet = [0] * 15
|
||||||
|
packet[0] = time.monotonic()
|
||||||
|
i = 0
|
||||||
|
while True:
|
||||||
|
rcdbyte[i] = uart.read(1) #read a single byte
|
||||||
|
if rcdbyte[i] == None: #if we got an empty byte, assume the serial link is down, and return zeros.
|
||||||
|
return packet
|
||||||
|
if rcdbyte[i] == b'\x02' and rcdbyte[i-1] == b'\x01' and rcdbyte[i-2] == b'\x00': # we got our 3 bytes in order for the start of packet
|
||||||
|
packet[1] = 0
|
||||||
|
packet[2] = 1
|
||||||
|
packet[3] = 2
|
||||||
|
|
||||||
|
for x in range(4, 15): #get the rest of the packet.
|
||||||
|
byte = uart.read(1)
|
||||||
|
if byte == None: #if we got an empty byte, assume the serial link is down, and return zeros.
|
||||||
|
packet[x] = 0
|
||||||
|
return packet
|
||||||
|
packet[x] = byte[0]
|
||||||
|
return packet
|
||||||
|
i += 1
|
||||||
|
if i == 3:
|
||||||
|
i = 0
|
||||||
|
|
||||||
|
#this is currently configured so that you have to short the pin to ground momentarily to start logging, then again to stop.
|
||||||
|
while True:
|
||||||
|
if switch.value == False:
|
||||||
|
time.sleep(0.2)
|
||||||
|
f = open("/sd/" + filename, "w")
|
||||||
|
while switch.value == True:
|
||||||
|
packet = getPacket()
|
||||||
|
f.write('{}\n'.format(packet))
|
||||||
|
print('.',end='')
|
||||||
|
f.close()
|
||||||
|
time.sleep(0.2)
|
||||||
@@ -0,0 +1,266 @@
|
|||||||
|
/* Latest DinoFan 28.06.2024-001
|
||||||
|
Added watchdog timer, 4 seconds.
|
||||||
|
Removed SoftSerial since it interferred with Wire.h
|
||||||
|
Added M3200 sensor for oil temp and pressure. */
|
||||||
|
|
||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_ST7735.h>
|
||||||
|
#include <avr/wdt.h>
|
||||||
|
|
||||||
|
#define TFT_RST 8
|
||||||
|
#define TFT_CS 10
|
||||||
|
#define TFT_DC 9
|
||||||
|
|
||||||
|
#define ST7735_ORANGE 0xF4E3
|
||||||
|
#define ST7735_CYAN2 0x6658
|
||||||
|
#define ST7735_DGRAY 0x3186
|
||||||
|
|
||||||
|
float version = 240630;
|
||||||
|
|
||||||
|
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
|
||||||
|
|
||||||
|
int M3200address = 0x28; // 0x28, 0x36, or 0x46, depending on the sensor.
|
||||||
|
float maxPressure = 100; // pressure in PSI for this sensor, 100, 250, 500, ... 10k.
|
||||||
|
float pressure;
|
||||||
|
float temperature;
|
||||||
|
byte status;
|
||||||
|
|
||||||
|
float tempForFanStartup = 85.0; // 175 target low temp. below this temperature, the fan will be off
|
||||||
|
float tempForFanOnFull = 100.0; // 210 target High temp. above this temperature, the fan will be on at full power
|
||||||
|
|
||||||
|
float voltsForFanStartup = 2.0; // Roughly the signal voltage that triggers the slowest speed.
|
||||||
|
|
||||||
|
const int fanPwmOutPin = 3; // Arduino forces this pin to 0 or 5 volts.
|
||||||
|
const int tempSensorPin = 2; // Pin to read analog voltage from the temp sensor.
|
||||||
|
int pwmDuty; // The calculated PWM duty is stored here
|
||||||
|
float pwmMinStartupDuty; // the starting duty is stored here (mazda module starts fans at about 24 % duty)
|
||||||
|
float currTemperature; // the temperature in F is stored here
|
||||||
|
float fanSpeedPct;
|
||||||
|
|
||||||
|
OneWire oneWire1 (tempSensorPin);
|
||||||
|
DallasTemperature sensorClt1(&oneWire1);
|
||||||
|
|
||||||
|
//Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||||
|
|
||||||
|
unsigned long previousMillis = 0; // Variable to store the last time the serial data was sent
|
||||||
|
const long interval = 5000; // Interval between serial data transmissions (in milliseconds)
|
||||||
|
|
||||||
|
unsigned long previous2Millis = 0;
|
||||||
|
const int pressureTiming = 1000; // 500ms every data acquisition
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
wdt_enable(WDTO_4S);
|
||||||
|
Serial.begin(9600);
|
||||||
|
Wire.begin();
|
||||||
|
|
||||||
|
tft.initR(INITR_BLACKTAB);
|
||||||
|
tft.fillScreen(ST77XX_BLACK);
|
||||||
|
tft.setRotation(3);
|
||||||
|
|
||||||
|
/* if (!display.begin(i2c_Address)) {
|
||||||
|
Serial.println(F("SH110X allocation failed"));
|
||||||
|
for (;;);
|
||||||
|
}
|
||||||
|
display.clearDisplay(); // Clear the display buffer */
|
||||||
|
|
||||||
|
sensorClt1.begin();
|
||||||
|
sensorClt1.requestTemperatures();
|
||||||
|
|
||||||
|
currTemperature = sensorClt1.getTempCByIndex(0);
|
||||||
|
pwmMinStartupDuty = (voltsForFanStartup / 5.0) * 255.0; // convert the Mazda starting voltage to a PWM duty
|
||||||
|
|
||||||
|
delay(500);
|
||||||
|
Serial.print("F20.0");
|
||||||
|
delay(20);
|
||||||
|
Serial.print("D000");
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
unsigned long currentMillis = millis();
|
||||||
|
unsigned long pressureMillis = millis();
|
||||||
|
|
||||||
|
//Pull data from M3200 every second.
|
||||||
|
if (pressureMillis - previous2Millis >= pressureTiming) {
|
||||||
|
get_data_from_M3200();
|
||||||
|
previous2Millis = pressureMillis;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
readAndTranslateTempSensor();
|
||||||
|
calculate_and_send_PWM();
|
||||||
|
//print_to_serial_port(); // uncomment this line for testing and calibration to the laptop.
|
||||||
|
|
||||||
|
// Check if it's time to send serial data
|
||||||
|
if (currentMillis - previousMillis >= interval) {
|
||||||
|
serial_to_signal_generator(); // Send serial data
|
||||||
|
previousMillis = currentMillis; // Save the last time serial data was sent
|
||||||
|
}
|
||||||
|
displayOutput();
|
||||||
|
wdt_reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void calculate_and_send_PWM() { /* ++++++++ subroutine to calculate PWM duty cycle ++++++++++++++*/
|
||||||
|
|
||||||
|
if (currTemperature < tempForFanStartup) { // If the temperature is below the lowest setpoint, turn fan off
|
||||||
|
//analogWrite(fanPwmOutPin, 0); // PWM duty = 0 percent
|
||||||
|
pwmDuty = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currTemperature > tempForFanOnFull) { // If the temperature is above the highest setpoint, turn fan on full
|
||||||
|
//analogWrite(fanPwmOutPin, 255); // PWM duty = 100 percent
|
||||||
|
pwmDuty = 255;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
float tempRange = tempForFanOnFull - tempForFanStartup ; // start calculating duty cycle
|
||||||
|
float pwmRange = 255.0 - pwmMinStartupDuty ;
|
||||||
|
float pwmDutyPct = (currTemperature - tempForFanStartup) / tempRange ;
|
||||||
|
|
||||||
|
pwmDuty = (int) (pwmMinStartupDuty + (pwmDutyPct * pwmRange) +.5); // actual PWM duty is calculated here
|
||||||
|
|
||||||
|
fanSpeedPct = map(pwmDuty, 0, 255, 0, 100);
|
||||||
|
|
||||||
|
if (pwmDuty > 255) { // make sure duty ended up between 255 and 0
|
||||||
|
pwmDuty = 255;
|
||||||
|
}
|
||||||
|
if (pwmDuty < 0) {
|
||||||
|
pwmDuty = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//analogWrite(fanPwmOutPin, pwmDuty); // write PWM duty to PWM output pin
|
||||||
|
|
||||||
|
} // end calculate_and_send_PWM
|
||||||
|
|
||||||
|
void readAndTranslateTempSensor() {
|
||||||
|
// Request temperature readings
|
||||||
|
sensorClt1.requestTemperatures();
|
||||||
|
|
||||||
|
// Read the temperature from the sensor
|
||||||
|
float tempC = sensorClt1.getTempCByIndex(0);
|
||||||
|
|
||||||
|
// Check if the temperature reading is within the valid range
|
||||||
|
if (tempC > -30 && tempC < 130) {
|
||||||
|
// If the reading is within the valid range, update the current temperature
|
||||||
|
currTemperature = tempC;
|
||||||
|
} else if (tempC < -50 || tempC > 150) {
|
||||||
|
// If the reading is outside the extreme range, set the current temperature to 0
|
||||||
|
currTemperature = 0;
|
||||||
|
}
|
||||||
|
// If the reading is outside the valid range, do not update the current temperature
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayOutput() {
|
||||||
|
//display.clearDisplay();
|
||||||
|
|
||||||
|
tft.setTextSize(1);
|
||||||
|
tft.setTextColor(ST77XX_GREEN, ST77XX_BLACK);
|
||||||
|
|
||||||
|
// Display temperature on the screen in Celsius with one decimal place
|
||||||
|
tft.setCursor(26, 0);
|
||||||
|
tft.print("Pontiac LeMans '69");
|
||||||
|
tft.drawLine(2, 10, 159, 10, ST7735_WHITE);
|
||||||
|
|
||||||
|
tft.setCursor(0, 16);
|
||||||
|
tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK);
|
||||||
|
tft.print("Temp Coolant:");
|
||||||
|
tft.setCursor(88, 16);
|
||||||
|
tft.print(currTemperature, 1); // Display one decimal place
|
||||||
|
tft.print(" C ");
|
||||||
|
|
||||||
|
tft.setCursor(0, 26);
|
||||||
|
tft.print("Temp Oil :");
|
||||||
|
tft.setCursor(88, 26);
|
||||||
|
tft.print(temperature, 1);
|
||||||
|
tft.print(" C ");
|
||||||
|
|
||||||
|
tft.setCursor(0, 36);
|
||||||
|
tft.print("Oil Pressure:");
|
||||||
|
tft.setCursor(88, 36);
|
||||||
|
tft.print(pressure, 1);
|
||||||
|
tft.print(" b ");
|
||||||
|
|
||||||
|
// Calculate and display fan speed percentage
|
||||||
|
if (currTemperature < tempForFanStartup) {
|
||||||
|
fanSpeedPct = 0; // Set fan speed to 0% if temperature is below startup threshold
|
||||||
|
} else {
|
||||||
|
fanSpeedPct = map(pwmDuty, 0, 255, 0, 100); // Calculate fan speed percentage
|
||||||
|
}
|
||||||
|
|
||||||
|
tft.setCursor(0, 56);
|
||||||
|
tft.print("Fan Speed :");
|
||||||
|
tft.setCursor(88, 56);
|
||||||
|
tft.print((int)fanSpeedPct);
|
||||||
|
tft.print(" % ");
|
||||||
|
|
||||||
|
tft.setCursor(4, 120);
|
||||||
|
tft.setTextColor(ST7735_DGRAY, ST77XX_BLACK);
|
||||||
|
tft.print("BoopLabs Vitals");
|
||||||
|
tft.setCursor(120, 120);
|
||||||
|
tft.setTextColor(ST7735_DGRAY, ST77XX_BLACK);
|
||||||
|
tft.print(version, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_to_serial_port() { /* ++++++++++ optional prints values to laptop usb port for debugging and calibration ++*/
|
||||||
|
Serial.print(F("currTemperature C: ")); Serial.print(currTemperature);
|
||||||
|
Serial.print(F(" pwmDuty: ")); Serial.println(pwmDuty);
|
||||||
|
Serial.print(F("Percentage: ")); Serial.println((int)fanSpeedPct);
|
||||||
|
}
|
||||||
|
|
||||||
|
void serial_to_signal_generator() {
|
||||||
|
// Determine fan speed percentage to send
|
||||||
|
int speedToSend = (int)fanSpeedPct;
|
||||||
|
|
||||||
|
// Ensure fan speed is 0 if temperature is below startup threshold
|
||||||
|
if (currTemperature < tempForFanStartup) {
|
||||||
|
speedToSend = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check the length of fanSpeedPct
|
||||||
|
if (speedToSend < 10) {
|
||||||
|
Serial.print(F("D00")); // Add "D00" prefix for single-digit fan speed
|
||||||
|
} else if (speedToSend < 100) {
|
||||||
|
Serial.print(F("D0")); // Add "D0" prefix for double-digit fan speed
|
||||||
|
} else {
|
||||||
|
Serial.print(F("D")); // Add "D" prefix for triple-digit fan speed
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.print(speedToSend); // Send fan speed
|
||||||
|
}
|
||||||
|
|
||||||
|
void get_data_from_M3200() {
|
||||||
|
Wire.requestFrom(M3200address, 4); // request 4 bytes
|
||||||
|
int n = Wire.available();
|
||||||
|
|
||||||
|
if (n == 4) {
|
||||||
|
status = 0;
|
||||||
|
uint16_t rawP; // pressure data from sensor
|
||||||
|
uint16_t rawT; // temperature data from sensor
|
||||||
|
rawP = (uint16_t) Wire.read(); // upper 8 bits
|
||||||
|
rawP <<= 8;
|
||||||
|
rawP |= (uint16_t) Wire.read(); // lower 8 bits
|
||||||
|
rawT = (uint16_t) Wire.read(); // upper 8 bits
|
||||||
|
rawT <<= 8;
|
||||||
|
rawT |= (uint16_t) Wire.read(); // lower 8 bits
|
||||||
|
|
||||||
|
status = rawP >> 14; // The status is 0, 1, 2, or 3
|
||||||
|
rawP &= 0x3FFF; // keep 14 bits, remove status bits
|
||||||
|
|
||||||
|
rawT >>= 5; // the lowest 5 bits are not used
|
||||||
|
|
||||||
|
pressure = ((rawP - 1000.0) / (15000.0 - 1000.0)) * maxPressure;
|
||||||
|
temperature = ((rawT - 512.0) / (1075.0 - 512.0)) * 55.0;
|
||||||
|
|
||||||
|
// Serial.println("--- Values from M3200 ---");
|
||||||
|
// Serial.println(temperature);
|
||||||
|
// Serial.println(pressure);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} else {
|
||||||
|
Serial.println("M3200 Pressure Transducer not Detected");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,270 @@
|
|||||||
|
/* Latest DinoFan 16.07.2024-001
|
||||||
|
Updated for the GMT020-02 display.
|
||||||
|
Added watchdog timer, 4 seconds.
|
||||||
|
Removed SoftSerial since it interferred with Wire.h
|
||||||
|
Added M3200 sensor for oil temp and pressure. */
|
||||||
|
|
||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_ST7789.h>
|
||||||
|
#include <avr/wdt.h>
|
||||||
|
#include <Fonts/FreeSans9pt7b.h>
|
||||||
|
|
||||||
|
#define TFT_RST 8
|
||||||
|
#define TFT_CS 10
|
||||||
|
#define TFT_DC 9
|
||||||
|
|
||||||
|
#define PUP_ORANGE 0xF4E3
|
||||||
|
#define PUP_CYAN2 0x6658
|
||||||
|
#define PUP_DGRAY 0x3186
|
||||||
|
#define PUP_LBLUE 0x051D
|
||||||
|
#define PUP_POISON 0xA7C9
|
||||||
|
|
||||||
|
float version = 24071601;
|
||||||
|
|
||||||
|
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
|
||||||
|
|
||||||
|
int M3200address = 0x28; // 0x28, 0x36, or 0x46, depending on the sensor.
|
||||||
|
float maxPressure = 100; // pressure in PSI for this sensor, 100, 250, 500, ... 10k.
|
||||||
|
float pressure;
|
||||||
|
float temperature;
|
||||||
|
byte status;
|
||||||
|
|
||||||
|
float tempForFanStartup = 85.0; // 175 target low temp. below this temperature, the fan will be off
|
||||||
|
float tempForFanOnFull = 100.0; // 210 target High temp. above this temperature, the fan will be on at full power
|
||||||
|
|
||||||
|
float voltsForFanStartup = 2.0; // Roughly the signal voltage that triggers the slowest speed.
|
||||||
|
|
||||||
|
const int fanPwmOutPin = 3; // Arduino forces this pin to 0 or 5 volts.
|
||||||
|
const int tempSensorPin = 2; // Pin to read analog voltage from the temp sensor.
|
||||||
|
int pwmDuty; // The calculated PWM duty is stored here
|
||||||
|
float pwmMinStartupDuty; // the starting duty is stored here (mazda module starts fans at about 24 % duty)
|
||||||
|
float currTemperature; // the temperature in F is stored here
|
||||||
|
float fanSpeedPct;
|
||||||
|
|
||||||
|
OneWire oneWire1 (tempSensorPin);
|
||||||
|
DallasTemperature sensorClt1(&oneWire1);
|
||||||
|
|
||||||
|
//Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||||
|
|
||||||
|
unsigned long previousMillis = 0; // Variable to store the last time the serial data was sent
|
||||||
|
const long interval = 5000; // Interval between serial data transmissions (in milliseconds)
|
||||||
|
|
||||||
|
unsigned long previous2Millis = 0;
|
||||||
|
const int pressureTiming = 1000; // 500ms every data acquisition
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
wdt_enable(WDTO_4S);
|
||||||
|
Serial.begin(9600);
|
||||||
|
Wire.begin();
|
||||||
|
|
||||||
|
tft.init(240, 320, SPI_MODE3);
|
||||||
|
tft.setRotation(3);
|
||||||
|
tft.fillScreen(ST77XX_BLACK);
|
||||||
|
|
||||||
|
/* if (!display.begin(i2c_Address)) {
|
||||||
|
Serial.println(F("SH110X allocation failed"));
|
||||||
|
for (;;);
|
||||||
|
}
|
||||||
|
display.clearDisplay(); // Clear the display buffer */
|
||||||
|
|
||||||
|
sensorClt1.begin();
|
||||||
|
sensorClt1.requestTemperatures();
|
||||||
|
|
||||||
|
currTemperature = sensorClt1.getTempCByIndex(0);
|
||||||
|
pwmMinStartupDuty = (voltsForFanStartup / 5.0) * 255.0; // convert the Mazda starting voltage to a PWM duty
|
||||||
|
|
||||||
|
delay(500);
|
||||||
|
Serial.print("F20.0");
|
||||||
|
delay(20);
|
||||||
|
Serial.print("D000");
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
unsigned long currentMillis = millis();
|
||||||
|
unsigned long pressureMillis = millis();
|
||||||
|
|
||||||
|
//Pull data from M3200 every second.
|
||||||
|
if (pressureMillis - previous2Millis >= pressureTiming) {
|
||||||
|
get_data_from_M3200();
|
||||||
|
previous2Millis = pressureMillis;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
readAndTranslateTempSensor();
|
||||||
|
calculate_and_send_PWM();
|
||||||
|
//print_to_serial_port(); // uncomment this line for testing and calibration to the laptop.
|
||||||
|
|
||||||
|
// Check if it's time to send serial data
|
||||||
|
if (currentMillis - previousMillis >= interval) {
|
||||||
|
serial_to_signal_generator(); // Send serial data
|
||||||
|
previousMillis = currentMillis; // Save the last time serial data was sent
|
||||||
|
}
|
||||||
|
displayOutput();
|
||||||
|
wdt_reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void calculate_and_send_PWM() { /* ++++++++ subroutine to calculate PWM duty cycle ++++++++++++++*/
|
||||||
|
|
||||||
|
if (currTemperature < tempForFanStartup) { // If the temperature is below the lowest setpoint, turn fan off
|
||||||
|
//analogWrite(fanPwmOutPin, 0); // PWM duty = 0 percent
|
||||||
|
pwmDuty = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currTemperature > tempForFanOnFull) { // If the temperature is above the highest setpoint, turn fan on full
|
||||||
|
//analogWrite(fanPwmOutPin, 255); // PWM duty = 100 percent
|
||||||
|
pwmDuty = 255;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
float tempRange = tempForFanOnFull - tempForFanStartup ; // start calculating duty cycle
|
||||||
|
float pwmRange = 255.0 - pwmMinStartupDuty ;
|
||||||
|
float pwmDutyPct = (currTemperature - tempForFanStartup) / tempRange ;
|
||||||
|
|
||||||
|
pwmDuty = (int) (pwmMinStartupDuty + (pwmDutyPct * pwmRange) +.5); // actual PWM duty is calculated here
|
||||||
|
|
||||||
|
fanSpeedPct = map(pwmDuty, 0, 255, 0, 100);
|
||||||
|
|
||||||
|
if (pwmDuty > 255) { // make sure duty ended up between 255 and 0
|
||||||
|
pwmDuty = 255;
|
||||||
|
}
|
||||||
|
if (pwmDuty < 0) {
|
||||||
|
pwmDuty = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//analogWrite(fanPwmOutPin, pwmDuty); // write PWM duty to PWM output pin
|
||||||
|
|
||||||
|
} // end calculate_and_send_PWM
|
||||||
|
|
||||||
|
void readAndTranslateTempSensor() {
|
||||||
|
// Request temperature readings
|
||||||
|
sensorClt1.requestTemperatures();
|
||||||
|
|
||||||
|
// Read the temperature from the sensor
|
||||||
|
float tempC = sensorClt1.getTempCByIndex(0);
|
||||||
|
|
||||||
|
// Check if the temperature reading is within the valid range
|
||||||
|
if (tempC > -30 && tempC < 130) {
|
||||||
|
// If the reading is within the valid range, update the current temperature
|
||||||
|
currTemperature = tempC;
|
||||||
|
} else if (tempC < -50 || tempC > 150) {
|
||||||
|
// If the reading is outside the extreme range, set the current temperature to 0
|
||||||
|
currTemperature = 0;
|
||||||
|
}
|
||||||
|
// If the reading is outside the valid range, do not update the current temperature
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayOutput() {
|
||||||
|
//display.clearDisplay();
|
||||||
|
|
||||||
|
tft.setTextSize(1);
|
||||||
|
tft.setTextColor(ST77XX_GREEN, ST77XX_BLACK);
|
||||||
|
|
||||||
|
// Display temperature on the screen in Celsius with one decimal place
|
||||||
|
tft.setCursor(26, 0);
|
||||||
|
tft.print("Pontiac LeMans '69");
|
||||||
|
tft.drawLine(2, 10, 159, 10, ST77XX_WHITE);
|
||||||
|
|
||||||
|
tft.setCursor(0, 16);
|
||||||
|
tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK);
|
||||||
|
tft.print("Temp Coolant:");
|
||||||
|
tft.setCursor(88, 16);
|
||||||
|
tft.print(currTemperature, 1); // Display one decimal place
|
||||||
|
tft.print(" C ");
|
||||||
|
|
||||||
|
tft.setCursor(0, 26);
|
||||||
|
tft.print("Temp Oil :");
|
||||||
|
tft.setCursor(88, 26);
|
||||||
|
tft.print(temperature, 1);
|
||||||
|
tft.print(" C ");
|
||||||
|
|
||||||
|
tft.setCursor(0, 36);
|
||||||
|
tft.print("Oil Pressure:");
|
||||||
|
tft.setCursor(88, 36);
|
||||||
|
tft.print(pressure, 1);
|
||||||
|
tft.print(" b ");
|
||||||
|
|
||||||
|
// Calculate and display fan speed percentage
|
||||||
|
if (currTemperature < tempForFanStartup) {
|
||||||
|
fanSpeedPct = 0; // Set fan speed to 0% if temperature is below startup threshold
|
||||||
|
} else {
|
||||||
|
fanSpeedPct = map(pwmDuty, 0, 255, 0, 100); // Calculate fan speed percentage
|
||||||
|
}
|
||||||
|
|
||||||
|
tft.setCursor(0, 56);
|
||||||
|
tft.print("Fan Speed :");
|
||||||
|
tft.setCursor(88, 56);
|
||||||
|
tft.print((int)fanSpeedPct);
|
||||||
|
tft.print(" % ");
|
||||||
|
|
||||||
|
tft.setCursor(4, 120);
|
||||||
|
tft.setTextColor(PUP_DGRAY, ST77XX_BLACK);
|
||||||
|
tft.print("BoopLabs Vitals");
|
||||||
|
tft.setCursor(120, 120);
|
||||||
|
tft.setTextColor(PUP_DGRAY, ST77XX_BLACK);
|
||||||
|
tft.print(version, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_to_serial_port() { /* ++++++++++ optional prints values to laptop usb port for debugging and calibration ++*/
|
||||||
|
Serial.print(F("currTemperature C: ")); Serial.print(currTemperature);
|
||||||
|
Serial.print(F(" pwmDuty: ")); Serial.println(pwmDuty);
|
||||||
|
Serial.print(F("Percentage: ")); Serial.println((int)fanSpeedPct);
|
||||||
|
}
|
||||||
|
|
||||||
|
void serial_to_signal_generator() {
|
||||||
|
// Determine fan speed percentage to send
|
||||||
|
int speedToSend = (int)fanSpeedPct;
|
||||||
|
|
||||||
|
// Ensure fan speed is 0 if temperature is below startup threshold
|
||||||
|
if (currTemperature < tempForFanStartup) {
|
||||||
|
speedToSend = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check the length of fanSpeedPct
|
||||||
|
if (speedToSend < 10) {
|
||||||
|
Serial.print(F("D00")); // Add "D00" prefix for single-digit fan speed
|
||||||
|
} else if (speedToSend < 100) {
|
||||||
|
Serial.print(F("D0")); // Add "D0" prefix for double-digit fan speed
|
||||||
|
} else {
|
||||||
|
Serial.print(F("D")); // Add "D" prefix for triple-digit fan speed
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.print(speedToSend); // Send fan speed
|
||||||
|
}
|
||||||
|
|
||||||
|
void get_data_from_M3200() {
|
||||||
|
Wire.requestFrom(M3200address, 4); // request 4 bytes
|
||||||
|
int n = Wire.available();
|
||||||
|
|
||||||
|
if (n == 4) {
|
||||||
|
status = 0;
|
||||||
|
uint16_t rawP; // pressure data from sensor
|
||||||
|
uint16_t rawT; // temperature data from sensor
|
||||||
|
rawP = (uint16_t) Wire.read(); // upper 8 bits
|
||||||
|
rawP <<= 8;
|
||||||
|
rawP |= (uint16_t) Wire.read(); // lower 8 bits
|
||||||
|
rawT = (uint16_t) Wire.read(); // upper 8 bits
|
||||||
|
rawT <<= 8;
|
||||||
|
rawT |= (uint16_t) Wire.read(); // lower 8 bits
|
||||||
|
|
||||||
|
status = rawP >> 14; // The status is 0, 1, 2, or 3
|
||||||
|
rawP &= 0x3FFF; // keep 14 bits, remove status bits
|
||||||
|
|
||||||
|
rawT >>= 5; // the lowest 5 bits are not used
|
||||||
|
|
||||||
|
pressure = ((rawP - 1000.0) / (15000.0 - 1000.0)) * maxPressure;
|
||||||
|
temperature = ((rawT - 512.0) / (1075.0 - 512.0)) * 55.0;
|
||||||
|
|
||||||
|
// Serial.println("--- Values from M3200 ---");
|
||||||
|
// Serial.println(temperature);
|
||||||
|
// Serial.println(pressure);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} else {
|
||||||
|
Serial.println("M3200 Pressure Transducer not Detected");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,181 @@
|
|||||||
|
/* Latest running code on the Arduino in the Pontiac as of 06.06.2024 */
|
||||||
|
/* Added watchdog timer, 4 seconds. */
|
||||||
|
|
||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_SH110X.h>
|
||||||
|
#include <SoftwareSerial.h>
|
||||||
|
#include <avr/wdt.h>
|
||||||
|
|
||||||
|
#define i2c_Address 0x3C // OLED Adress.
|
||||||
|
#define SCREEN_WIDTH 128
|
||||||
|
#define SCREEN_HEIGHT 64
|
||||||
|
#define OLED_RESET -1
|
||||||
|
|
||||||
|
float tempForFanStartup = 85.0; // 175 target low temp. below this temperature, the fan will be off
|
||||||
|
float tempForFanOnFull = 100.0; // 210 target High temp. above this temperature, the fan will be on at full power
|
||||||
|
|
||||||
|
float voltsForFanStartup = 2.0; // Roughly the signal voltage that triggers the slowest speed.
|
||||||
|
|
||||||
|
const int fanPwmOutPin = 12; // Arduino forces this pin to 0 or 5 volts.
|
||||||
|
const int tempSensorPin = 7; // Pin to read analog voltage from the temp sensor.
|
||||||
|
int pwmDuty; // The calculated PWM duty is stored here
|
||||||
|
float pwmMinStartupDuty; // the starting duty is stored here (mazda module starts fans at about 24 % duty)
|
||||||
|
float currTemperature; // the temperature in F is stored here
|
||||||
|
float fanSpeedPct;
|
||||||
|
|
||||||
|
OneWire oneWire1 (tempSensorPin);
|
||||||
|
DallasTemperature sensorClt1(&oneWire1);
|
||||||
|
|
||||||
|
const byte rxPin = 2;
|
||||||
|
const byte txPin = 3;
|
||||||
|
SoftwareSerial secondSerial (rxPin, txPin);
|
||||||
|
|
||||||
|
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||||
|
|
||||||
|
unsigned long previousMillis = 0; // Variable to store the last time the serial data was sent
|
||||||
|
const long interval = 5000; // Interval between serial data transmissions (in milliseconds)
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
wdt_enable(WDTO_4S);
|
||||||
|
Serial.begin(115200); // set up serial port for 115200 baud (optional)
|
||||||
|
|
||||||
|
if (!display.begin(i2c_Address)) {
|
||||||
|
Serial.println(F("SH110X allocation failed"));
|
||||||
|
for (;;);
|
||||||
|
}
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
secondSerial.begin(9600);
|
||||||
|
delay(500);
|
||||||
|
secondSerial.print("F20.0");
|
||||||
|
delay(20);
|
||||||
|
secondSerial.print("D000");
|
||||||
|
|
||||||
|
sensorClt1.begin();
|
||||||
|
sensorClt1.requestTemperatures();
|
||||||
|
currTemperature = sensorClt1.getTempCByIndex(0);
|
||||||
|
|
||||||
|
pwmMinStartupDuty = (voltsForFanStartup / 5.0) * 255.0; // convert the Mazda starting voltage to a PWM duty
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
unsigned long currentMillis = millis();
|
||||||
|
readAndTranslateTempSensor();
|
||||||
|
calculate_and_send_PWM();
|
||||||
|
//print_to_serial_port(); // uncomment this line for testing and calibration to the laptop.
|
||||||
|
|
||||||
|
// Check if it's time to send serial data
|
||||||
|
if (currentMillis - previousMillis >= interval) {
|
||||||
|
serial_to_signal_generator(); // Send serial data
|
||||||
|
previousMillis = currentMillis; // Save the last time serial data was sent
|
||||||
|
}
|
||||||
|
|
||||||
|
displayOutput();
|
||||||
|
wdt_reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void calculate_and_send_PWM() { /* ++++++++ subroutine to calculate PWM duty cycle ++++++++++++++*/
|
||||||
|
|
||||||
|
if (currTemperature < tempForFanStartup) { // If the temperature is below the lowest setpoint, turn fan off
|
||||||
|
//analogWrite(fanPwmOutPin, 0); // PWM duty = 0 percent
|
||||||
|
pwmDuty = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currTemperature > tempForFanOnFull) { // If the temperature is above the highest setpoint, turn fan on full
|
||||||
|
//analogWrite(fanPwmOutPin, 255); // PWM duty = 100 percent
|
||||||
|
pwmDuty = 255;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
float tempRange = tempForFanOnFull - tempForFanStartup ; // start calculating duty cycle
|
||||||
|
float pwmRange = 255.0 - pwmMinStartupDuty ;
|
||||||
|
float pwmDutyPct = (currTemperature - tempForFanStartup) / tempRange ;
|
||||||
|
|
||||||
|
pwmDuty = (int) (pwmMinStartupDuty + (pwmDutyPct * pwmRange) +.5); // actual PWM duty is calculated here
|
||||||
|
|
||||||
|
fanSpeedPct = map(pwmDuty, 0, 255, 0, 100);
|
||||||
|
|
||||||
|
if (pwmDuty > 255) { // make sure duty ended up between 255 and 0
|
||||||
|
pwmDuty = 255;
|
||||||
|
}
|
||||||
|
if (pwmDuty < 0) {
|
||||||
|
pwmDuty = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//analogWrite(fanPwmOutPin, pwmDuty); // write PWM duty to PWM output pin
|
||||||
|
|
||||||
|
} // end calculate_and_send_PWM
|
||||||
|
|
||||||
|
void readAndTranslateTempSensor() {
|
||||||
|
// Request temperature readings
|
||||||
|
sensorClt1.requestTemperatures();
|
||||||
|
|
||||||
|
// Read the temperature from the sensor
|
||||||
|
float tempC = sensorClt1.getTempCByIndex(0);
|
||||||
|
|
||||||
|
// Check if the temperature reading is within the valid range
|
||||||
|
if (tempC > -30 && tempC < 130) {
|
||||||
|
// If the reading is within the valid range, update the current temperature
|
||||||
|
currTemperature = tempC;
|
||||||
|
}
|
||||||
|
// If the reading is outside the valid range, do not update the current temperature
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayOutput() {
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
display.setTextSize(1);
|
||||||
|
display.setTextColor(SH110X_WHITE);
|
||||||
|
|
||||||
|
// Display temperature on the screen in Celsius with one decimal place
|
||||||
|
display.setCursor(0, 0);
|
||||||
|
display.print("Temp:");
|
||||||
|
display.setCursor(30, 0);
|
||||||
|
display.print(currTemperature, 0); // Display one decimal place
|
||||||
|
|
||||||
|
// Calculate and display fan speed percentage
|
||||||
|
if (currTemperature < tempForFanStartup) {
|
||||||
|
fanSpeedPct = 0; // Set fan speed to 0% if temperature is below startup threshold
|
||||||
|
} else {
|
||||||
|
fanSpeedPct = map(pwmDuty, 0, 255, 0, 100); // Calculate fan speed percentage
|
||||||
|
}
|
||||||
|
|
||||||
|
display.setCursor(0, 10);
|
||||||
|
display.print("Fan%:");
|
||||||
|
display.setCursor(30, 10);
|
||||||
|
display.print((int)fanSpeedPct);
|
||||||
|
|
||||||
|
// Update the display
|
||||||
|
display.display();
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_to_serial_port() { /* ++++++++++ optional prints values to laptop usb port for debugging and calibration ++*/
|
||||||
|
Serial.print(F("currTemperature C: ")); Serial.print(currTemperature);
|
||||||
|
Serial.print(F(" pwmDuty: ")); Serial.println(pwmDuty);
|
||||||
|
Serial.print(F("Percentage: ")); Serial.println((int)fanSpeedPct);
|
||||||
|
}
|
||||||
|
|
||||||
|
void serial_to_signal_generator() {
|
||||||
|
// Determine fan speed percentage to send
|
||||||
|
int speedToSend = (int)fanSpeedPct;
|
||||||
|
|
||||||
|
// Ensure fan speed is 0 if temperature is below startup threshold
|
||||||
|
if (currTemperature < tempForFanStartup) {
|
||||||
|
speedToSend = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check the length of fanSpeedPct
|
||||||
|
if (speedToSend < 10) {
|
||||||
|
secondSerial.print(F("D00")); // Add "D00" prefix for single-digit fan speed
|
||||||
|
} else if (speedToSend < 100) {
|
||||||
|
secondSerial.print(F("D0")); // Add "D0" prefix for double-digit fan speed
|
||||||
|
} else {
|
||||||
|
secondSerial.print(F("D")); // Add "D" prefix for triple-digit fan speed
|
||||||
|
}
|
||||||
|
|
||||||
|
secondSerial.print(speedToSend); // Send fan speed
|
||||||
|
}
|
||||||
@@ -0,0 +1,187 @@
|
|||||||
|
/* Latest running code on the Arduino in the Pontiac as of 06.06.2024 */
|
||||||
|
/* Added watchdog timer, 4 seconds. */
|
||||||
|
|
||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_SH110X.h>
|
||||||
|
#include <SoftwareSerial.h>
|
||||||
|
#include <avr/wdt.h>
|
||||||
|
#include <Fonts/FreeSans9pt7b.h>
|
||||||
|
|
||||||
|
#define i2c_Address 0x3C // OLED Adress.
|
||||||
|
#define SCREEN_WIDTH 128
|
||||||
|
#define SCREEN_HEIGHT 64
|
||||||
|
#define OLED_RESET -1
|
||||||
|
|
||||||
|
float tempForFanStartup = 85.0; // 175 target low temp. below this temperature, the fan will be off
|
||||||
|
float tempForFanOnFull = 100.0; // 210 target High temp. above this temperature, the fan will be on at full power
|
||||||
|
|
||||||
|
float voltsForFanStartup = 2.0; // Roughly the signal voltage that triggers the slowest speed.
|
||||||
|
|
||||||
|
const int fanPwmOutPin = 12; // Arduino forces this pin to 0 or 5 volts.
|
||||||
|
const int tempSensorPin = 7; // Pin to read analog voltage from the temp sensor.
|
||||||
|
int pwmDuty; // The calculated PWM duty is stored here
|
||||||
|
float pwmMinStartupDuty; // the starting duty is stored here (mazda module starts fans at about 24 % duty)
|
||||||
|
float currTemperature; // the temperature in F is stored here
|
||||||
|
float fanSpeedPct;
|
||||||
|
|
||||||
|
OneWire oneWire1 (tempSensorPin);
|
||||||
|
DallasTemperature sensorClt1(&oneWire1);
|
||||||
|
|
||||||
|
const byte rxPin = 2;
|
||||||
|
const byte txPin = 3;
|
||||||
|
SoftwareSerial secondSerial (rxPin, txPin);
|
||||||
|
|
||||||
|
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||||
|
|
||||||
|
unsigned long previousMillis = 0; // Variable to store the last time the serial data was sent
|
||||||
|
const long interval = 5000; // Interval between serial data transmissions (in milliseconds)
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
wdt_enable(WDTO_4S);
|
||||||
|
Serial.begin(115200); // set up serial port for 115200 baud (optional)
|
||||||
|
|
||||||
|
if (!display.begin(i2c_Address)) {
|
||||||
|
Serial.println(F("SH110X allocation failed"));
|
||||||
|
for (;;);
|
||||||
|
}
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
secondSerial.begin(9600);
|
||||||
|
delay(500);
|
||||||
|
secondSerial.print("F20.0");
|
||||||
|
delay(20);
|
||||||
|
secondSerial.print("D000");
|
||||||
|
|
||||||
|
sensorClt1.begin();
|
||||||
|
sensorClt1.requestTemperatures();
|
||||||
|
currTemperature = sensorClt1.getTempCByIndex(0);
|
||||||
|
|
||||||
|
pwmMinStartupDuty = (voltsForFanStartup / 5.0) * 255.0; // convert the Mazda starting voltage to a PWM duty
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
unsigned long currentMillis = millis();
|
||||||
|
readAndTranslateTempSensor();
|
||||||
|
calculate_and_send_PWM();
|
||||||
|
//print_to_serial_port(); // uncomment this line for testing and calibration to the laptop.
|
||||||
|
|
||||||
|
// Check if it's time to send serial data
|
||||||
|
if (currentMillis - previousMillis >= interval) {
|
||||||
|
serial_to_signal_generator(); // Send serial data
|
||||||
|
previousMillis = currentMillis; // Save the last time serial data was sent
|
||||||
|
}
|
||||||
|
|
||||||
|
displayOutput();
|
||||||
|
wdt_reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void calculate_and_send_PWM() { /* ++++++++ subroutine to calculate PWM duty cycle ++++++++++++++*/
|
||||||
|
|
||||||
|
if (currTemperature < tempForFanStartup) { // If the temperature is below the lowest setpoint, turn fan off
|
||||||
|
//analogWrite(fanPwmOutPin, 0); // PWM duty = 0 percent
|
||||||
|
pwmDuty = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currTemperature > tempForFanOnFull) { // If the temperature is above the highest setpoint, turn fan on full
|
||||||
|
//analogWrite(fanPwmOutPin, 255); // PWM duty = 100 percent
|
||||||
|
pwmDuty = 255;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
float tempRange = tempForFanOnFull - tempForFanStartup ; // start calculating duty cycle
|
||||||
|
float pwmRange = 255.0 - pwmMinStartupDuty ;
|
||||||
|
float pwmDutyPct = (currTemperature - tempForFanStartup) / tempRange ;
|
||||||
|
|
||||||
|
pwmDuty = (int) (pwmMinStartupDuty + (pwmDutyPct * pwmRange) +.5); // actual PWM duty is calculated here
|
||||||
|
|
||||||
|
fanSpeedPct = map(pwmDuty, 0, 255, 0, 100);
|
||||||
|
|
||||||
|
if (pwmDuty > 255) { // make sure duty ended up between 255 and 0
|
||||||
|
pwmDuty = 255;
|
||||||
|
}
|
||||||
|
if (pwmDuty < 0) {
|
||||||
|
pwmDuty = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//analogWrite(fanPwmOutPin, pwmDuty); // write PWM duty to PWM output pin
|
||||||
|
|
||||||
|
} // end calculate_and_send_PWM
|
||||||
|
|
||||||
|
void readAndTranslateTempSensor() {
|
||||||
|
// Request temperature readings
|
||||||
|
sensorClt1.requestTemperatures();
|
||||||
|
|
||||||
|
// Read the temperature from the sensor
|
||||||
|
float tempC = sensorClt1.getTempCByIndex(0);
|
||||||
|
|
||||||
|
// Check if the temperature reading is within the valid range
|
||||||
|
if (tempC > -30 && tempC < 130) {
|
||||||
|
// If the reading is within the valid range, update the current temperature
|
||||||
|
currTemperature = tempC;
|
||||||
|
}
|
||||||
|
// If the reading is outside the valid range, do not update the current temperature
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayOutput() {
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
//display.setTextSize(1);
|
||||||
|
display.setFont(&FreeSans9pt7b);
|
||||||
|
display.setTextColor(SH110X_WHITE);
|
||||||
|
|
||||||
|
// Display temperature on the screen in Celsius with one decimal place
|
||||||
|
display.setCursor(0, 20);
|
||||||
|
display.print("Temp:");
|
||||||
|
display.setCursor(55, 20);
|
||||||
|
display.print(currTemperature, 1); // Display one decimal place
|
||||||
|
|
||||||
|
// Calculate and display fan speed percentage
|
||||||
|
if (currTemperature < tempForFanStartup) {
|
||||||
|
fanSpeedPct = 0; // Set fan speed to 0% if temperature is below startup threshold
|
||||||
|
} else {
|
||||||
|
fanSpeedPct = map(pwmDuty, 0, 255, 0, 100); // Calculate fan speed percentage
|
||||||
|
}
|
||||||
|
|
||||||
|
display.setCursor(0, 40);
|
||||||
|
display.print("Fan%:");
|
||||||
|
display.setCursor(55, 40);
|
||||||
|
display.print((int)fanSpeedPct);
|
||||||
|
|
||||||
|
display.setTextSize(1);
|
||||||
|
display.setCursor(0, 60);
|
||||||
|
display.print(" Bolt!");
|
||||||
|
|
||||||
|
// Update the display
|
||||||
|
display.display();
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_to_serial_port() { /* ++++++++++ optional prints values to laptop usb port for debugging and calibration ++*/
|
||||||
|
Serial.print(F("currTemperature C: ")); Serial.print(currTemperature);
|
||||||
|
Serial.print(F(" pwmDuty: ")); Serial.println(pwmDuty);
|
||||||
|
Serial.print(F("Percentage: ")); Serial.println((int)fanSpeedPct);
|
||||||
|
}
|
||||||
|
|
||||||
|
void serial_to_signal_generator() {
|
||||||
|
// Determine fan speed percentage to send
|
||||||
|
int speedToSend = (int)fanSpeedPct;
|
||||||
|
|
||||||
|
// Ensure fan speed is 0 if temperature is below startup threshold
|
||||||
|
if (currTemperature < tempForFanStartup) {
|
||||||
|
speedToSend = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check the length of fanSpeedPct
|
||||||
|
if (speedToSend < 10) {
|
||||||
|
secondSerial.print(F("D00")); // Add "D00" prefix for single-digit fan speed
|
||||||
|
} else if (speedToSend < 100) {
|
||||||
|
secondSerial.print(F("D0")); // Add "D0" prefix for double-digit fan speed
|
||||||
|
} else {
|
||||||
|
secondSerial.print(F("D")); // Add "D" prefix for triple-digit fan speed
|
||||||
|
}
|
||||||
|
|
||||||
|
secondSerial.print(speedToSend); // Send fan speed
|
||||||
|
}
|
||||||
@@ -0,0 +1,253 @@
|
|||||||
|
/* Latest running code on the Arduino in the Pontiac as of 06.06.2024 */
|
||||||
|
/* Added watchdog timer, 4 seconds. */
|
||||||
|
|
||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_SH110X.h>
|
||||||
|
//#include <SoftwareSerial.h>
|
||||||
|
#include <avr/wdt.h>
|
||||||
|
|
||||||
|
#define i2c_Address 0x3C // OLED Adress.
|
||||||
|
#define SCREEN_WIDTH 128
|
||||||
|
#define SCREEN_HEIGHT 64
|
||||||
|
#define OLED_RESET -1
|
||||||
|
|
||||||
|
int M3200address = 0x28; // 0x28, 0x36, or 0x46, depending on the sensor.
|
||||||
|
float maxPressure = 100; // pressure in PSI for this sensor, 100, 250, 500, ... 10k.
|
||||||
|
float pressureO;
|
||||||
|
float temperatureO;
|
||||||
|
byte status;
|
||||||
|
|
||||||
|
float tempForFanStartup = 85.0; // 175 target low temp. below this temperature, the fan will be off
|
||||||
|
float tempForFanOnFull = 100.0; // 210 target High temp. above this temperature, the fan will be on at full power
|
||||||
|
|
||||||
|
float voltsForFanStartup = 2.0; // Roughly the signal voltage that triggers the slowest speed.
|
||||||
|
|
||||||
|
const int fanPwmOutPin = 12; // Arduino forces this pin to 0 or 5 volts.
|
||||||
|
const int tempSensorPin = 7; // Pin to read analog voltage from the temp sensor.
|
||||||
|
int pwmDuty; // The calculated PWM duty is stored here
|
||||||
|
float pwmMinStartupDuty; // the starting duty is stored here (mazda module starts fans at about 24 % duty)
|
||||||
|
float currTemperature; // the temperature in F is stored here
|
||||||
|
float fanSpeedPct;
|
||||||
|
|
||||||
|
OneWire oneWire1 (tempSensorPin);
|
||||||
|
DallasTemperature sensorClt1(&oneWire1);
|
||||||
|
|
||||||
|
/*const byte rxPin = 2;
|
||||||
|
const byte txPin = 3;
|
||||||
|
SoftwareSerial secondSerial (rxPin, txPin);*/
|
||||||
|
|
||||||
|
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||||
|
|
||||||
|
unsigned long previousMillis = 0; // Variable to store the last time the serial data was sent
|
||||||
|
const long interval = 5000; // Interval between serial data transmissions (in milliseconds)
|
||||||
|
|
||||||
|
unsigned long pressureMillis = 0;
|
||||||
|
const int pressureTiming = 1000; // 500ms every data acquisition
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
//wdt_enable(WDTO_4S);
|
||||||
|
|
||||||
|
Serial.begin(9600); // set up serial port for 115200 baud (optional)
|
||||||
|
|
||||||
|
Serial.println("Setup start...");
|
||||||
|
|
||||||
|
Wire.begin();
|
||||||
|
delay(2000);
|
||||||
|
|
||||||
|
if (!display.begin(i2c_Address)) {
|
||||||
|
Serial.println(F("SH110X allocation failed"));
|
||||||
|
for (;;);
|
||||||
|
}
|
||||||
|
display.clearDisplay(); // Clear the display buffer
|
||||||
|
|
||||||
|
Serial.println("Starting Dallas DS1820...");
|
||||||
|
sensorClt1.begin();
|
||||||
|
sensorClt1.requestTemperatures();
|
||||||
|
|
||||||
|
currTemperature = sensorClt1.getTempCByIndex(0);
|
||||||
|
pwmMinStartupDuty = (voltsForFanStartup / 5.0) * 255.0; // convert the Mazda starting voltage to a PWM duty
|
||||||
|
|
||||||
|
//Serial.println("Starting softSerial...");
|
||||||
|
/*secondSerial.begin(9600);
|
||||||
|
delay(500);
|
||||||
|
secondSerial.print("F20.0");
|
||||||
|
delay(20);
|
||||||
|
secondSerial.print("D000");*/
|
||||||
|
Serial.println("Setup done, running loop...");
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
unsigned long currentMillis = millis();
|
||||||
|
unsigned long pressureMillis = millis();
|
||||||
|
|
||||||
|
|
||||||
|
if (currentMillis - previousMillis >= pressureTiming) {
|
||||||
|
get_data_from_M3200();
|
||||||
|
previousMillis = currentMillis;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
readAndTranslateTempSensor();
|
||||||
|
calculate_and_send_PWM();
|
||||||
|
//print_to_serial_port(); // uncomment this line for testing and calibration to the laptop.
|
||||||
|
|
||||||
|
// Check if it's time to send serial data
|
||||||
|
/* if (currentMillis - previousMillis >= interval) {
|
||||||
|
serial_to_signal_generator(); // Send serial data
|
||||||
|
previousMillis = currentMillis; // Save the last time serial data was sent
|
||||||
|
}*/
|
||||||
|
displayOutput();
|
||||||
|
//wdt_reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void calculate_and_send_PWM() { /* ++++++++ subroutine to calculate PWM duty cycle ++++++++++++++*/
|
||||||
|
|
||||||
|
if (currTemperature < tempForFanStartup) { // If the temperature is below the lowest setpoint, turn fan off
|
||||||
|
//analogWrite(fanPwmOutPin, 0); // PWM duty = 0 percent
|
||||||
|
pwmDuty = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currTemperature > tempForFanOnFull) { // If the temperature is above the highest setpoint, turn fan on full
|
||||||
|
//analogWrite(fanPwmOutPin, 255); // PWM duty = 100 percent
|
||||||
|
pwmDuty = 255;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
float tempRange = tempForFanOnFull - tempForFanStartup ; // start calculating duty cycle
|
||||||
|
float pwmRange = 255.0 - pwmMinStartupDuty ;
|
||||||
|
float pwmDutyPct = (currTemperature - tempForFanStartup) / tempRange ;
|
||||||
|
|
||||||
|
pwmDuty = (int) (pwmMinStartupDuty + (pwmDutyPct * pwmRange) +.5); // actual PWM duty is calculated here
|
||||||
|
|
||||||
|
fanSpeedPct = map(pwmDuty, 0, 255, 0, 100);
|
||||||
|
|
||||||
|
if (pwmDuty > 255) { // make sure duty ended up between 255 and 0
|
||||||
|
pwmDuty = 255;
|
||||||
|
}
|
||||||
|
if (pwmDuty < 0) {
|
||||||
|
pwmDuty = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//analogWrite(fanPwmOutPin, pwmDuty); // write PWM duty to PWM output pin
|
||||||
|
|
||||||
|
} // end calculate_and_send_PWM
|
||||||
|
|
||||||
|
void readAndTranslateTempSensor() {
|
||||||
|
// Request temperature readings
|
||||||
|
sensorClt1.requestTemperatures();
|
||||||
|
|
||||||
|
// Read the temperature from the sensor
|
||||||
|
float tempC = sensorClt1.getTempCByIndex(0);
|
||||||
|
|
||||||
|
// Check if the temperature reading is within the valid range
|
||||||
|
if (tempC > -30 && tempC < 130) {
|
||||||
|
// If the reading is within the valid range, update the current temperature
|
||||||
|
currTemperature = tempC;
|
||||||
|
}
|
||||||
|
// If the reading is outside the valid range, do not update the current temperature
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayOutput() {
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
display.setTextSize(1);
|
||||||
|
display.setTextColor(SH110X_WHITE);
|
||||||
|
|
||||||
|
// Display temperature on the screen in Celsius with one decimal place
|
||||||
|
display.setCursor(0, 0);
|
||||||
|
display.print("Temp:");
|
||||||
|
display.setCursor(30, 0);
|
||||||
|
display.print(currTemperature, 1); // Display one decimal place
|
||||||
|
|
||||||
|
// Calculate and display fan speed percentage
|
||||||
|
if (currTemperature < tempForFanStartup) {
|
||||||
|
fanSpeedPct = 0; // Set fan speed to 0% if temperature is below startup threshold
|
||||||
|
} else {
|
||||||
|
fanSpeedPct = map(pwmDuty, 0, 255, 0, 100); // Calculate fan speed percentage
|
||||||
|
}
|
||||||
|
|
||||||
|
display.setCursor(0, 10);
|
||||||
|
display.print("Fan%:");
|
||||||
|
display.setCursor(30, 10);
|
||||||
|
display.print((int)fanSpeedPct);
|
||||||
|
|
||||||
|
display.setCursor(0, 30);
|
||||||
|
display.print("PrsO:");
|
||||||
|
display.setCursor(30, 30);
|
||||||
|
display.print(pressureO);
|
||||||
|
|
||||||
|
display.setCursor(0, 40);
|
||||||
|
display.print("TmpO:");
|
||||||
|
display.setCursor(30, 40);
|
||||||
|
display.print(temperatureO);
|
||||||
|
// Update the display
|
||||||
|
display.display();
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_to_serial_port() { /* ++++++++++ optional prints values to laptop usb port for debugging and calibration ++*/
|
||||||
|
Serial.print(F("currTemperature C: ")); Serial.print(currTemperature);
|
||||||
|
Serial.print(F(" pwmDuty: ")); Serial.println(pwmDuty);
|
||||||
|
Serial.print(F("Percentage: ")); Serial.println((int)fanSpeedPct);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*void serial_to_signal_generator() {
|
||||||
|
// Determine fan speed percentage to send
|
||||||
|
int speedToSend = (int)fanSpeedPct;
|
||||||
|
|
||||||
|
// Ensure fan speed is 0 if temperature is below startup threshold
|
||||||
|
if (currTemperature < tempForFanStartup) {
|
||||||
|
speedToSend = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check the length of fanSpeedPct
|
||||||
|
if (speedToSend < 10) {
|
||||||
|
secondSerial.print(F("D00")); // Add "D00" prefix for single-digit fan speed
|
||||||
|
} else if (speedToSend < 100) {
|
||||||
|
secondSerial.print(F("D0")); // Add "D0" prefix for double-digit fan speed
|
||||||
|
} else {
|
||||||
|
secondSerial.print(F("D")); // Add "D" prefix for triple-digit fan speed
|
||||||
|
}
|
||||||
|
|
||||||
|
secondSerial.print(speedToSend); // Send fan speed
|
||||||
|
}*/
|
||||||
|
|
||||||
|
void get_data_from_M3200() {
|
||||||
|
Wire.requestFrom(M3200address, 4); // request 4 bytes
|
||||||
|
int n = Wire.available();
|
||||||
|
|
||||||
|
if (n == 4) {
|
||||||
|
status = 0;
|
||||||
|
uint16_t rawP; // pressure data from sensor
|
||||||
|
uint16_t rawT; // temperature data from sensor
|
||||||
|
rawP = (uint16_t) Wire.read(); // upper 8 bits
|
||||||
|
rawP <<= 8;
|
||||||
|
rawP |= (uint16_t) Wire.read(); // lower 8 bits
|
||||||
|
rawT = (uint16_t) Wire.read(); // upper 8 bits
|
||||||
|
rawT <<= 8;
|
||||||
|
rawT |= (uint16_t) Wire.read(); // lower 8 bits
|
||||||
|
|
||||||
|
status = rawP >> 14; // The status is 0, 1, 2, or 3
|
||||||
|
rawP &= 0x3FFF; // keep 14 bits, remove status bits
|
||||||
|
|
||||||
|
rawT >>= 5; // the lowest 5 bits are not used
|
||||||
|
|
||||||
|
float pressure = ((rawP - 1000.0) / (15000.0 - 1000.0)) * maxPressure;
|
||||||
|
float temperature = ((rawT - 512.0) / (1075.0 - 512.0)) * 55.0;
|
||||||
|
|
||||||
|
temperatureO = temperature;
|
||||||
|
pressureO = pressure;
|
||||||
|
|
||||||
|
Serial.println("--- Values from M3200 ---");
|
||||||
|
Serial.println(temperature);
|
||||||
|
Serial.println(pressure);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} else {
|
||||||
|
Serial.println("M3200 Pressure Transducer not Detected");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,247 @@
|
|||||||
|
/* Latest DinoFan 19.06.2024-001
|
||||||
|
Added watchdog timer, 4 seconds.
|
||||||
|
Removed SoftSerial since it interferred with Wire.h
|
||||||
|
Added M3200 sensor for oil temp and pressure. */
|
||||||
|
|
||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_SH110X.h>
|
||||||
|
#include <avr/wdt.h>
|
||||||
|
|
||||||
|
#define i2c_Address 0x3C // OLED Adress.
|
||||||
|
#define SCREEN_WIDTH 128
|
||||||
|
#define SCREEN_HEIGHT 64
|
||||||
|
#define OLED_RESET -1
|
||||||
|
|
||||||
|
int M3200address = 0x28; // 0x28, 0x36, or 0x46, depending on the sensor.
|
||||||
|
float maxPressure = 100; // pressure in PSI for this sensor, 100, 250, 500, ... 10k.
|
||||||
|
float pressure;
|
||||||
|
float temperature;
|
||||||
|
byte status;
|
||||||
|
|
||||||
|
float tempForFanStartup = 85.0; // 175 target low temp. below this temperature, the fan will be off
|
||||||
|
float tempForFanOnFull = 100.0; // 210 target High temp. above this temperature, the fan will be on at full power
|
||||||
|
|
||||||
|
float voltsForFanStartup = 2.0; // Roughly the signal voltage that triggers the slowest speed.
|
||||||
|
|
||||||
|
const int fanPwmOutPin = 12; // Arduino forces this pin to 0 or 5 volts.
|
||||||
|
const int tempSensorPin = 7; // Pin to read analog voltage from the temp sensor.
|
||||||
|
int pwmDuty; // The calculated PWM duty is stored here
|
||||||
|
float pwmMinStartupDuty; // the starting duty is stored here (mazda module starts fans at about 24 % duty)
|
||||||
|
float currTemperature; // the temperature in F is stored here
|
||||||
|
float fanSpeedPct;
|
||||||
|
|
||||||
|
OneWire oneWire1 (tempSensorPin);
|
||||||
|
DallasTemperature sensorClt1(&oneWire1);
|
||||||
|
|
||||||
|
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||||
|
|
||||||
|
unsigned long previousMillis = 0; // Variable to store the last time the serial data was sent
|
||||||
|
const long interval = 5000; // Interval between serial data transmissions (in milliseconds)
|
||||||
|
|
||||||
|
unsigned long previous2Millis = 0;
|
||||||
|
const int pressureTiming = 1000; // 500ms every data acquisition
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
wdt_enable(WDTO_4S);
|
||||||
|
Serial.begin(9600);
|
||||||
|
Wire.begin();
|
||||||
|
|
||||||
|
if (!display.begin(i2c_Address)) {
|
||||||
|
Serial.println(F("SH110X allocation failed"));
|
||||||
|
for (;;);
|
||||||
|
}
|
||||||
|
display.clearDisplay(); // Clear the display buffer
|
||||||
|
|
||||||
|
sensorClt1.begin();
|
||||||
|
sensorClt1.requestTemperatures();
|
||||||
|
|
||||||
|
currTemperature = sensorClt1.getTempCByIndex(0);
|
||||||
|
pwmMinStartupDuty = (voltsForFanStartup / 5.0) * 255.0; // convert the Mazda starting voltage to a PWM duty
|
||||||
|
|
||||||
|
delay(500);
|
||||||
|
Serial.print("F20.0");
|
||||||
|
delay(20);
|
||||||
|
Serial.print("D000");
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
unsigned long currentMillis = millis();
|
||||||
|
unsigned long pressureMillis = millis();
|
||||||
|
|
||||||
|
//Pull data from M3200 every second.
|
||||||
|
if (pressureMillis - previous2Millis >= pressureTiming) {
|
||||||
|
get_data_from_M3200();
|
||||||
|
previous2Millis = pressureMillis;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
readAndTranslateTempSensor();
|
||||||
|
calculate_and_send_PWM();
|
||||||
|
//print_to_serial_port(); // uncomment this line for testing and calibration to the laptop.
|
||||||
|
|
||||||
|
// Check if it's time to send serial data
|
||||||
|
if (currentMillis - previousMillis >= interval) {
|
||||||
|
serial_to_signal_generator(); // Send serial data
|
||||||
|
previousMillis = currentMillis; // Save the last time serial data was sent
|
||||||
|
}
|
||||||
|
displayOutput();
|
||||||
|
wdt_reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void calculate_and_send_PWM() { /* ++++++++ subroutine to calculate PWM duty cycle ++++++++++++++*/
|
||||||
|
|
||||||
|
if (currTemperature < tempForFanStartup) { // If the temperature is below the lowest setpoint, turn fan off
|
||||||
|
//analogWrite(fanPwmOutPin, 0); // PWM duty = 0 percent
|
||||||
|
pwmDuty = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currTemperature > tempForFanOnFull) { // If the temperature is above the highest setpoint, turn fan on full
|
||||||
|
//analogWrite(fanPwmOutPin, 255); // PWM duty = 100 percent
|
||||||
|
pwmDuty = 255;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
float tempRange = tempForFanOnFull - tempForFanStartup ; // start calculating duty cycle
|
||||||
|
float pwmRange = 255.0 - pwmMinStartupDuty ;
|
||||||
|
float pwmDutyPct = (currTemperature - tempForFanStartup) / tempRange ;
|
||||||
|
|
||||||
|
pwmDuty = (int) (pwmMinStartupDuty + (pwmDutyPct * pwmRange) +.5); // actual PWM duty is calculated here
|
||||||
|
|
||||||
|
fanSpeedPct = map(pwmDuty, 0, 255, 0, 100);
|
||||||
|
|
||||||
|
if (pwmDuty > 255) { // make sure duty ended up between 255 and 0
|
||||||
|
pwmDuty = 255;
|
||||||
|
}
|
||||||
|
if (pwmDuty < 0) {
|
||||||
|
pwmDuty = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//analogWrite(fanPwmOutPin, pwmDuty); // write PWM duty to PWM output pin
|
||||||
|
|
||||||
|
} // end calculate_and_send_PWM
|
||||||
|
|
||||||
|
void readAndTranslateTempSensor() {
|
||||||
|
// Request temperature readings
|
||||||
|
sensorClt1.requestTemperatures();
|
||||||
|
|
||||||
|
// Read the temperature from the sensor
|
||||||
|
float tempC = sensorClt1.getTempCByIndex(0);
|
||||||
|
|
||||||
|
// Check if the temperature reading is within the valid range
|
||||||
|
if (tempC > -30 && tempC < 130) {
|
||||||
|
// If the reading is within the valid range, update the current temperature
|
||||||
|
currTemperature = tempC;
|
||||||
|
}
|
||||||
|
// If the reading is outside the valid range, do not update the current temperature
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayOutput() {
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
display.setTextSize(1);
|
||||||
|
display.setTextColor(SH110X_WHITE);
|
||||||
|
|
||||||
|
// Display temperature on the screen in Celsius with one decimal place
|
||||||
|
display.setCursor(12, 0);
|
||||||
|
display.print("Pontiac LeMans '69");
|
||||||
|
display.drawLine(2, 10, 126, 10, SH110X_WHITE);
|
||||||
|
|
||||||
|
display.setCursor(0, 16);
|
||||||
|
display.print("Water temp:");
|
||||||
|
display.setCursor(70, 16);
|
||||||
|
display.print(currTemperature, 1); // Display one decimal place
|
||||||
|
display.print(" C");
|
||||||
|
|
||||||
|
// Calculate and display fan speed percentage
|
||||||
|
if (currTemperature < tempForFanStartup) {
|
||||||
|
fanSpeedPct = 0; // Set fan speed to 0% if temperature is below startup threshold
|
||||||
|
} else {
|
||||||
|
fanSpeedPct = map(pwmDuty, 0, 255, 0, 100); // Calculate fan speed percentage
|
||||||
|
}
|
||||||
|
|
||||||
|
display.setCursor(0, 26);
|
||||||
|
display.print("Fan Speed :");
|
||||||
|
display.setCursor(70, 26);
|
||||||
|
display.print((int)fanSpeedPct);
|
||||||
|
display.print(" %");
|
||||||
|
|
||||||
|
display.setCursor(0, 46);
|
||||||
|
display.print("Oil Pressr:");
|
||||||
|
display.setCursor(70, 46);
|
||||||
|
display.print(pressure, 1);
|
||||||
|
display.print(" b");
|
||||||
|
|
||||||
|
display.setCursor(0, 56);
|
||||||
|
display.print("Oil Temp :");
|
||||||
|
display.setCursor(70, 56);
|
||||||
|
display.print(temperature, 1);
|
||||||
|
display.print(" C");
|
||||||
|
|
||||||
|
// Update the display
|
||||||
|
display.display();
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_to_serial_port() { /* ++++++++++ optional prints values to laptop usb port for debugging and calibration ++*/
|
||||||
|
Serial.print(F("currTemperature C: ")); Serial.print(currTemperature);
|
||||||
|
Serial.print(F(" pwmDuty: ")); Serial.println(pwmDuty);
|
||||||
|
Serial.print(F("Percentage: ")); Serial.println((int)fanSpeedPct);
|
||||||
|
}
|
||||||
|
|
||||||
|
void serial_to_signal_generator() {
|
||||||
|
// Determine fan speed percentage to send
|
||||||
|
int speedToSend = (int)fanSpeedPct;
|
||||||
|
|
||||||
|
// Ensure fan speed is 0 if temperature is below startup threshold
|
||||||
|
if (currTemperature < tempForFanStartup) {
|
||||||
|
speedToSend = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check the length of fanSpeedPct
|
||||||
|
if (speedToSend < 10) {
|
||||||
|
Serial.print(F("D00")); // Add "D00" prefix for single-digit fan speed
|
||||||
|
} else if (speedToSend < 100) {
|
||||||
|
Serial.print(F("D0")); // Add "D0" prefix for double-digit fan speed
|
||||||
|
} else {
|
||||||
|
Serial.print(F("D")); // Add "D" prefix for triple-digit fan speed
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.print(speedToSend); // Send fan speed
|
||||||
|
}
|
||||||
|
|
||||||
|
void get_data_from_M3200() {
|
||||||
|
Wire.requestFrom(M3200address, 4); // request 4 bytes
|
||||||
|
int n = Wire.available();
|
||||||
|
|
||||||
|
if (n == 4) {
|
||||||
|
status = 0;
|
||||||
|
uint16_t rawP; // pressure data from sensor
|
||||||
|
uint16_t rawT; // temperature data from sensor
|
||||||
|
rawP = (uint16_t) Wire.read(); // upper 8 bits
|
||||||
|
rawP <<= 8;
|
||||||
|
rawP |= (uint16_t) Wire.read(); // lower 8 bits
|
||||||
|
rawT = (uint16_t) Wire.read(); // upper 8 bits
|
||||||
|
rawT <<= 8;
|
||||||
|
rawT |= (uint16_t) Wire.read(); // lower 8 bits
|
||||||
|
|
||||||
|
status = rawP >> 14; // The status is 0, 1, 2, or 3
|
||||||
|
rawP &= 0x3FFF; // keep 14 bits, remove status bits
|
||||||
|
|
||||||
|
rawT >>= 5; // the lowest 5 bits are not used
|
||||||
|
|
||||||
|
pressure = ((rawP - 1000.0) / (15000.0 - 1000.0)) * maxPressure;
|
||||||
|
temperature = ((rawT - 512.0) / (1075.0 - 512.0)) * 55.0;
|
||||||
|
|
||||||
|
// Serial.println("--- Values from M3200 ---");
|
||||||
|
// Serial.println(temperature);
|
||||||
|
// Serial.println(pressure);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} else {
|
||||||
|
Serial.println("M3200 Pressure Transducer not Detected");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,192 @@
|
|||||||
|
/* -- DinoCool --- */
|
||||||
|
|
||||||
|
/* Latest running code on the Arduino in the Pontiac as of 06.06.2024 */
|
||||||
|
/* Added watchdog timer, 4 seconds. */
|
||||||
|
/* Will add MT3200 oil pressure and temp sensor */
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_SH110X.h>
|
||||||
|
#include <SoftwareSerial.h>
|
||||||
|
#include <avr/wdt.h>
|
||||||
|
|
||||||
|
#define i2c_Address 0x3C // OLED Adress.
|
||||||
|
#define SCREEN_WIDTH 128
|
||||||
|
#define SCREEN_HEIGHT 64
|
||||||
|
#define OLED_RESET -1
|
||||||
|
|
||||||
|
float tempForFanStartup = 85.0; // 175 target low temp. below this temperature, the fan will be off
|
||||||
|
float tempForFanOnFull = 100.0; // 210 target High temp. above this temperature, the fan will be on at full power
|
||||||
|
float voltsForFanStartup = 2.0; // Roughly the signal voltage that triggers the slowest speed.
|
||||||
|
|
||||||
|
const int fanPwmOutPin = 12; // Arduino forces this pin to 0 or 5 volts.
|
||||||
|
const int tempSensorPin = 7; // Pin to read analog voltage from the temp sensor.
|
||||||
|
int pwmDuty; // The calculated PWM duty is stored here
|
||||||
|
float pwmMinStartupDuty; // the starting duty is stored here (mazda module starts fans at about 24 % duty)
|
||||||
|
float currTemperature; // the temperature in F is stored here
|
||||||
|
float fanSpeedPct;
|
||||||
|
|
||||||
|
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||||
|
|
||||||
|
OneWire oneWire1 (tempSensorPin);
|
||||||
|
DallasTemperature sensorClt1(&oneWire1);
|
||||||
|
|
||||||
|
const byte rxPin = 2;
|
||||||
|
const byte txPin = 3;
|
||||||
|
SoftwareSerial secondSerial (rxPin, txPin);
|
||||||
|
|
||||||
|
unsigned long previousMillis = 0; // Variable to store the last time the serial data was sent
|
||||||
|
const long interval = 5000; // Interval between serial data transmissions (in milliseconds)
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
//wdt_enable(WDTO_4S);
|
||||||
|
Serial.begin(9600); // set up serial port for 115200 baud (optional)
|
||||||
|
|
||||||
|
Serial.println("Initializing second serial...");
|
||||||
|
secondSerial.begin(9600);
|
||||||
|
delay(500);
|
||||||
|
secondSerial.print("F20.0");
|
||||||
|
delay(20);
|
||||||
|
secondSerial.print("D000");
|
||||||
|
|
||||||
|
Serial.println("Initializing DS1820 sensors...");
|
||||||
|
sensorClt1.begin();
|
||||||
|
sensorClt1.requestTemperatures();
|
||||||
|
|
||||||
|
currTemperature = sensorClt1.getTempCByIndex(0);
|
||||||
|
pwmMinStartupDuty = (voltsForFanStartup / 5.0) * 255.0; // convert the Mazda starting voltage to a PWM duty
|
||||||
|
|
||||||
|
Serial.println("Initializing OLED...");
|
||||||
|
if (!display.begin(i2c_Address)) {
|
||||||
|
Serial.println(F("SH110X allocation failed"));
|
||||||
|
for (;;);
|
||||||
|
}
|
||||||
|
display.clearDisplay();
|
||||||
|
display.display();
|
||||||
|
Serial.println("Setup done...");
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
unsigned long currentMillis = millis();
|
||||||
|
readAndTranslateTempSensor();
|
||||||
|
calculate_and_send_PWM();
|
||||||
|
//print_to_serial_port(); // uncomment this line for testing and calibration to the laptop.
|
||||||
|
|
||||||
|
// Check if it's time to send serial data
|
||||||
|
if (currentMillis - previousMillis >= interval) {
|
||||||
|
serial_to_signal_generator(); // Send serial data
|
||||||
|
previousMillis = currentMillis; // Save the last time serial data was sent
|
||||||
|
}
|
||||||
|
|
||||||
|
displayOutput();
|
||||||
|
wdt_reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void calculate_and_send_PWM() { /* ++++++++ subroutine to calculate PWM duty cycle ++++++++++++++*/
|
||||||
|
|
||||||
|
if (currTemperature < tempForFanStartup) { // If the temperature is below the lowest setpoint, turn fan off
|
||||||
|
//analogWrite(fanPwmOutPin, 0); // PWM duty = 0 percent
|
||||||
|
pwmDuty = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currTemperature > tempForFanOnFull) { // If the temperature is above the highest setpoint, turn fan on full
|
||||||
|
//analogWrite(fanPwmOutPin, 255); // PWM duty = 100 percent
|
||||||
|
pwmDuty = 255;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
float tempRange = tempForFanOnFull - tempForFanStartup ; // start calculating duty cycle
|
||||||
|
float pwmRange = 255.0 - pwmMinStartupDuty ;
|
||||||
|
float pwmDutyPct = (currTemperature - tempForFanStartup) / tempRange ;
|
||||||
|
|
||||||
|
pwmDuty = (int) (pwmMinStartupDuty + (pwmDutyPct * pwmRange) +.5); // actual PWM duty is calculated here
|
||||||
|
|
||||||
|
fanSpeedPct = map(pwmDuty, 0, 255, 0, 100);
|
||||||
|
|
||||||
|
if (pwmDuty > 255) { // make sure duty ended up between 255 and 0
|
||||||
|
pwmDuty = 255;
|
||||||
|
}
|
||||||
|
if (pwmDuty < 0) {
|
||||||
|
pwmDuty = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//analogWrite(fanPwmOutPin, pwmDuty); // write PWM duty to PWM output pin
|
||||||
|
|
||||||
|
} // end calculate_and_send_PWM
|
||||||
|
|
||||||
|
void readAndTranslateTempSensor() {
|
||||||
|
// Request temperature readings
|
||||||
|
sensorClt1.requestTemperatures();
|
||||||
|
|
||||||
|
// Read the temperature from the sensor
|
||||||
|
float tempC = sensorClt1.getTempCByIndex(0);
|
||||||
|
|
||||||
|
// Check if the temperature reading is within the valid range
|
||||||
|
if (tempC > -30 && tempC < 130) {
|
||||||
|
// If the reading is within the valid range, update the current temperature
|
||||||
|
currTemperature = tempC;
|
||||||
|
}
|
||||||
|
// If the reading is outside the valid range, do not update the current temperature
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayOutput() {
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
display.setTextSize(1);
|
||||||
|
//display.setFont(&FreeSans9pt7b);
|
||||||
|
display.setTextColor(SH110X_WHITE);
|
||||||
|
|
||||||
|
// Display temperature on the screen in Celsius with one decimal place
|
||||||
|
display.setCursor(0, 20);
|
||||||
|
display.print("Temp:");
|
||||||
|
display.setCursor(55, 20);
|
||||||
|
display.print(currTemperature, 1); // Display one decimal place
|
||||||
|
|
||||||
|
// Calculate and display fan speed percentage
|
||||||
|
if (currTemperature < tempForFanStartup) {
|
||||||
|
fanSpeedPct = 0; // Set fan speed to 0% if temperature is below startup threshold
|
||||||
|
} else {
|
||||||
|
fanSpeedPct = map(pwmDuty, 0, 255, 0, 100); // Calculate fan speed percentage
|
||||||
|
}
|
||||||
|
|
||||||
|
display.setCursor(0, 40);
|
||||||
|
display.print("Fan%:");
|
||||||
|
display.setCursor(55, 40);
|
||||||
|
display.print((int)fanSpeedPct);
|
||||||
|
|
||||||
|
display.setTextSize(1);
|
||||||
|
display.setCursor(0, 60);
|
||||||
|
display.print("Bolt");
|
||||||
|
|
||||||
|
// Update the display
|
||||||
|
display.display();
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_to_serial_port() { /* ++++++++++ optional prints values to laptop usb port for debugging and calibration ++*/
|
||||||
|
Serial.print(F("currTemperature C: ")); Serial.print(currTemperature);
|
||||||
|
Serial.print(F(" pwmDuty: ")); Serial.println(pwmDuty);
|
||||||
|
Serial.print(F("Percentage: ")); Serial.println((int)fanSpeedPct);
|
||||||
|
}
|
||||||
|
|
||||||
|
void serial_to_signal_generator() {
|
||||||
|
// Determine fan speed percentage to send
|
||||||
|
int speedToSend = (int)fanSpeedPct;
|
||||||
|
|
||||||
|
// Ensure fan speed is 0 if temperature is below startup threshold
|
||||||
|
if (currTemperature < tempForFanStartup) {
|
||||||
|
speedToSend = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check the length of fanSpeedPct
|
||||||
|
if (speedToSend < 10) {
|
||||||
|
secondSerial.print(F("D00")); // Add "D00" prefix for single-digit fan speed
|
||||||
|
} else if (speedToSend < 100) {
|
||||||
|
secondSerial.print(F("D0")); // Add "D0" prefix for double-digit fan speed
|
||||||
|
} else {
|
||||||
|
secondSerial.print(F("D")); // Add "D" prefix for triple-digit fan speed
|
||||||
|
}
|
||||||
|
|
||||||
|
secondSerial.print(speedToSend); // Send fan speed
|
||||||
|
}
|
||||||
35
esptest/esptest.ino
Normal file
35
esptest/esptest.ino
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
const int potPin = 10; // Analog pin for potentiometer input
|
||||||
|
const int pwmPin = 39; // PWM pin for output
|
||||||
|
const int ledPin = 15; // Built-in LED pin
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// Initialize serial communication for debugging
|
||||||
|
Serial.begin(9600);
|
||||||
|
|
||||||
|
// Set PWM pin and LED pin as outputs
|
||||||
|
pinMode(pwmPin, OUTPUT);
|
||||||
|
pinMode(ledPin, OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// Read the value from the potentiometer
|
||||||
|
int potValue = analogRead(potPin);
|
||||||
|
|
||||||
|
// Map the potentiometer value (0-1023) to PWM range (0-255)
|
||||||
|
int dutyCycle = map(potValue, 0, 1023, 0, 255);
|
||||||
|
|
||||||
|
// Output the duty cycle
|
||||||
|
analogWrite(pwmPin, dutyCycle);
|
||||||
|
|
||||||
|
// Print potentiometer value and corresponding duty cycle
|
||||||
|
Serial.print("Potentiometer Value: ");
|
||||||
|
Serial.print(potValue);
|
||||||
|
Serial.print(" Duty Cycle: ");
|
||||||
|
Serial.println(dutyCycle);
|
||||||
|
|
||||||
|
// Blink the built-in LED
|
||||||
|
digitalWrite(ledPin, HIGH);
|
||||||
|
delay(500);
|
||||||
|
digitalWrite(ledPin, LOW);
|
||||||
|
delay(500);
|
||||||
|
}
|
||||||
365
libraries/Adafruit_BusIO/Adafruit_BusIO_Register.cpp
Normal file
365
libraries/Adafruit_BusIO/Adafruit_BusIO_Register.cpp
Normal file
@@ -0,0 +1,365 @@
|
|||||||
|
#include <Adafruit_BusIO_Register.h>
|
||||||
|
|
||||||
|
#if !defined(SPI_INTERFACES_COUNT) || \
|
||||||
|
(defined(SPI_INTERFACES_COUNT) && (SPI_INTERFACES_COUNT > 0))
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Create a register we access over an I2C Device (which defines the
|
||||||
|
* bus and address)
|
||||||
|
* @param i2cdevice The I2CDevice to use for underlying I2C access
|
||||||
|
* @param reg_addr The address pointer value for the I2C/SMBus register, can
|
||||||
|
* be 8 or 16 bits
|
||||||
|
* @param width The width of the register data itself, defaults to 1 byte
|
||||||
|
* @param byteorder The byte order of the register (used when width is > 1),
|
||||||
|
* defaults to LSBFIRST
|
||||||
|
* @param address_width The width of the register address itself, defaults
|
||||||
|
* to 1 byte
|
||||||
|
*/
|
||||||
|
Adafruit_BusIO_Register::Adafruit_BusIO_Register(Adafruit_I2CDevice *i2cdevice,
|
||||||
|
uint16_t reg_addr,
|
||||||
|
uint8_t width,
|
||||||
|
uint8_t byteorder,
|
||||||
|
uint8_t address_width) {
|
||||||
|
_i2cdevice = i2cdevice;
|
||||||
|
_spidevice = nullptr;
|
||||||
|
_addrwidth = address_width;
|
||||||
|
_address = reg_addr;
|
||||||
|
_byteorder = byteorder;
|
||||||
|
_width = width;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Create a register we access over an SPI Device (which defines the
|
||||||
|
* bus and CS pin)
|
||||||
|
* @param spidevice The SPIDevice to use for underlying SPI access
|
||||||
|
* @param reg_addr The address pointer value for the SPI register, can
|
||||||
|
* be 8 or 16 bits
|
||||||
|
* @param type The method we use to read/write data to SPI (which is not
|
||||||
|
* as well defined as I2C)
|
||||||
|
* @param width The width of the register data itself, defaults to 1 byte
|
||||||
|
* @param byteorder The byte order of the register (used when width is > 1),
|
||||||
|
* defaults to LSBFIRST
|
||||||
|
* @param address_width The width of the register address itself, defaults
|
||||||
|
* to 1 byte
|
||||||
|
*/
|
||||||
|
Adafruit_BusIO_Register::Adafruit_BusIO_Register(Adafruit_SPIDevice *spidevice,
|
||||||
|
uint16_t reg_addr,
|
||||||
|
Adafruit_BusIO_SPIRegType type,
|
||||||
|
uint8_t width,
|
||||||
|
uint8_t byteorder,
|
||||||
|
uint8_t address_width) {
|
||||||
|
_spidevice = spidevice;
|
||||||
|
_spiregtype = type;
|
||||||
|
_i2cdevice = nullptr;
|
||||||
|
_addrwidth = address_width;
|
||||||
|
_address = reg_addr;
|
||||||
|
_byteorder = byteorder;
|
||||||
|
_width = width;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Create a register we access over an I2C or SPI Device. This is a
|
||||||
|
* handy function because we can pass in nullptr for the unused interface,
|
||||||
|
* allowing libraries to mass-define all the registers
|
||||||
|
* @param i2cdevice The I2CDevice to use for underlying I2C access, if
|
||||||
|
* nullptr we use SPI
|
||||||
|
* @param spidevice The SPIDevice to use for underlying SPI access, if
|
||||||
|
* nullptr we use I2C
|
||||||
|
* @param reg_addr The address pointer value for the I2C/SMBus/SPI register,
|
||||||
|
* can be 8 or 16 bits
|
||||||
|
* @param type The method we use to read/write data to SPI (which is not
|
||||||
|
* as well defined as I2C)
|
||||||
|
* @param width The width of the register data itself, defaults to 1 byte
|
||||||
|
* @param byteorder The byte order of the register (used when width is > 1),
|
||||||
|
* defaults to LSBFIRST
|
||||||
|
* @param address_width The width of the register address itself, defaults
|
||||||
|
* to 1 byte
|
||||||
|
*/
|
||||||
|
Adafruit_BusIO_Register::Adafruit_BusIO_Register(
|
||||||
|
Adafruit_I2CDevice *i2cdevice, Adafruit_SPIDevice *spidevice,
|
||||||
|
Adafruit_BusIO_SPIRegType type, uint16_t reg_addr, uint8_t width,
|
||||||
|
uint8_t byteorder, uint8_t address_width) {
|
||||||
|
_spidevice = spidevice;
|
||||||
|
_i2cdevice = i2cdevice;
|
||||||
|
_spiregtype = type;
|
||||||
|
_addrwidth = address_width;
|
||||||
|
_address = reg_addr;
|
||||||
|
_byteorder = byteorder;
|
||||||
|
_width = width;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Write a buffer of data to the register location
|
||||||
|
* @param buffer Pointer to data to write
|
||||||
|
* @param len Number of bytes to write
|
||||||
|
* @return True on successful write (only really useful for I2C as SPI is
|
||||||
|
* uncheckable)
|
||||||
|
*/
|
||||||
|
bool Adafruit_BusIO_Register::write(uint8_t *buffer, uint8_t len) {
|
||||||
|
|
||||||
|
uint8_t addrbuffer[2] = {(uint8_t)(_address & 0xFF),
|
||||||
|
(uint8_t)(_address >> 8)};
|
||||||
|
|
||||||
|
if (_i2cdevice) {
|
||||||
|
return _i2cdevice->write(buffer, len, true, addrbuffer, _addrwidth);
|
||||||
|
}
|
||||||
|
if (_spidevice) {
|
||||||
|
if (_spiregtype == ADDRESSED_OPCODE_BIT0_LOW_TO_WRITE) {
|
||||||
|
// very special case!
|
||||||
|
|
||||||
|
// pass the special opcode address which we set as the high byte of the
|
||||||
|
// regaddr
|
||||||
|
addrbuffer[0] =
|
||||||
|
(uint8_t)(_address >> 8) & ~0x01; // set bottom bit low to write
|
||||||
|
// the 'actual' reg addr is the second byte then
|
||||||
|
addrbuffer[1] = (uint8_t)(_address & 0xFF);
|
||||||
|
// the address appears to be a byte longer
|
||||||
|
return _spidevice->write(buffer, len, addrbuffer, _addrwidth + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_spiregtype == ADDRBIT8_HIGH_TOREAD) {
|
||||||
|
addrbuffer[0] &= ~0x80;
|
||||||
|
}
|
||||||
|
if (_spiregtype == ADDRBIT8_HIGH_TOWRITE) {
|
||||||
|
addrbuffer[0] |= 0x80;
|
||||||
|
}
|
||||||
|
if (_spiregtype == AD8_HIGH_TOREAD_AD7_HIGH_TOINC) {
|
||||||
|
addrbuffer[0] &= ~0x80;
|
||||||
|
addrbuffer[0] |= 0x40;
|
||||||
|
}
|
||||||
|
return _spidevice->write(buffer, len, addrbuffer, _addrwidth);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Write up to 4 bytes of data to the register location
|
||||||
|
* @param value Data to write
|
||||||
|
* @param numbytes How many bytes from 'value' to write
|
||||||
|
* @return True on successful write (only really useful for I2C as SPI is
|
||||||
|
* uncheckable)
|
||||||
|
*/
|
||||||
|
bool Adafruit_BusIO_Register::write(uint32_t value, uint8_t numbytes) {
|
||||||
|
if (numbytes == 0) {
|
||||||
|
numbytes = _width;
|
||||||
|
}
|
||||||
|
if (numbytes > 4) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// store a copy
|
||||||
|
_cached = value;
|
||||||
|
|
||||||
|
for (int i = 0; i < numbytes; i++) {
|
||||||
|
if (_byteorder == LSBFIRST) {
|
||||||
|
_buffer[i] = value & 0xFF;
|
||||||
|
} else {
|
||||||
|
_buffer[numbytes - i - 1] = value & 0xFF;
|
||||||
|
}
|
||||||
|
value >>= 8;
|
||||||
|
}
|
||||||
|
return write(_buffer, numbytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Read data from the register location. This does not do any error
|
||||||
|
* checking!
|
||||||
|
* @return Returns 0xFFFFFFFF on failure, value otherwise
|
||||||
|
*/
|
||||||
|
uint32_t Adafruit_BusIO_Register::read(void) {
|
||||||
|
if (!read(_buffer, _width)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t value = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < _width; i++) {
|
||||||
|
value <<= 8;
|
||||||
|
if (_byteorder == LSBFIRST) {
|
||||||
|
value |= _buffer[_width - i - 1];
|
||||||
|
} else {
|
||||||
|
value |= _buffer[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Read cached data from last time we wrote to this register
|
||||||
|
* @return Returns 0xFFFFFFFF on failure, value otherwise
|
||||||
|
*/
|
||||||
|
uint32_t Adafruit_BusIO_Register::readCached(void) { return _cached; }
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Read a buffer of data from the register location
|
||||||
|
* @param buffer Pointer to data to read into
|
||||||
|
* @param len Number of bytes to read
|
||||||
|
* @return True on successful write (only really useful for I2C as SPI is
|
||||||
|
* uncheckable)
|
||||||
|
*/
|
||||||
|
bool Adafruit_BusIO_Register::read(uint8_t *buffer, uint8_t len) {
|
||||||
|
uint8_t addrbuffer[2] = {(uint8_t)(_address & 0xFF),
|
||||||
|
(uint8_t)(_address >> 8)};
|
||||||
|
|
||||||
|
if (_i2cdevice) {
|
||||||
|
return _i2cdevice->write_then_read(addrbuffer, _addrwidth, buffer, len);
|
||||||
|
}
|
||||||
|
if (_spidevice) {
|
||||||
|
if (_spiregtype == ADDRESSED_OPCODE_BIT0_LOW_TO_WRITE) {
|
||||||
|
// very special case!
|
||||||
|
|
||||||
|
// pass the special opcode address which we set as the high byte of the
|
||||||
|
// regaddr
|
||||||
|
addrbuffer[0] =
|
||||||
|
(uint8_t)(_address >> 8) | 0x01; // set bottom bit high to read
|
||||||
|
// the 'actual' reg addr is the second byte then
|
||||||
|
addrbuffer[1] = (uint8_t)(_address & 0xFF);
|
||||||
|
// the address appears to be a byte longer
|
||||||
|
return _spidevice->write_then_read(addrbuffer, _addrwidth + 1, buffer,
|
||||||
|
len);
|
||||||
|
}
|
||||||
|
if (_spiregtype == ADDRBIT8_HIGH_TOREAD) {
|
||||||
|
addrbuffer[0] |= 0x80;
|
||||||
|
}
|
||||||
|
if (_spiregtype == ADDRBIT8_HIGH_TOWRITE) {
|
||||||
|
addrbuffer[0] &= ~0x80;
|
||||||
|
}
|
||||||
|
if (_spiregtype == AD8_HIGH_TOREAD_AD7_HIGH_TOINC) {
|
||||||
|
addrbuffer[0] |= 0x80 | 0x40;
|
||||||
|
}
|
||||||
|
return _spidevice->write_then_read(addrbuffer, _addrwidth, buffer, len);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Read 2 bytes of data from the register location
|
||||||
|
* @param value Pointer to uint16_t variable to read into
|
||||||
|
* @return True on successful write (only really useful for I2C as SPI is
|
||||||
|
* uncheckable)
|
||||||
|
*/
|
||||||
|
bool Adafruit_BusIO_Register::read(uint16_t *value) {
|
||||||
|
if (!read(_buffer, 2)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_byteorder == LSBFIRST) {
|
||||||
|
*value = _buffer[1];
|
||||||
|
*value <<= 8;
|
||||||
|
*value |= _buffer[0];
|
||||||
|
} else {
|
||||||
|
*value = _buffer[0];
|
||||||
|
*value <<= 8;
|
||||||
|
*value |= _buffer[1];
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Read 1 byte of data from the register location
|
||||||
|
* @param value Pointer to uint8_t variable to read into
|
||||||
|
* @return True on successful write (only really useful for I2C as SPI is
|
||||||
|
* uncheckable)
|
||||||
|
*/
|
||||||
|
bool Adafruit_BusIO_Register::read(uint8_t *value) {
|
||||||
|
if (!read(_buffer, 1)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
*value = _buffer[0];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Pretty printer for this register
|
||||||
|
* @param s The Stream to print to, defaults to &Serial
|
||||||
|
*/
|
||||||
|
void Adafruit_BusIO_Register::print(Stream *s) {
|
||||||
|
uint32_t val = read();
|
||||||
|
s->print("0x");
|
||||||
|
s->print(val, HEX);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Pretty printer for this register
|
||||||
|
* @param s The Stream to print to, defaults to &Serial
|
||||||
|
*/
|
||||||
|
void Adafruit_BusIO_Register::println(Stream *s) {
|
||||||
|
print(s);
|
||||||
|
s->println();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Create a slice of the register that we can address without
|
||||||
|
* touching other bits
|
||||||
|
* @param reg The Adafruit_BusIO_Register which defines the bus/register
|
||||||
|
* @param bits The number of bits wide we are slicing
|
||||||
|
* @param shift The number of bits that our bit-slice is shifted from LSB
|
||||||
|
*/
|
||||||
|
Adafruit_BusIO_RegisterBits::Adafruit_BusIO_RegisterBits(
|
||||||
|
Adafruit_BusIO_Register *reg, uint8_t bits, uint8_t shift) {
|
||||||
|
_register = reg;
|
||||||
|
_bits = bits;
|
||||||
|
_shift = shift;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Read 4 bytes of data from the register
|
||||||
|
* @return data The 4 bytes to read
|
||||||
|
*/
|
||||||
|
uint32_t Adafruit_BusIO_RegisterBits::read(void) {
|
||||||
|
uint32_t val = _register->read();
|
||||||
|
val >>= _shift;
|
||||||
|
return val & ((1 << (_bits)) - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Write 4 bytes of data to the register
|
||||||
|
* @param data The 4 bytes to write
|
||||||
|
* @return True on successful write (only really useful for I2C as SPI is
|
||||||
|
* uncheckable)
|
||||||
|
*/
|
||||||
|
bool Adafruit_BusIO_RegisterBits::write(uint32_t data) {
|
||||||
|
uint32_t val = _register->read();
|
||||||
|
|
||||||
|
// mask off the data before writing
|
||||||
|
uint32_t mask = (1 << (_bits)) - 1;
|
||||||
|
data &= mask;
|
||||||
|
|
||||||
|
mask <<= _shift;
|
||||||
|
val &= ~mask; // remove the current data at that spot
|
||||||
|
val |= data << _shift; // and add in the new data
|
||||||
|
|
||||||
|
return _register->write(val, _register->width());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief The width of the register data, helpful for doing calculations
|
||||||
|
* @returns The data width used when initializing the register
|
||||||
|
*/
|
||||||
|
uint8_t Adafruit_BusIO_Register::width(void) { return _width; }
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Set the default width of data
|
||||||
|
* @param width the default width of data read from register
|
||||||
|
*/
|
||||||
|
void Adafruit_BusIO_Register::setWidth(uint8_t width) { _width = width; }
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Set register address
|
||||||
|
* @param address the address from register
|
||||||
|
*/
|
||||||
|
void Adafruit_BusIO_Register::setAddress(uint16_t address) {
|
||||||
|
_address = address;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Set the width of register address
|
||||||
|
* @param address_width the width for register address
|
||||||
|
*/
|
||||||
|
void Adafruit_BusIO_Register::setAddressWidth(uint16_t address_width) {
|
||||||
|
_addrwidth = address_width;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // SPI exists
|
||||||
105
libraries/Adafruit_BusIO/Adafruit_BusIO_Register.h
Normal file
105
libraries/Adafruit_BusIO/Adafruit_BusIO_Register.h
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
#ifndef Adafruit_BusIO_Register_h
|
||||||
|
#define Adafruit_BusIO_Register_h
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
#if !defined(SPI_INTERFACES_COUNT) || \
|
||||||
|
(defined(SPI_INTERFACES_COUNT) && (SPI_INTERFACES_COUNT > 0))
|
||||||
|
|
||||||
|
#include <Adafruit_I2CDevice.h>
|
||||||
|
#include <Adafruit_SPIDevice.h>
|
||||||
|
|
||||||
|
typedef enum _Adafruit_BusIO_SPIRegType {
|
||||||
|
ADDRBIT8_HIGH_TOREAD = 0,
|
||||||
|
/*!<
|
||||||
|
* ADDRBIT8_HIGH_TOREAD
|
||||||
|
* When reading a register you must actually send the value 0x80 + register
|
||||||
|
* address to the device. e.g. To read the register 0x0B the register value
|
||||||
|
* 0x8B is sent and to write 0x0B is sent.
|
||||||
|
*/
|
||||||
|
AD8_HIGH_TOREAD_AD7_HIGH_TOINC = 1,
|
||||||
|
|
||||||
|
/*!<
|
||||||
|
* ADDRBIT8_HIGH_TOWRITE
|
||||||
|
* When writing to a register you must actually send the value 0x80 +
|
||||||
|
* the register address to the device. e.g. To write to the register 0x19 the
|
||||||
|
* register value 0x99 is sent and to read 0x19 is sent.
|
||||||
|
*/
|
||||||
|
ADDRBIT8_HIGH_TOWRITE = 2,
|
||||||
|
|
||||||
|
/*!<
|
||||||
|
* ADDRESSED_OPCODE_LOWBIT_TO_WRITE
|
||||||
|
* Used by the MCP23S series, we send 0x40 |'rd with the opcode
|
||||||
|
* Then set the lowest bit to write
|
||||||
|
*/
|
||||||
|
ADDRESSED_OPCODE_BIT0_LOW_TO_WRITE = 3,
|
||||||
|
|
||||||
|
} Adafruit_BusIO_SPIRegType;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief The class which defines a device register (a location to read/write
|
||||||
|
* data from)
|
||||||
|
*/
|
||||||
|
class Adafruit_BusIO_Register {
|
||||||
|
public:
|
||||||
|
Adafruit_BusIO_Register(Adafruit_I2CDevice *i2cdevice, uint16_t reg_addr,
|
||||||
|
uint8_t width = 1, uint8_t byteorder = LSBFIRST,
|
||||||
|
uint8_t address_width = 1);
|
||||||
|
|
||||||
|
Adafruit_BusIO_Register(Adafruit_SPIDevice *spidevice, uint16_t reg_addr,
|
||||||
|
Adafruit_BusIO_SPIRegType type, uint8_t width = 1,
|
||||||
|
uint8_t byteorder = LSBFIRST,
|
||||||
|
uint8_t address_width = 1);
|
||||||
|
|
||||||
|
Adafruit_BusIO_Register(Adafruit_I2CDevice *i2cdevice,
|
||||||
|
Adafruit_SPIDevice *spidevice,
|
||||||
|
Adafruit_BusIO_SPIRegType type, uint16_t reg_addr,
|
||||||
|
uint8_t width = 1, uint8_t byteorder = LSBFIRST,
|
||||||
|
uint8_t address_width = 1);
|
||||||
|
|
||||||
|
bool read(uint8_t *buffer, uint8_t len);
|
||||||
|
bool read(uint8_t *value);
|
||||||
|
bool read(uint16_t *value);
|
||||||
|
uint32_t read(void);
|
||||||
|
uint32_t readCached(void);
|
||||||
|
bool write(uint8_t *buffer, uint8_t len);
|
||||||
|
bool write(uint32_t value, uint8_t numbytes = 0);
|
||||||
|
|
||||||
|
uint8_t width(void);
|
||||||
|
|
||||||
|
void setWidth(uint8_t width);
|
||||||
|
void setAddress(uint16_t address);
|
||||||
|
void setAddressWidth(uint16_t address_width);
|
||||||
|
|
||||||
|
void print(Stream *s = &Serial);
|
||||||
|
void println(Stream *s = &Serial);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Adafruit_I2CDevice *_i2cdevice;
|
||||||
|
Adafruit_SPIDevice *_spidevice;
|
||||||
|
Adafruit_BusIO_SPIRegType _spiregtype;
|
||||||
|
uint16_t _address;
|
||||||
|
uint8_t _width, _addrwidth, _byteorder;
|
||||||
|
uint8_t _buffer[4]; // we won't support anything larger than uint32 for
|
||||||
|
// non-buffered read
|
||||||
|
uint32_t _cached = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief The class which defines a slice of bits from within a device register
|
||||||
|
* (a location to read/write data from)
|
||||||
|
*/
|
||||||
|
class Adafruit_BusIO_RegisterBits {
|
||||||
|
public:
|
||||||
|
Adafruit_BusIO_RegisterBits(Adafruit_BusIO_Register *reg, uint8_t bits,
|
||||||
|
uint8_t shift);
|
||||||
|
bool write(uint32_t value);
|
||||||
|
uint32_t read(void);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Adafruit_BusIO_Register *_register;
|
||||||
|
uint8_t _bits, _shift;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // SPI exists
|
||||||
|
#endif // BusIO_Register_h
|
||||||
317
libraries/Adafruit_BusIO/Adafruit_I2CDevice.cpp
Normal file
317
libraries/Adafruit_BusIO/Adafruit_I2CDevice.cpp
Normal file
@@ -0,0 +1,317 @@
|
|||||||
|
#include "Adafruit_I2CDevice.h"
|
||||||
|
|
||||||
|
//#define DEBUG_SERIAL Serial
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Create an I2C device at a given address
|
||||||
|
* @param addr The 7-bit I2C address for the device
|
||||||
|
* @param theWire The I2C bus to use, defaults to &Wire
|
||||||
|
*/
|
||||||
|
Adafruit_I2CDevice::Adafruit_I2CDevice(uint8_t addr, TwoWire *theWire) {
|
||||||
|
_addr = addr;
|
||||||
|
_wire = theWire;
|
||||||
|
_begun = false;
|
||||||
|
#ifdef ARDUINO_ARCH_SAMD
|
||||||
|
_maxBufferSize = 250; // as defined in Wire.h's RingBuffer
|
||||||
|
#elif defined(ESP32)
|
||||||
|
_maxBufferSize = I2C_BUFFER_LENGTH;
|
||||||
|
#else
|
||||||
|
_maxBufferSize = 32;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Initializes and does basic address detection
|
||||||
|
* @param addr_detect Whether we should attempt to detect the I2C address
|
||||||
|
* with a scan. 99% of sensors/devices don't mind, but once in a while they
|
||||||
|
* don't respond well to a scan!
|
||||||
|
* @return True if I2C initialized and a device with the addr found
|
||||||
|
*/
|
||||||
|
bool Adafruit_I2CDevice::begin(bool addr_detect) {
|
||||||
|
_wire->begin();
|
||||||
|
_begun = true;
|
||||||
|
|
||||||
|
if (addr_detect) {
|
||||||
|
return detected();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief De-initialize device, turn off the Wire interface
|
||||||
|
*/
|
||||||
|
void Adafruit_I2CDevice::end(void) {
|
||||||
|
// Not all port implement Wire::end(), such as
|
||||||
|
// - ESP8266
|
||||||
|
// - AVR core without WIRE_HAS_END
|
||||||
|
// - ESP32: end() is implemented since 2.0.1 which is latest at the moment.
|
||||||
|
// Temporarily disable for now to give time for user to update.
|
||||||
|
#if !(defined(ESP8266) || \
|
||||||
|
(defined(ARDUINO_ARCH_AVR) && !defined(WIRE_HAS_END)) || \
|
||||||
|
defined(ARDUINO_ARCH_ESP32))
|
||||||
|
_wire->end();
|
||||||
|
_begun = false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Scans I2C for the address - note will give a false-positive
|
||||||
|
* if there's no pullups on I2C
|
||||||
|
* @return True if I2C initialized and a device with the addr found
|
||||||
|
*/
|
||||||
|
bool Adafruit_I2CDevice::detected(void) {
|
||||||
|
// Init I2C if not done yet
|
||||||
|
if (!_begun && !begin()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// A basic scanner, see if it ACK's
|
||||||
|
_wire->beginTransmission(_addr);
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
DEBUG_SERIAL.print(F("Address 0x"));
|
||||||
|
DEBUG_SERIAL.print(_addr);
|
||||||
|
#endif
|
||||||
|
if (_wire->endTransmission() == 0) {
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
DEBUG_SERIAL.println(F(" Detected"));
|
||||||
|
#endif
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
DEBUG_SERIAL.println(F(" Not detected"));
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Write a buffer or two to the I2C device. Cannot be more than
|
||||||
|
* maxBufferSize() bytes.
|
||||||
|
* @param buffer Pointer to buffer of data to write. This is const to
|
||||||
|
* ensure the content of this buffer doesn't change.
|
||||||
|
* @param len Number of bytes from buffer to write
|
||||||
|
* @param prefix_buffer Pointer to optional array of data to write before
|
||||||
|
* buffer. Cannot be more than maxBufferSize() bytes. This is const to
|
||||||
|
* ensure the content of this buffer doesn't change.
|
||||||
|
* @param prefix_len Number of bytes from prefix buffer to write
|
||||||
|
* @param stop Whether to send an I2C STOP signal on write
|
||||||
|
* @return True if write was successful, otherwise false.
|
||||||
|
*/
|
||||||
|
bool Adafruit_I2CDevice::write(const uint8_t *buffer, size_t len, bool stop,
|
||||||
|
const uint8_t *prefix_buffer,
|
||||||
|
size_t prefix_len) {
|
||||||
|
if ((len + prefix_len) > maxBufferSize()) {
|
||||||
|
// currently not guaranteed to work if more than 32 bytes!
|
||||||
|
// we will need to find out if some platforms have larger
|
||||||
|
// I2C buffer sizes :/
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
DEBUG_SERIAL.println(F("\tI2CDevice could not write such a large buffer"));
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
_wire->beginTransmission(_addr);
|
||||||
|
|
||||||
|
// Write the prefix data (usually an address)
|
||||||
|
if ((prefix_len != 0) && (prefix_buffer != nullptr)) {
|
||||||
|
if (_wire->write(prefix_buffer, prefix_len) != prefix_len) {
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
DEBUG_SERIAL.println(F("\tI2CDevice failed to write"));
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write the data itself
|
||||||
|
if (_wire->write(buffer, len) != len) {
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
DEBUG_SERIAL.println(F("\tI2CDevice failed to write"));
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
|
||||||
|
DEBUG_SERIAL.print(F("\tI2CWRITE @ 0x"));
|
||||||
|
DEBUG_SERIAL.print(_addr, HEX);
|
||||||
|
DEBUG_SERIAL.print(F(" :: "));
|
||||||
|
if ((prefix_len != 0) && (prefix_buffer != nullptr)) {
|
||||||
|
for (uint16_t i = 0; i < prefix_len; i++) {
|
||||||
|
DEBUG_SERIAL.print(F("0x"));
|
||||||
|
DEBUG_SERIAL.print(prefix_buffer[i], HEX);
|
||||||
|
DEBUG_SERIAL.print(F(", "));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (uint16_t i = 0; i < len; i++) {
|
||||||
|
DEBUG_SERIAL.print(F("0x"));
|
||||||
|
DEBUG_SERIAL.print(buffer[i], HEX);
|
||||||
|
DEBUG_SERIAL.print(F(", "));
|
||||||
|
if (i % 32 == 31) {
|
||||||
|
DEBUG_SERIAL.println();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stop) {
|
||||||
|
DEBUG_SERIAL.print("\tSTOP");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (_wire->endTransmission(stop) == 0) {
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
DEBUG_SERIAL.println();
|
||||||
|
// DEBUG_SERIAL.println("Sent!");
|
||||||
|
#endif
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
DEBUG_SERIAL.println("\tFailed to send!");
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Read from I2C into a buffer from the I2C device.
|
||||||
|
* Cannot be more than maxBufferSize() bytes.
|
||||||
|
* @param buffer Pointer to buffer of data to read into
|
||||||
|
* @param len Number of bytes from buffer to read.
|
||||||
|
* @param stop Whether to send an I2C STOP signal on read
|
||||||
|
* @return True if read was successful, otherwise false.
|
||||||
|
*/
|
||||||
|
bool Adafruit_I2CDevice::read(uint8_t *buffer, size_t len, bool stop) {
|
||||||
|
size_t pos = 0;
|
||||||
|
while (pos < len) {
|
||||||
|
size_t read_len =
|
||||||
|
((len - pos) > maxBufferSize()) ? maxBufferSize() : (len - pos);
|
||||||
|
bool read_stop = (pos < (len - read_len)) ? false : stop;
|
||||||
|
if (!_read(buffer + pos, read_len, read_stop))
|
||||||
|
return false;
|
||||||
|
pos += read_len;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Adafruit_I2CDevice::_read(uint8_t *buffer, size_t len, bool stop) {
|
||||||
|
#if defined(TinyWireM_h)
|
||||||
|
size_t recv = _wire->requestFrom((uint8_t)_addr, (uint8_t)len);
|
||||||
|
#elif defined(ARDUINO_ARCH_MEGAAVR)
|
||||||
|
size_t recv = _wire->requestFrom(_addr, len, stop);
|
||||||
|
#else
|
||||||
|
size_t recv = _wire->requestFrom((uint8_t)_addr, (uint8_t)len, (uint8_t)stop);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (recv != len) {
|
||||||
|
// Not enough data available to fulfill our obligation!
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
DEBUG_SERIAL.print(F("\tI2CDevice did not receive enough data: "));
|
||||||
|
DEBUG_SERIAL.println(recv);
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint16_t i = 0; i < len; i++) {
|
||||||
|
buffer[i] = _wire->read();
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
DEBUG_SERIAL.print(F("\tI2CREAD @ 0x"));
|
||||||
|
DEBUG_SERIAL.print(_addr, HEX);
|
||||||
|
DEBUG_SERIAL.print(F(" :: "));
|
||||||
|
for (uint16_t i = 0; i < len; i++) {
|
||||||
|
DEBUG_SERIAL.print(F("0x"));
|
||||||
|
DEBUG_SERIAL.print(buffer[i], HEX);
|
||||||
|
DEBUG_SERIAL.print(F(", "));
|
||||||
|
if (len % 32 == 31) {
|
||||||
|
DEBUG_SERIAL.println();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DEBUG_SERIAL.println();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Write some data, then read some data from I2C into another buffer.
|
||||||
|
* Cannot be more than maxBufferSize() bytes. The buffers can point to
|
||||||
|
* same/overlapping locations.
|
||||||
|
* @param write_buffer Pointer to buffer of data to write from
|
||||||
|
* @param write_len Number of bytes from buffer to write.
|
||||||
|
* @param read_buffer Pointer to buffer of data to read into.
|
||||||
|
* @param read_len Number of bytes from buffer to read.
|
||||||
|
* @param stop Whether to send an I2C STOP signal between the write and read
|
||||||
|
* @return True if write & read was successful, otherwise false.
|
||||||
|
*/
|
||||||
|
bool Adafruit_I2CDevice::write_then_read(const uint8_t *write_buffer,
|
||||||
|
size_t write_len, uint8_t *read_buffer,
|
||||||
|
size_t read_len, bool stop) {
|
||||||
|
if (!write(write_buffer, write_len, stop)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return read(read_buffer, read_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Returns the 7-bit address of this device
|
||||||
|
* @return The 7-bit address of this device
|
||||||
|
*/
|
||||||
|
uint8_t Adafruit_I2CDevice::address(void) { return _addr; }
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Change the I2C clock speed to desired (relies on
|
||||||
|
* underlying Wire support!
|
||||||
|
* @param desiredclk The desired I2C SCL frequency
|
||||||
|
* @return True if this platform supports changing I2C speed.
|
||||||
|
* Not necessarily that the speed was achieved!
|
||||||
|
*/
|
||||||
|
bool Adafruit_I2CDevice::setSpeed(uint32_t desiredclk) {
|
||||||
|
#if defined(__AVR_ATmega328__) || \
|
||||||
|
defined(__AVR_ATmega328P__) // fix arduino core set clock
|
||||||
|
// calculate TWBR correctly
|
||||||
|
|
||||||
|
if ((F_CPU / 18) < desiredclk) {
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
Serial.println(F("I2C.setSpeed too high."));
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
uint32_t atwbr = ((F_CPU / desiredclk) - 16) / 2;
|
||||||
|
if (atwbr > 16320) {
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
Serial.println(F("I2C.setSpeed too low."));
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (atwbr <= 255) {
|
||||||
|
atwbr /= 1;
|
||||||
|
TWSR = 0x0;
|
||||||
|
} else if (atwbr <= 1020) {
|
||||||
|
atwbr /= 4;
|
||||||
|
TWSR = 0x1;
|
||||||
|
} else if (atwbr <= 4080) {
|
||||||
|
atwbr /= 16;
|
||||||
|
TWSR = 0x2;
|
||||||
|
} else { // if (atwbr <= 16320)
|
||||||
|
atwbr /= 64;
|
||||||
|
TWSR = 0x3;
|
||||||
|
}
|
||||||
|
TWBR = atwbr;
|
||||||
|
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
Serial.print(F("TWSR prescaler = "));
|
||||||
|
Serial.println(pow(4, TWSR));
|
||||||
|
Serial.print(F("TWBR = "));
|
||||||
|
Serial.println(atwbr);
|
||||||
|
#endif
|
||||||
|
return true;
|
||||||
|
#elif (ARDUINO >= 157) && !defined(ARDUINO_STM32_FEATHER) && \
|
||||||
|
!defined(TinyWireM_h)
|
||||||
|
_wire->setClock(desiredclk);
|
||||||
|
return true;
|
||||||
|
|
||||||
|
#else
|
||||||
|
(void)desiredclk;
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
36
libraries/Adafruit_BusIO/Adafruit_I2CDevice.h
Normal file
36
libraries/Adafruit_BusIO/Adafruit_I2CDevice.h
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
#ifndef Adafruit_I2CDevice_h
|
||||||
|
#define Adafruit_I2CDevice_h
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
|
||||||
|
///< The class which defines how we will talk to this device over I2C
|
||||||
|
class Adafruit_I2CDevice {
|
||||||
|
public:
|
||||||
|
Adafruit_I2CDevice(uint8_t addr, TwoWire *theWire = &Wire);
|
||||||
|
uint8_t address(void);
|
||||||
|
bool begin(bool addr_detect = true);
|
||||||
|
void end(void);
|
||||||
|
bool detected(void);
|
||||||
|
|
||||||
|
bool read(uint8_t *buffer, size_t len, bool stop = true);
|
||||||
|
bool write(const uint8_t *buffer, size_t len, bool stop = true,
|
||||||
|
const uint8_t *prefix_buffer = nullptr, size_t prefix_len = 0);
|
||||||
|
bool write_then_read(const uint8_t *write_buffer, size_t write_len,
|
||||||
|
uint8_t *read_buffer, size_t read_len,
|
||||||
|
bool stop = false);
|
||||||
|
bool setSpeed(uint32_t desiredclk);
|
||||||
|
|
||||||
|
/*! @brief How many bytes we can read in a transaction
|
||||||
|
* @return The size of the Wire receive/transmit buffer */
|
||||||
|
size_t maxBufferSize() { return _maxBufferSize; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
uint8_t _addr;
|
||||||
|
TwoWire *_wire;
|
||||||
|
bool _begun;
|
||||||
|
size_t _maxBufferSize;
|
||||||
|
bool _read(uint8_t *buffer, size_t len, bool stop);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // Adafruit_I2CDevice_h
|
||||||
10
libraries/Adafruit_BusIO/Adafruit_I2CRegister.h
Normal file
10
libraries/Adafruit_BusIO/Adafruit_I2CRegister.h
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
#ifndef _ADAFRUIT_I2C_REGISTER_H_
|
||||||
|
#define _ADAFRUIT_I2C_REGISTER_H_
|
||||||
|
|
||||||
|
#include <Adafruit_BusIO_Register.h>
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
typedef Adafruit_BusIO_Register Adafruit_I2CRegister;
|
||||||
|
typedef Adafruit_BusIO_RegisterBits Adafruit_I2CRegisterBits;
|
||||||
|
|
||||||
|
#endif
|
||||||
508
libraries/Adafruit_BusIO/Adafruit_SPIDevice.cpp
Normal file
508
libraries/Adafruit_BusIO/Adafruit_SPIDevice.cpp
Normal file
@@ -0,0 +1,508 @@
|
|||||||
|
#include "Adafruit_SPIDevice.h"
|
||||||
|
|
||||||
|
//#define DEBUG_SERIAL Serial
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Create an SPI device with the given CS pin and settings
|
||||||
|
* @param cspin The arduino pin number to use for chip select
|
||||||
|
* @param freq The SPI clock frequency to use, defaults to 1MHz
|
||||||
|
* @param dataOrder The SPI data order to use for bits within each byte,
|
||||||
|
* defaults to SPI_BITORDER_MSBFIRST
|
||||||
|
* @param dataMode The SPI mode to use, defaults to SPI_MODE0
|
||||||
|
* @param theSPI The SPI bus to use, defaults to &theSPI
|
||||||
|
*/
|
||||||
|
Adafruit_SPIDevice::Adafruit_SPIDevice(int8_t cspin, uint32_t freq,
|
||||||
|
BusIOBitOrder dataOrder,
|
||||||
|
uint8_t dataMode, SPIClass *theSPI) {
|
||||||
|
#ifdef BUSIO_HAS_HW_SPI
|
||||||
|
_cs = cspin;
|
||||||
|
_sck = _mosi = _miso = -1;
|
||||||
|
_spi = theSPI;
|
||||||
|
_begun = false;
|
||||||
|
_spiSetting = new SPISettings(freq, dataOrder, dataMode);
|
||||||
|
_freq = freq;
|
||||||
|
_dataOrder = dataOrder;
|
||||||
|
_dataMode = dataMode;
|
||||||
|
#else
|
||||||
|
// unused, but needed to suppress compiler warns
|
||||||
|
(void)cspin;
|
||||||
|
(void)freq;
|
||||||
|
(void)dataOrder;
|
||||||
|
(void)dataMode;
|
||||||
|
(void)theSPI;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Create an SPI device with the given CS pin and settings
|
||||||
|
* @param cspin The arduino pin number to use for chip select
|
||||||
|
* @param sckpin The arduino pin number to use for SCK
|
||||||
|
* @param misopin The arduino pin number to use for MISO, set to -1 if not
|
||||||
|
* used
|
||||||
|
* @param mosipin The arduino pin number to use for MOSI, set to -1 if not
|
||||||
|
* used
|
||||||
|
* @param freq The SPI clock frequency to use, defaults to 1MHz
|
||||||
|
* @param dataOrder The SPI data order to use for bits within each byte,
|
||||||
|
* defaults to SPI_BITORDER_MSBFIRST
|
||||||
|
* @param dataMode The SPI mode to use, defaults to SPI_MODE0
|
||||||
|
*/
|
||||||
|
Adafruit_SPIDevice::Adafruit_SPIDevice(int8_t cspin, int8_t sckpin,
|
||||||
|
int8_t misopin, int8_t mosipin,
|
||||||
|
uint32_t freq, BusIOBitOrder dataOrder,
|
||||||
|
uint8_t dataMode) {
|
||||||
|
_cs = cspin;
|
||||||
|
_sck = sckpin;
|
||||||
|
_miso = misopin;
|
||||||
|
_mosi = mosipin;
|
||||||
|
|
||||||
|
#ifdef BUSIO_USE_FAST_PINIO
|
||||||
|
csPort = (BusIO_PortReg *)portOutputRegister(digitalPinToPort(cspin));
|
||||||
|
csPinMask = digitalPinToBitMask(cspin);
|
||||||
|
if (mosipin != -1) {
|
||||||
|
mosiPort = (BusIO_PortReg *)portOutputRegister(digitalPinToPort(mosipin));
|
||||||
|
mosiPinMask = digitalPinToBitMask(mosipin);
|
||||||
|
}
|
||||||
|
if (misopin != -1) {
|
||||||
|
misoPort = (BusIO_PortReg *)portInputRegister(digitalPinToPort(misopin));
|
||||||
|
misoPinMask = digitalPinToBitMask(misopin);
|
||||||
|
}
|
||||||
|
clkPort = (BusIO_PortReg *)portOutputRegister(digitalPinToPort(sckpin));
|
||||||
|
clkPinMask = digitalPinToBitMask(sckpin);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_freq = freq;
|
||||||
|
_dataOrder = dataOrder;
|
||||||
|
_dataMode = dataMode;
|
||||||
|
_begun = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Release memory allocated in constructors
|
||||||
|
*/
|
||||||
|
Adafruit_SPIDevice::~Adafruit_SPIDevice() {
|
||||||
|
if (_spiSetting)
|
||||||
|
delete _spiSetting;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Initializes SPI bus and sets CS pin high
|
||||||
|
* @return Always returns true because there's no way to test success of SPI
|
||||||
|
* init
|
||||||
|
*/
|
||||||
|
bool Adafruit_SPIDevice::begin(void) {
|
||||||
|
if (_cs != -1) {
|
||||||
|
pinMode(_cs, OUTPUT);
|
||||||
|
digitalWrite(_cs, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_spi) { // hardware SPI
|
||||||
|
#ifdef BUSIO_HAS_HW_SPI
|
||||||
|
_spi->begin();
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
pinMode(_sck, OUTPUT);
|
||||||
|
|
||||||
|
if ((_dataMode == SPI_MODE0) || (_dataMode == SPI_MODE1)) {
|
||||||
|
// idle low on mode 0 and 1
|
||||||
|
digitalWrite(_sck, LOW);
|
||||||
|
} else {
|
||||||
|
// idle high on mode 2 or 3
|
||||||
|
digitalWrite(_sck, HIGH);
|
||||||
|
}
|
||||||
|
if (_mosi != -1) {
|
||||||
|
pinMode(_mosi, OUTPUT);
|
||||||
|
digitalWrite(_mosi, HIGH);
|
||||||
|
}
|
||||||
|
if (_miso != -1) {
|
||||||
|
pinMode(_miso, INPUT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_begun = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Transfer (send/receive) a buffer over hard/soft SPI, without
|
||||||
|
* transaction management
|
||||||
|
* @param buffer The buffer to send and receive at the same time
|
||||||
|
* @param len The number of bytes to transfer
|
||||||
|
*/
|
||||||
|
void Adafruit_SPIDevice::transfer(uint8_t *buffer, size_t len) {
|
||||||
|
//
|
||||||
|
// HARDWARE SPI
|
||||||
|
//
|
||||||
|
if (_spi) {
|
||||||
|
#ifdef BUSIO_HAS_HW_SPI
|
||||||
|
#if defined(SPARK)
|
||||||
|
_spi->transfer(buffer, buffer, len, nullptr);
|
||||||
|
#elif defined(STM32)
|
||||||
|
for (size_t i = 0; i < len; i++) {
|
||||||
|
_spi->transfer(buffer[i]);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
_spi->transfer(buffer, len);
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// SOFTWARE SPI
|
||||||
|
//
|
||||||
|
uint8_t startbit;
|
||||||
|
if (_dataOrder == SPI_BITORDER_LSBFIRST) {
|
||||||
|
startbit = 0x1;
|
||||||
|
} else {
|
||||||
|
startbit = 0x80;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool towrite, lastmosi = !(buffer[0] & startbit);
|
||||||
|
uint8_t bitdelay_us = (1000000 / _freq) / 2;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < len; i++) {
|
||||||
|
uint8_t reply = 0;
|
||||||
|
uint8_t send = buffer[i];
|
||||||
|
|
||||||
|
/*
|
||||||
|
Serial.print("\tSending software SPI byte 0x");
|
||||||
|
Serial.print(send, HEX);
|
||||||
|
Serial.print(" -> 0x");
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Serial.print(send, HEX);
|
||||||
|
for (uint8_t b = startbit; b != 0;
|
||||||
|
b = (_dataOrder == SPI_BITORDER_LSBFIRST) ? b << 1 : b >> 1) {
|
||||||
|
|
||||||
|
if (bitdelay_us) {
|
||||||
|
delayMicroseconds(bitdelay_us);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_dataMode == SPI_MODE0 || _dataMode == SPI_MODE2) {
|
||||||
|
towrite = send & b;
|
||||||
|
if ((_mosi != -1) && (lastmosi != towrite)) {
|
||||||
|
#ifdef BUSIO_USE_FAST_PINIO
|
||||||
|
if (towrite)
|
||||||
|
*mosiPort = *mosiPort | mosiPinMask;
|
||||||
|
else
|
||||||
|
*mosiPort = *mosiPort & ~mosiPinMask;
|
||||||
|
#else
|
||||||
|
digitalWrite(_mosi, towrite);
|
||||||
|
#endif
|
||||||
|
lastmosi = towrite;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef BUSIO_USE_FAST_PINIO
|
||||||
|
*clkPort = *clkPort | clkPinMask; // Clock high
|
||||||
|
#else
|
||||||
|
digitalWrite(_sck, HIGH);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (bitdelay_us) {
|
||||||
|
delayMicroseconds(bitdelay_us);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_miso != -1) {
|
||||||
|
#ifdef BUSIO_USE_FAST_PINIO
|
||||||
|
if (*misoPort & misoPinMask) {
|
||||||
|
#else
|
||||||
|
if (digitalRead(_miso)) {
|
||||||
|
#endif
|
||||||
|
reply |= b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef BUSIO_USE_FAST_PINIO
|
||||||
|
*clkPort = *clkPort & ~clkPinMask; // Clock low
|
||||||
|
#else
|
||||||
|
digitalWrite(_sck, LOW);
|
||||||
|
#endif
|
||||||
|
} else { // if (_dataMode == SPI_MODE1 || _dataMode == SPI_MODE3)
|
||||||
|
|
||||||
|
#ifdef BUSIO_USE_FAST_PINIO
|
||||||
|
*clkPort = *clkPort | clkPinMask; // Clock high
|
||||||
|
#else
|
||||||
|
digitalWrite(_sck, HIGH);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (bitdelay_us) {
|
||||||
|
delayMicroseconds(bitdelay_us);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_mosi != -1) {
|
||||||
|
#ifdef BUSIO_USE_FAST_PINIO
|
||||||
|
if (send & b)
|
||||||
|
*mosiPort = *mosiPort | mosiPinMask;
|
||||||
|
else
|
||||||
|
*mosiPort = *mosiPort & ~mosiPinMask;
|
||||||
|
#else
|
||||||
|
digitalWrite(_mosi, send & b);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef BUSIO_USE_FAST_PINIO
|
||||||
|
*clkPort = *clkPort & ~clkPinMask; // Clock low
|
||||||
|
#else
|
||||||
|
digitalWrite(_sck, LOW);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (_miso != -1) {
|
||||||
|
#ifdef BUSIO_USE_FAST_PINIO
|
||||||
|
if (*misoPort & misoPinMask) {
|
||||||
|
#else
|
||||||
|
if (digitalRead(_miso)) {
|
||||||
|
#endif
|
||||||
|
reply |= b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_miso != -1) {
|
||||||
|
buffer[i] = reply;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Transfer (send/receive) one byte over hard/soft SPI, without
|
||||||
|
* transaction management
|
||||||
|
* @param send The byte to send
|
||||||
|
* @return The byte received while transmitting
|
||||||
|
*/
|
||||||
|
uint8_t Adafruit_SPIDevice::transfer(uint8_t send) {
|
||||||
|
uint8_t data = send;
|
||||||
|
transfer(&data, 1);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Manually begin a transaction (calls beginTransaction if hardware
|
||||||
|
* SPI)
|
||||||
|
*/
|
||||||
|
void Adafruit_SPIDevice::beginTransaction(void) {
|
||||||
|
if (_spi) {
|
||||||
|
#ifdef BUSIO_HAS_HW_SPI
|
||||||
|
_spi->beginTransaction(*_spiSetting);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Manually end a transaction (calls endTransaction if hardware SPI)
|
||||||
|
*/
|
||||||
|
void Adafruit_SPIDevice::endTransaction(void) {
|
||||||
|
if (_spi) {
|
||||||
|
#ifdef BUSIO_HAS_HW_SPI
|
||||||
|
_spi->endTransaction();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Assert/Deassert the CS pin if it is defined
|
||||||
|
* @param value The state the CS is set to
|
||||||
|
*/
|
||||||
|
void Adafruit_SPIDevice::setChipSelect(int value) {
|
||||||
|
if (_cs != -1) {
|
||||||
|
digitalWrite(_cs, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Write a buffer or two to the SPI device, with transaction
|
||||||
|
* management.
|
||||||
|
* @brief Manually begin a transaction (calls beginTransaction if hardware
|
||||||
|
* SPI) with asserting the CS pin
|
||||||
|
*/
|
||||||
|
void Adafruit_SPIDevice::beginTransactionWithAssertingCS() {
|
||||||
|
beginTransaction();
|
||||||
|
setChipSelect(LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Manually end a transaction (calls endTransaction if hardware SPI)
|
||||||
|
* with deasserting the CS pin
|
||||||
|
*/
|
||||||
|
void Adafruit_SPIDevice::endTransactionWithDeassertingCS() {
|
||||||
|
setChipSelect(HIGH);
|
||||||
|
endTransaction();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Write a buffer or two to the SPI device, with transaction
|
||||||
|
* management.
|
||||||
|
* @param buffer Pointer to buffer of data to write
|
||||||
|
* @param len Number of bytes from buffer to write
|
||||||
|
* @param prefix_buffer Pointer to optional array of data to write before
|
||||||
|
* buffer.
|
||||||
|
* @param prefix_len Number of bytes from prefix buffer to write
|
||||||
|
* @return Always returns true because there's no way to test success of SPI
|
||||||
|
* writes
|
||||||
|
*/
|
||||||
|
bool Adafruit_SPIDevice::write(const uint8_t *buffer, size_t len,
|
||||||
|
const uint8_t *prefix_buffer,
|
||||||
|
size_t prefix_len) {
|
||||||
|
beginTransactionWithAssertingCS();
|
||||||
|
|
||||||
|
// do the writing
|
||||||
|
#if defined(ARDUINO_ARCH_ESP32)
|
||||||
|
if (_spi) {
|
||||||
|
if (prefix_len > 0) {
|
||||||
|
_spi->transferBytes((uint8_t *)prefix_buffer, nullptr, prefix_len);
|
||||||
|
}
|
||||||
|
if (len > 0) {
|
||||||
|
_spi->transferBytes((uint8_t *)buffer, nullptr, len);
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < prefix_len; i++) {
|
||||||
|
transfer(prefix_buffer[i]);
|
||||||
|
}
|
||||||
|
for (size_t i = 0; i < len; i++) {
|
||||||
|
transfer(buffer[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
endTransactionWithDeassertingCS();
|
||||||
|
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
DEBUG_SERIAL.print(F("\tSPIDevice Wrote: "));
|
||||||
|
if ((prefix_len != 0) && (prefix_buffer != nullptr)) {
|
||||||
|
for (uint16_t i = 0; i < prefix_len; i++) {
|
||||||
|
DEBUG_SERIAL.print(F("0x"));
|
||||||
|
DEBUG_SERIAL.print(prefix_buffer[i], HEX);
|
||||||
|
DEBUG_SERIAL.print(F(", "));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (uint16_t i = 0; i < len; i++) {
|
||||||
|
DEBUG_SERIAL.print(F("0x"));
|
||||||
|
DEBUG_SERIAL.print(buffer[i], HEX);
|
||||||
|
DEBUG_SERIAL.print(F(", "));
|
||||||
|
if (i % 32 == 31) {
|
||||||
|
DEBUG_SERIAL.println();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DEBUG_SERIAL.println();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Read from SPI into a buffer from the SPI device, with transaction
|
||||||
|
* management.
|
||||||
|
* @param buffer Pointer to buffer of data to read into
|
||||||
|
* @param len Number of bytes from buffer to read.
|
||||||
|
* @param sendvalue The 8-bits of data to write when doing the data read,
|
||||||
|
* defaults to 0xFF
|
||||||
|
* @return Always returns true because there's no way to test success of SPI
|
||||||
|
* writes
|
||||||
|
*/
|
||||||
|
bool Adafruit_SPIDevice::read(uint8_t *buffer, size_t len, uint8_t sendvalue) {
|
||||||
|
memset(buffer, sendvalue, len); // clear out existing buffer
|
||||||
|
|
||||||
|
beginTransactionWithAssertingCS();
|
||||||
|
transfer(buffer, len);
|
||||||
|
endTransactionWithDeassertingCS();
|
||||||
|
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
DEBUG_SERIAL.print(F("\tSPIDevice Read: "));
|
||||||
|
for (uint16_t i = 0; i < len; i++) {
|
||||||
|
DEBUG_SERIAL.print(F("0x"));
|
||||||
|
DEBUG_SERIAL.print(buffer[i], HEX);
|
||||||
|
DEBUG_SERIAL.print(F(", "));
|
||||||
|
if (len % 32 == 31) {
|
||||||
|
DEBUG_SERIAL.println();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DEBUG_SERIAL.println();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Write some data, then read some data from SPI into another buffer,
|
||||||
|
* with transaction management. The buffers can point to same/overlapping
|
||||||
|
* locations. This does not transmit-receive at the same time!
|
||||||
|
* @param write_buffer Pointer to buffer of data to write from
|
||||||
|
* @param write_len Number of bytes from buffer to write.
|
||||||
|
* @param read_buffer Pointer to buffer of data to read into.
|
||||||
|
* @param read_len Number of bytes from buffer to read.
|
||||||
|
* @param sendvalue The 8-bits of data to write when doing the data read,
|
||||||
|
* defaults to 0xFF
|
||||||
|
* @return Always returns true because there's no way to test success of SPI
|
||||||
|
* writes
|
||||||
|
*/
|
||||||
|
bool Adafruit_SPIDevice::write_then_read(const uint8_t *write_buffer,
|
||||||
|
size_t write_len, uint8_t *read_buffer,
|
||||||
|
size_t read_len, uint8_t sendvalue) {
|
||||||
|
beginTransactionWithAssertingCS();
|
||||||
|
// do the writing
|
||||||
|
#if defined(ARDUINO_ARCH_ESP32)
|
||||||
|
if (_spi) {
|
||||||
|
if (write_len > 0) {
|
||||||
|
_spi->transferBytes((uint8_t *)write_buffer, nullptr, write_len);
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < write_len; i++) {
|
||||||
|
transfer(write_buffer[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
DEBUG_SERIAL.print(F("\tSPIDevice Wrote: "));
|
||||||
|
for (uint16_t i = 0; i < write_len; i++) {
|
||||||
|
DEBUG_SERIAL.print(F("0x"));
|
||||||
|
DEBUG_SERIAL.print(write_buffer[i], HEX);
|
||||||
|
DEBUG_SERIAL.print(F(", "));
|
||||||
|
if (write_len % 32 == 31) {
|
||||||
|
DEBUG_SERIAL.println();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DEBUG_SERIAL.println();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// do the reading
|
||||||
|
for (size_t i = 0; i < read_len; i++) {
|
||||||
|
read_buffer[i] = transfer(sendvalue);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
DEBUG_SERIAL.print(F("\tSPIDevice Read: "));
|
||||||
|
for (uint16_t i = 0; i < read_len; i++) {
|
||||||
|
DEBUG_SERIAL.print(F("0x"));
|
||||||
|
DEBUG_SERIAL.print(read_buffer[i], HEX);
|
||||||
|
DEBUG_SERIAL.print(F(", "));
|
||||||
|
if (read_len % 32 == 31) {
|
||||||
|
DEBUG_SERIAL.println();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DEBUG_SERIAL.println();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
endTransactionWithDeassertingCS();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Write some data and read some data at the same time from SPI
|
||||||
|
* into the same buffer, with transaction management. This is basicaly a wrapper
|
||||||
|
* for transfer() with CS-pin and transaction management. This /does/
|
||||||
|
* transmit-receive at the same time!
|
||||||
|
* @param buffer Pointer to buffer of data to write/read to/from
|
||||||
|
* @param len Number of bytes from buffer to write/read.
|
||||||
|
* @return Always returns true because there's no way to test success of SPI
|
||||||
|
* writes
|
||||||
|
*/
|
||||||
|
bool Adafruit_SPIDevice::write_and_read(uint8_t *buffer, size_t len) {
|
||||||
|
beginTransactionWithAssertingCS();
|
||||||
|
transfer(buffer, len);
|
||||||
|
endTransactionWithDeassertingCS();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
144
libraries/Adafruit_BusIO/Adafruit_SPIDevice.h
Normal file
144
libraries/Adafruit_BusIO/Adafruit_SPIDevice.h
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
#ifndef Adafruit_SPIDevice_h
|
||||||
|
#define Adafruit_SPIDevice_h
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
#if !defined(SPI_INTERFACES_COUNT) || \
|
||||||
|
(defined(SPI_INTERFACES_COUNT) && (SPI_INTERFACES_COUNT > 0))
|
||||||
|
// HW SPI available
|
||||||
|
#include <SPI.h>
|
||||||
|
#define BUSIO_HAS_HW_SPI
|
||||||
|
#else
|
||||||
|
// SW SPI ONLY
|
||||||
|
enum { SPI_MODE0, SPI_MODE1, SPI_MODE2, _SPI_MODE4 };
|
||||||
|
typedef uint8_t SPIClass;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// some modern SPI definitions don't have BitOrder enum
|
||||||
|
#if (defined(__AVR__) && !defined(ARDUINO_ARCH_MEGAAVR)) || \
|
||||||
|
defined(ESP8266) || defined(TEENSYDUINO) || defined(SPARK) || \
|
||||||
|
defined(ARDUINO_ARCH_SPRESENSE) || defined(MEGATINYCORE) || \
|
||||||
|
defined(DXCORE) || defined(ARDUINO_AVR_ATmega4809) || \
|
||||||
|
defined(ARDUINO_AVR_ATmega4808) || defined(ARDUINO_AVR_ATmega3209) || \
|
||||||
|
defined(ARDUINO_AVR_ATmega3208) || defined(ARDUINO_AVR_ATmega1609) || \
|
||||||
|
defined(ARDUINO_AVR_ATmega1608) || defined(ARDUINO_AVR_ATmega809) || \
|
||||||
|
defined(ARDUINO_AVR_ATmega808) || defined(ARDUINO_ARCH_ARC32) || \
|
||||||
|
defined(ARDUINO_ARCH_XMC)
|
||||||
|
|
||||||
|
typedef enum _BitOrder {
|
||||||
|
SPI_BITORDER_MSBFIRST = MSBFIRST,
|
||||||
|
SPI_BITORDER_LSBFIRST = LSBFIRST,
|
||||||
|
} BusIOBitOrder;
|
||||||
|
|
||||||
|
#elif defined(ESP32) || defined(__ASR6501__) || defined(__ASR6502__)
|
||||||
|
|
||||||
|
// some modern SPI definitions don't have BitOrder enum and have different SPI
|
||||||
|
// mode defines
|
||||||
|
typedef enum _BitOrder {
|
||||||
|
SPI_BITORDER_MSBFIRST = SPI_MSBFIRST,
|
||||||
|
SPI_BITORDER_LSBFIRST = SPI_LSBFIRST,
|
||||||
|
} BusIOBitOrder;
|
||||||
|
|
||||||
|
#else
|
||||||
|
// Some platforms have a BitOrder enum but its named MSBFIRST/LSBFIRST
|
||||||
|
#define SPI_BITORDER_MSBFIRST MSBFIRST
|
||||||
|
#define SPI_BITORDER_LSBFIRST LSBFIRST
|
||||||
|
typedef BitOrder BusIOBitOrder;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__IMXRT1062__) // Teensy 4.x
|
||||||
|
// *Warning* I disabled the usage of FAST_PINIO as the set/clear operations
|
||||||
|
// used in the cpp file are not atomic and can effect multiple IO pins
|
||||||
|
// and if an interrupt happens in between the time the code reads the register
|
||||||
|
// and writes out the updated value, that changes one or more other IO pins
|
||||||
|
// on that same IO port, those change will be clobbered when the updated
|
||||||
|
// values are written back. A fast version can be implemented that uses the
|
||||||
|
// ports set and clear registers which are atomic.
|
||||||
|
// typedef volatile uint32_t BusIO_PortReg;
|
||||||
|
// typedef uint32_t BusIO_PortMask;
|
||||||
|
//#define BUSIO_USE_FAST_PINIO
|
||||||
|
|
||||||
|
#elif defined(ARDUINO_ARCH_XMC)
|
||||||
|
#undef BUSIO_USE_FAST_PINIO
|
||||||
|
|
||||||
|
#elif defined(__AVR__) || defined(TEENSYDUINO)
|
||||||
|
typedef volatile uint8_t BusIO_PortReg;
|
||||||
|
typedef uint8_t BusIO_PortMask;
|
||||||
|
#define BUSIO_USE_FAST_PINIO
|
||||||
|
|
||||||
|
#elif defined(ESP8266) || defined(ESP32) || defined(__SAM3X8E__) || \
|
||||||
|
defined(ARDUINO_ARCH_SAMD)
|
||||||
|
typedef volatile uint32_t BusIO_PortReg;
|
||||||
|
typedef uint32_t BusIO_PortMask;
|
||||||
|
#define BUSIO_USE_FAST_PINIO
|
||||||
|
|
||||||
|
#elif (defined(__arm__) || defined(ARDUINO_FEATHER52)) && \
|
||||||
|
!defined(ARDUINO_ARCH_MBED) && !defined(ARDUINO_ARCH_RP2040) && \
|
||||||
|
!defined(ARDUINO_SILABS) && !defined(ARDUINO_UNOR4_MINIMA) && \
|
||||||
|
!defined(ARDUINO_UNOR4_WIFI)
|
||||||
|
typedef volatile uint32_t BusIO_PortReg;
|
||||||
|
typedef uint32_t BusIO_PortMask;
|
||||||
|
#if !defined(__ASR6501__) && !defined(__ASR6502__)
|
||||||
|
#define BUSIO_USE_FAST_PINIO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
#undef BUSIO_USE_FAST_PINIO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**! The class which defines how we will talk to this device over SPI **/
|
||||||
|
class Adafruit_SPIDevice {
|
||||||
|
public:
|
||||||
|
#ifdef BUSIO_HAS_HW_SPI
|
||||||
|
Adafruit_SPIDevice(int8_t cspin, uint32_t freq = 1000000,
|
||||||
|
BusIOBitOrder dataOrder = SPI_BITORDER_MSBFIRST,
|
||||||
|
uint8_t dataMode = SPI_MODE0, SPIClass *theSPI = &SPI);
|
||||||
|
#else
|
||||||
|
Adafruit_SPIDevice(int8_t cspin, uint32_t freq = 1000000,
|
||||||
|
BusIOBitOrder dataOrder = SPI_BITORDER_MSBFIRST,
|
||||||
|
uint8_t dataMode = SPI_MODE0, SPIClass *theSPI = nullptr);
|
||||||
|
#endif
|
||||||
|
Adafruit_SPIDevice(int8_t cspin, int8_t sck, int8_t miso, int8_t mosi,
|
||||||
|
uint32_t freq = 1000000,
|
||||||
|
BusIOBitOrder dataOrder = SPI_BITORDER_MSBFIRST,
|
||||||
|
uint8_t dataMode = SPI_MODE0);
|
||||||
|
~Adafruit_SPIDevice();
|
||||||
|
|
||||||
|
bool begin(void);
|
||||||
|
bool read(uint8_t *buffer, size_t len, uint8_t sendvalue = 0xFF);
|
||||||
|
bool write(const uint8_t *buffer, size_t len,
|
||||||
|
const uint8_t *prefix_buffer = nullptr, size_t prefix_len = 0);
|
||||||
|
bool write_then_read(const uint8_t *write_buffer, size_t write_len,
|
||||||
|
uint8_t *read_buffer, size_t read_len,
|
||||||
|
uint8_t sendvalue = 0xFF);
|
||||||
|
bool write_and_read(uint8_t *buffer, size_t len);
|
||||||
|
|
||||||
|
uint8_t transfer(uint8_t send);
|
||||||
|
void transfer(uint8_t *buffer, size_t len);
|
||||||
|
void beginTransaction(void);
|
||||||
|
void endTransaction(void);
|
||||||
|
void beginTransactionWithAssertingCS();
|
||||||
|
void endTransactionWithDeassertingCS();
|
||||||
|
|
||||||
|
private:
|
||||||
|
#ifdef BUSIO_HAS_HW_SPI
|
||||||
|
SPIClass *_spi = nullptr;
|
||||||
|
SPISettings *_spiSetting = nullptr;
|
||||||
|
#else
|
||||||
|
uint8_t *_spi = nullptr;
|
||||||
|
uint8_t *_spiSetting = nullptr;
|
||||||
|
#endif
|
||||||
|
uint32_t _freq;
|
||||||
|
BusIOBitOrder _dataOrder;
|
||||||
|
uint8_t _dataMode;
|
||||||
|
void setChipSelect(int value);
|
||||||
|
|
||||||
|
int8_t _cs, _sck, _mosi, _miso;
|
||||||
|
#ifdef BUSIO_USE_FAST_PINIO
|
||||||
|
BusIO_PortReg *mosiPort, *clkPort, *misoPort, *csPort;
|
||||||
|
BusIO_PortMask mosiPinMask, misoPinMask, clkPinMask, csPinMask;
|
||||||
|
#endif
|
||||||
|
bool _begun;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // Adafruit_SPIDevice_h
|
||||||
11
libraries/Adafruit_BusIO/CMakeLists.txt
Normal file
11
libraries/Adafruit_BusIO/CMakeLists.txt
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# Adafruit Bus IO Library
|
||||||
|
# https://github.com/adafruit/Adafruit_BusIO
|
||||||
|
# MIT License
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.5)
|
||||||
|
|
||||||
|
idf_component_register(SRCS "Adafruit_I2CDevice.cpp" "Adafruit_BusIO_Register.cpp" "Adafruit_SPIDevice.cpp"
|
||||||
|
INCLUDE_DIRS "."
|
||||||
|
REQUIRES arduino)
|
||||||
|
|
||||||
|
project(Adafruit_BusIO)
|
||||||
21
libraries/Adafruit_BusIO/LICENSE
Normal file
21
libraries/Adafruit_BusIO/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2017 Adafruit Industries
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
8
libraries/Adafruit_BusIO/README.md
Normal file
8
libraries/Adafruit_BusIO/README.md
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# Adafruit Bus IO Library [](https://github.com/adafruit/Adafruit_BusIO/actions)
|
||||||
|
|
||||||
|
|
||||||
|
This is a helper library to abstract away I2C & SPI transactions and registers
|
||||||
|
|
||||||
|
Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit!
|
||||||
|
|
||||||
|
MIT license, all text above must be included in any redistribution
|
||||||
1
libraries/Adafruit_BusIO/component.mk
Normal file
1
libraries/Adafruit_BusIO/component.mk
Normal file
@@ -0,0 +1 @@
|
|||||||
|
COMPONENT_ADD_INCLUDEDIRS = .
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
#include <Adafruit_I2CDevice.h>
|
||||||
|
|
||||||
|
Adafruit_I2CDevice i2c_dev = Adafruit_I2CDevice(0x10);
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
while (!Serial) { delay(10); }
|
||||||
|
Serial.begin(115200);
|
||||||
|
Serial.println("I2C address detection test");
|
||||||
|
|
||||||
|
if (!i2c_dev.begin()) {
|
||||||
|
Serial.print("Did not find device at 0x");
|
||||||
|
Serial.println(i2c_dev.address(), HEX);
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
|
Serial.print("Device found on address 0x");
|
||||||
|
Serial.println(i2c_dev.address(), HEX);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
#include <Adafruit_I2CDevice.h>
|
||||||
|
|
||||||
|
#define I2C_ADDRESS 0x60
|
||||||
|
Adafruit_I2CDevice i2c_dev = Adafruit_I2CDevice(I2C_ADDRESS);
|
||||||
|
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
while (!Serial) { delay(10); }
|
||||||
|
Serial.begin(115200);
|
||||||
|
Serial.println("I2C device read and write test");
|
||||||
|
|
||||||
|
if (!i2c_dev.begin()) {
|
||||||
|
Serial.print("Did not find device at 0x");
|
||||||
|
Serial.println(i2c_dev.address(), HEX);
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
|
Serial.print("Device found on address 0x");
|
||||||
|
Serial.println(i2c_dev.address(), HEX);
|
||||||
|
|
||||||
|
uint8_t buffer[32];
|
||||||
|
// Try to read 32 bytes
|
||||||
|
i2c_dev.read(buffer, 32);
|
||||||
|
Serial.print("Read: ");
|
||||||
|
for (uint8_t i=0; i<32; i++) {
|
||||||
|
Serial.print("0x"); Serial.print(buffer[i], HEX); Serial.print(", ");
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
|
||||||
|
// read a register by writing first, then reading
|
||||||
|
buffer[0] = 0x0C; // we'll reuse the same buffer
|
||||||
|
i2c_dev.write_then_read(buffer, 1, buffer, 2, false);
|
||||||
|
Serial.print("Write then Read: ");
|
||||||
|
for (uint8_t i=0; i<2; i++) {
|
||||||
|
Serial.print("0x"); Serial.print(buffer[i], HEX); Serial.print(", ");
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
#include <Adafruit_I2CDevice.h>
|
||||||
|
#include <Adafruit_BusIO_Register.h>
|
||||||
|
|
||||||
|
#define I2C_ADDRESS 0x60
|
||||||
|
Adafruit_I2CDevice i2c_dev = Adafruit_I2CDevice(I2C_ADDRESS);
|
||||||
|
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
while (!Serial) { delay(10); }
|
||||||
|
Serial.begin(115200);
|
||||||
|
Serial.println("I2C device register test");
|
||||||
|
|
||||||
|
if (!i2c_dev.begin()) {
|
||||||
|
Serial.print("Did not find device at 0x");
|
||||||
|
Serial.println(i2c_dev.address(), HEX);
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
|
Serial.print("Device found on address 0x");
|
||||||
|
Serial.println(i2c_dev.address(), HEX);
|
||||||
|
|
||||||
|
Adafruit_BusIO_Register id_reg = Adafruit_BusIO_Register(&i2c_dev, 0x0C, 2, LSBFIRST);
|
||||||
|
uint16_t id;
|
||||||
|
id_reg.read(&id);
|
||||||
|
Serial.print("ID register = 0x"); Serial.println(id, HEX);
|
||||||
|
|
||||||
|
Adafruit_BusIO_Register thresh_reg = Adafruit_BusIO_Register(&i2c_dev, 0x01, 2, LSBFIRST);
|
||||||
|
uint16_t thresh;
|
||||||
|
thresh_reg.read(&thresh);
|
||||||
|
Serial.print("Initial threshold register = 0x"); Serial.println(thresh, HEX);
|
||||||
|
|
||||||
|
thresh_reg.write(~thresh);
|
||||||
|
|
||||||
|
Serial.print("Post threshold register = 0x"); Serial.println(thresh_reg.read(), HEX);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
#include <Adafruit_BusIO_Register.h>
|
||||||
|
|
||||||
|
// Define which interface to use by setting the unused interface to NULL!
|
||||||
|
|
||||||
|
#define SPIDEVICE_CS 10
|
||||||
|
Adafruit_SPIDevice *spi_dev = NULL; // new Adafruit_SPIDevice(SPIDEVICE_CS);
|
||||||
|
|
||||||
|
#define I2C_ADDRESS 0x5D
|
||||||
|
Adafruit_I2CDevice *i2c_dev = new Adafruit_I2CDevice(I2C_ADDRESS);
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
while (!Serial) { delay(10); }
|
||||||
|
Serial.begin(115200);
|
||||||
|
Serial.println("I2C or SPI device register test");
|
||||||
|
|
||||||
|
if (spi_dev && !spi_dev->begin()) {
|
||||||
|
Serial.println("Could not initialize SPI device");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i2c_dev) {
|
||||||
|
if (i2c_dev->begin()) {
|
||||||
|
Serial.print("Device found on I2C address 0x");
|
||||||
|
Serial.println(i2c_dev->address(), HEX);
|
||||||
|
} else {
|
||||||
|
Serial.print("Did not find I2C device at 0x");
|
||||||
|
Serial.println(i2c_dev->address(), HEX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Adafruit_BusIO_Register id_reg = Adafruit_BusIO_Register(i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, 0x0F);
|
||||||
|
uint8_t id=0;
|
||||||
|
id_reg.read(&id);
|
||||||
|
Serial.print("ID register = 0x"); Serial.println(id, HEX);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
#include <Adafruit_SPIDevice.h>
|
||||||
|
|
||||||
|
#define SPIDEVICE_CS 10
|
||||||
|
Adafruit_SPIDevice spi_dev = Adafruit_SPIDevice(SPIDEVICE_CS, 100000, SPI_BITORDER_MSBFIRST, SPI_MODE1);
|
||||||
|
//Adafruit_SPIDevice spi_dev = Adafruit_SPIDevice(SPIDEVICE_CS, 13, 12, 11, 100000, SPI_BITORDER_MSBFIRST, SPI_MODE1);
|
||||||
|
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
while (!Serial) { delay(10); }
|
||||||
|
Serial.begin(115200);
|
||||||
|
Serial.println("SPI device mode test");
|
||||||
|
|
||||||
|
if (!spi_dev.begin()) {
|
||||||
|
Serial.println("Could not initialize SPI device");
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
Serial.println("\n\nTransfer test");
|
||||||
|
for (uint16_t x=0; x<=0xFF; x++) {
|
||||||
|
uint8_t i = x;
|
||||||
|
Serial.print("0x"); Serial.print(i, HEX);
|
||||||
|
spi_dev.read(&i, 1, i);
|
||||||
|
Serial.print("/"); Serial.print(i, HEX);
|
||||||
|
Serial.print(", ");
|
||||||
|
delay(25);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
#include <Adafruit_SPIDevice.h>
|
||||||
|
|
||||||
|
#define SPIDEVICE_CS 10
|
||||||
|
Adafruit_SPIDevice spi_dev = Adafruit_SPIDevice(SPIDEVICE_CS);
|
||||||
|
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
while (!Serial) { delay(10); }
|
||||||
|
Serial.begin(115200);
|
||||||
|
Serial.println("SPI device read and write test");
|
||||||
|
|
||||||
|
if (!spi_dev.begin()) {
|
||||||
|
Serial.println("Could not initialize SPI device");
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t buffer[32];
|
||||||
|
|
||||||
|
// Try to read 32 bytes
|
||||||
|
spi_dev.read(buffer, 32);
|
||||||
|
Serial.print("Read: ");
|
||||||
|
for (uint8_t i=0; i<32; i++) {
|
||||||
|
Serial.print("0x"); Serial.print(buffer[i], HEX); Serial.print(", ");
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
|
||||||
|
// read a register by writing first, then reading
|
||||||
|
buffer[0] = 0x8F; // we'll reuse the same buffer
|
||||||
|
spi_dev.write_then_read(buffer, 1, buffer, 2, false);
|
||||||
|
Serial.print("Write then Read: ");
|
||||||
|
for (uint8_t i=0; i<2; i++) {
|
||||||
|
Serial.print("0x"); Serial.print(buffer[i], HEX); Serial.print(", ");
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,192 @@
|
|||||||
|
/***************************************************
|
||||||
|
|
||||||
|
This is an example for how to use Adafruit_BusIO_RegisterBits from Adafruit_BusIO library.
|
||||||
|
|
||||||
|
Designed specifically to work with the Adafruit RTD Sensor
|
||||||
|
----> https://www.adafruit.com/products/3328
|
||||||
|
uisng a MAX31865 RTD-to-Digital Converter
|
||||||
|
----> https://datasheets.maximintegrated.com/en/ds/MAX31865.pdf
|
||||||
|
|
||||||
|
This sensor uses SPI to communicate, 4 pins are required to
|
||||||
|
interface.
|
||||||
|
A fifth pin helps to detect when a new conversion is ready.
|
||||||
|
|
||||||
|
Adafruit invests time and resources providing this open source code,
|
||||||
|
please support Adafruit and open-source hardware by purchasing
|
||||||
|
products from Adafruit!
|
||||||
|
|
||||||
|
Example written (2020/3) by Andreas Hardtung/AnHard.
|
||||||
|
BSD license, all text above must be included in any redistribution
|
||||||
|
****************************************************/
|
||||||
|
|
||||||
|
#include <Adafruit_BusIO_Register.h>
|
||||||
|
#include <Adafruit_SPIDevice.h>
|
||||||
|
|
||||||
|
#define MAX31865_SPI_SPEED (5000000)
|
||||||
|
#define MAX31865_SPI_BITORDER (SPI_BITORDER_MSBFIRST)
|
||||||
|
#define MAX31865_SPI_MODE (SPI_MODE1)
|
||||||
|
|
||||||
|
#define MAX31865_SPI_CS (10)
|
||||||
|
#define MAX31865_READY_PIN (2)
|
||||||
|
|
||||||
|
|
||||||
|
Adafruit_SPIDevice spi_dev = Adafruit_SPIDevice( MAX31865_SPI_CS, MAX31865_SPI_SPEED, MAX31865_SPI_BITORDER, MAX31865_SPI_MODE, &SPI); // Hardware SPI
|
||||||
|
// Adafruit_SPIDevice spi_dev = Adafruit_SPIDevice( MAX31865_SPI_CS, 13, 12, 11, MAX31865_SPI_SPEED, MAX31865_SPI_BITORDER, MAX31865_SPI_MODE); // Software SPI
|
||||||
|
|
||||||
|
// MAX31865 chip related *********************************************************************************************
|
||||||
|
Adafruit_BusIO_Register config_reg = Adafruit_BusIO_Register(&spi_dev, 0x00, ADDRBIT8_HIGH_TOWRITE, 1, MSBFIRST);
|
||||||
|
Adafruit_BusIO_RegisterBits bias_bit = Adafruit_BusIO_RegisterBits(&config_reg, 1, 7);
|
||||||
|
Adafruit_BusIO_RegisterBits auto_bit = Adafruit_BusIO_RegisterBits(&config_reg, 1, 6);
|
||||||
|
Adafruit_BusIO_RegisterBits oneS_bit = Adafruit_BusIO_RegisterBits(&config_reg, 1, 5);
|
||||||
|
Adafruit_BusIO_RegisterBits wire_bit = Adafruit_BusIO_RegisterBits(&config_reg, 1, 4);
|
||||||
|
Adafruit_BusIO_RegisterBits faultT_bits = Adafruit_BusIO_RegisterBits(&config_reg, 2, 2);
|
||||||
|
Adafruit_BusIO_RegisterBits faultR_bit = Adafruit_BusIO_RegisterBits(&config_reg, 1, 1);
|
||||||
|
Adafruit_BusIO_RegisterBits fi50hz_bit = Adafruit_BusIO_RegisterBits(&config_reg, 1, 0);
|
||||||
|
|
||||||
|
Adafruit_BusIO_Register rRatio_reg = Adafruit_BusIO_Register(&spi_dev, 0x01, ADDRBIT8_HIGH_TOWRITE, 2, MSBFIRST);
|
||||||
|
Adafruit_BusIO_RegisterBits rRatio_bits = Adafruit_BusIO_RegisterBits(&rRatio_reg, 15, 1);
|
||||||
|
Adafruit_BusIO_RegisterBits fault_bit = Adafruit_BusIO_RegisterBits(&rRatio_reg, 1, 0);
|
||||||
|
|
||||||
|
Adafruit_BusIO_Register maxRratio_reg = Adafruit_BusIO_Register(&spi_dev, 0x03, ADDRBIT8_HIGH_TOWRITE, 2, MSBFIRST);
|
||||||
|
Adafruit_BusIO_RegisterBits maxRratio_bits = Adafruit_BusIO_RegisterBits(&maxRratio_reg, 15, 1);
|
||||||
|
|
||||||
|
Adafruit_BusIO_Register minRratio_reg = Adafruit_BusIO_Register(&spi_dev, 0x05, ADDRBIT8_HIGH_TOWRITE, 2, MSBFIRST);
|
||||||
|
Adafruit_BusIO_RegisterBits minRratio_bits = Adafruit_BusIO_RegisterBits(&minRratio_reg, 15, 1);
|
||||||
|
|
||||||
|
Adafruit_BusIO_Register fault_reg = Adafruit_BusIO_Register(&spi_dev, 0x07, ADDRBIT8_HIGH_TOWRITE, 1, MSBFIRST);
|
||||||
|
Adafruit_BusIO_RegisterBits range_high_fault_bit = Adafruit_BusIO_RegisterBits(&fault_reg, 1, 7);
|
||||||
|
Adafruit_BusIO_RegisterBits range_low_fault_bit = Adafruit_BusIO_RegisterBits(&fault_reg, 1, 6);
|
||||||
|
Adafruit_BusIO_RegisterBits refin_high_fault_bit = Adafruit_BusIO_RegisterBits(&fault_reg, 1, 5);
|
||||||
|
Adafruit_BusIO_RegisterBits refin_low_fault_bit = Adafruit_BusIO_RegisterBits(&fault_reg, 1, 4);
|
||||||
|
Adafruit_BusIO_RegisterBits rtdin_low_fault_bit = Adafruit_BusIO_RegisterBits(&fault_reg, 1, 3);
|
||||||
|
Adafruit_BusIO_RegisterBits voltage_fault_bit = Adafruit_BusIO_RegisterBits(&fault_reg, 1, 2);
|
||||||
|
|
||||||
|
// Print the details of the configuration register.
|
||||||
|
void printConfig( void ) {
|
||||||
|
Serial.print("BIAS: "); if (bias_bit.read() ) Serial.print("ON"); else Serial.print("OFF");
|
||||||
|
Serial.print(", AUTO: "); if (auto_bit.read() ) Serial.print("ON"); else Serial.print("OFF");
|
||||||
|
Serial.print(", ONES: "); if (oneS_bit.read() ) Serial.print("ON"); else Serial.print("OFF");
|
||||||
|
Serial.print(", WIRE: "); if (wire_bit.read() ) Serial.print("3"); else Serial.print("2/4");
|
||||||
|
Serial.print(", FAULTCLEAR: "); if (faultR_bit.read() ) Serial.print("ON"); else Serial.print("OFF");
|
||||||
|
Serial.print(", "); if (fi50hz_bit.read() ) Serial.print("50HZ"); else Serial.print("60HZ");
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check and print faults. Then clear them.
|
||||||
|
void checkFaults( void ) {
|
||||||
|
if (fault_bit.read()) {
|
||||||
|
Serial.print("MAX: "); Serial.println(maxRratio_bits.read());
|
||||||
|
Serial.print("VAL: "); Serial.println( rRatio_bits.read());
|
||||||
|
Serial.print("MIN: "); Serial.println(minRratio_bits.read());
|
||||||
|
|
||||||
|
if (range_high_fault_bit.read() ) Serial.println("Range high fault");
|
||||||
|
if ( range_low_fault_bit.read() ) Serial.println("Range low fault");
|
||||||
|
if (refin_high_fault_bit.read() ) Serial.println("REFIN high fault");
|
||||||
|
if ( refin_low_fault_bit.read() ) Serial.println("REFIN low fault");
|
||||||
|
if ( rtdin_low_fault_bit.read() ) Serial.println("RTDIN low fault");
|
||||||
|
if ( voltage_fault_bit.read() ) Serial.println("Voltage fault");
|
||||||
|
|
||||||
|
faultR_bit.write(1); // clear fault
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
#if (MAX31865_1_READY_PIN != -1)
|
||||||
|
pinMode(MAX31865_READY_PIN ,INPUT_PULLUP);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
while (!Serial) { delay(10); }
|
||||||
|
Serial.begin(115200);
|
||||||
|
Serial.println("SPI Adafruit_BusIO_RegisterBits test on MAX31865");
|
||||||
|
|
||||||
|
if (!spi_dev.begin()) {
|
||||||
|
Serial.println("Could not initialize SPI device");
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set up for automode 50Hz. We don't care about selfheating. We want the highest possible sampling rate.
|
||||||
|
auto_bit.write(0); // Don't switch filtermode while auto_mode is on.
|
||||||
|
fi50hz_bit.write(1); // Set filter to 50Hz mode.
|
||||||
|
faultR_bit.write(1); // Clear faults.
|
||||||
|
bias_bit.write(1); // In automode we want to have the bias current always on.
|
||||||
|
delay(5); // Wait until bias current settles down.
|
||||||
|
// 10.5 time constants of the input RC network is required.
|
||||||
|
// 10ms worst case for 10kω reference resistor and a 0.1µF capacitor across the RTD inputs.
|
||||||
|
// Adafruit Module has 0.1µF and only 430/4300ω So here 0.43/4.3ms
|
||||||
|
auto_bit.write(1); // Now we can set automode. Automatically starting first conversion.
|
||||||
|
|
||||||
|
// Test the READY_PIN
|
||||||
|
#if (defined( MAX31865_READY_PIN ) && (MAX31865_READY_PIN != -1))
|
||||||
|
int i = 0;
|
||||||
|
while (digitalRead(MAX31865_READY_PIN) && i++ <= 100) { delay(1); }
|
||||||
|
if (i >= 100) {
|
||||||
|
Serial.print("ERROR: Max31865 Pin detection does not work. PIN:");
|
||||||
|
Serial.println(MAX31865_READY_PIN);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
delay(100);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Set ratio range.
|
||||||
|
// Setting the temperatures would need some more calculation - not related to Adafruit_BusIO_RegisterBits.
|
||||||
|
uint16_t ratio = rRatio_bits.read();
|
||||||
|
maxRratio_bits.write( (ratio < 0x8fffu-1000u) ? ratio + 1000u : 0x8fffu );
|
||||||
|
minRratio_bits.write( (ratio > 1000u) ? ratio - 1000u : 0u );
|
||||||
|
|
||||||
|
printConfig();
|
||||||
|
checkFaults();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
#if (defined( MAX31865_READY_PIN ) && (MAX31865_1_READY_PIN != -1))
|
||||||
|
// Is conversion ready?
|
||||||
|
if (!digitalRead(MAX31865_READY_PIN))
|
||||||
|
#else
|
||||||
|
// Warant conversion is ready.
|
||||||
|
delay(21); // 21ms for 50Hz-mode. 19ms in 60Hz-mode.
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
// Read ratio, calculate temperature, scale, filter and print.
|
||||||
|
Serial.println( rRatio2C( rRatio_bits.read() ) * 100.0f, 0); // Temperature scaled by 100
|
||||||
|
// Check, print, clear faults.
|
||||||
|
checkFaults();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do something else.
|
||||||
|
//delay(15000);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Module/Sensor related. Here Adafruit PT100 module with a 2_Wire PT100 Class C *****************************
|
||||||
|
float rRatio2C(uint16_t ratio) {
|
||||||
|
// A simple linear conversion.
|
||||||
|
const float R0 = 100.0f;
|
||||||
|
const float Rref = 430.0f;
|
||||||
|
const float alphaPT = 0.003850f;
|
||||||
|
const float ADCmax = (1u << 15) - 1.0f;
|
||||||
|
const float rscale = Rref / ADCmax;
|
||||||
|
// Measured temperature in boiling water 101.08°C with factor a = 1 and b = 0. Rref and MAX at about 22±2°C.
|
||||||
|
// Measured temperature in ice/water bath 0.76°C with factor a = 1 and b = 0. Rref and MAX at about 22±2°C.
|
||||||
|
//const float a = 1.0f / (alphaPT * R0);
|
||||||
|
const float a = (100.0f/101.08f) / (alphaPT * R0);
|
||||||
|
//const float b = 0.0f; // 101.08
|
||||||
|
const float b = -0.76f; // 100.32 > 101.08
|
||||||
|
|
||||||
|
return filterRing( ((ratio * rscale) - R0) * a + b );
|
||||||
|
}
|
||||||
|
|
||||||
|
// General purpose *********************************************************************************************
|
||||||
|
#define RINGLENGTH 250
|
||||||
|
float filterRing( float newVal ) {
|
||||||
|
static float ring[RINGLENGTH] = { 0.0 };
|
||||||
|
static uint8_t ringIndex = 0;
|
||||||
|
static bool ringFull = false;
|
||||||
|
|
||||||
|
if ( ringIndex == RINGLENGTH ) { ringFull = true; ringIndex = 0; }
|
||||||
|
ring[ringIndex] = newVal;
|
||||||
|
uint8_t loopEnd = (ringFull) ? RINGLENGTH : ringIndex + 1;
|
||||||
|
float ringSum = 0.0f;
|
||||||
|
for (uint8_t i = 0; i < loopEnd; i++) ringSum += ring[i];
|
||||||
|
ringIndex++;
|
||||||
|
return ringSum / loopEnd;
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
#include <Adafruit_BusIO_Register.h>
|
||||||
|
#include <Adafruit_SPIDevice.h>
|
||||||
|
|
||||||
|
#define SPIDEVICE_CS 10
|
||||||
|
Adafruit_SPIDevice spi_dev = Adafruit_SPIDevice(SPIDEVICE_CS);
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
while (!Serial) { delay(10); }
|
||||||
|
Serial.begin(115200);
|
||||||
|
Serial.println("SPI device register test");
|
||||||
|
|
||||||
|
if (!spi_dev.begin()) {
|
||||||
|
Serial.println("Could not initialize SPI device");
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
Adafruit_BusIO_Register id_reg = Adafruit_BusIO_Register(&spi_dev, 0x0F, ADDRBIT8_HIGH_TOREAD);
|
||||||
|
uint8_t id = 0;
|
||||||
|
id_reg.read(&id);
|
||||||
|
Serial.print("ID register = 0x"); Serial.println(id, HEX);
|
||||||
|
|
||||||
|
Adafruit_BusIO_Register thresh_reg = Adafruit_BusIO_Register(&spi_dev, 0x0C, ADDRBIT8_HIGH_TOREAD, 2, LSBFIRST);
|
||||||
|
uint16_t thresh = 0;
|
||||||
|
thresh_reg.read(&thresh);
|
||||||
|
Serial.print("Initial threshold register = 0x"); Serial.println(thresh, HEX);
|
||||||
|
|
||||||
|
thresh_reg.write(~thresh);
|
||||||
|
|
||||||
|
Serial.print("Post threshold register = 0x"); Serial.println(thresh_reg.read(), HEX);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
}
|
||||||
9
libraries/Adafruit_BusIO/library.properties
Normal file
9
libraries/Adafruit_BusIO/library.properties
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
name=Adafruit BusIO
|
||||||
|
version=1.16.1
|
||||||
|
author=Adafruit
|
||||||
|
maintainer=Adafruit <info@adafruit.com>
|
||||||
|
sentence=This is a library for abstracting away I2C and SPI interfacing
|
||||||
|
paragraph=This is a library for abstracting away I2C and SPI interfacing
|
||||||
|
category=Signal Input/Output
|
||||||
|
url=https://github.com/adafruit/Adafruit_BusIO
|
||||||
|
architectures=*
|
||||||
2669
libraries/Adafruit_GFX_Library/Adafruit_GFX.cpp
Normal file
2669
libraries/Adafruit_GFX_Library/Adafruit_GFX.cpp
Normal file
File diff suppressed because it is too large
Load Diff
391
libraries/Adafruit_GFX_Library/Adafruit_GFX.h
Normal file
391
libraries/Adafruit_GFX_Library/Adafruit_GFX.h
Normal file
@@ -0,0 +1,391 @@
|
|||||||
|
#ifndef _ADAFRUIT_GFX_H
|
||||||
|
#define _ADAFRUIT_GFX_H
|
||||||
|
|
||||||
|
#if ARDUINO >= 100
|
||||||
|
#include "Arduino.h"
|
||||||
|
#include "Print.h"
|
||||||
|
#else
|
||||||
|
#include "WProgram.h"
|
||||||
|
#endif
|
||||||
|
#include "gfxfont.h"
|
||||||
|
|
||||||
|
#include <Adafruit_I2CDevice.h>
|
||||||
|
#include <Adafruit_SPIDevice.h>
|
||||||
|
|
||||||
|
/// A generic graphics superclass that can handle all sorts of drawing. At a
|
||||||
|
/// minimum you can subclass and provide drawPixel(). At a maximum you can do a
|
||||||
|
/// ton of overriding to optimize. Used for any/all Adafruit displays!
|
||||||
|
class Adafruit_GFX : public Print {
|
||||||
|
|
||||||
|
public:
|
||||||
|
Adafruit_GFX(int16_t w, int16_t h); // Constructor
|
||||||
|
|
||||||
|
/**********************************************************************/
|
||||||
|
/*!
|
||||||
|
@brief Draw to the screen/framebuffer/etc.
|
||||||
|
Must be overridden in subclass.
|
||||||
|
@param x X coordinate in pixels
|
||||||
|
@param y Y coordinate in pixels
|
||||||
|
@param color 16-bit pixel color.
|
||||||
|
*/
|
||||||
|
/**********************************************************************/
|
||||||
|
virtual void drawPixel(int16_t x, int16_t y, uint16_t color) = 0;
|
||||||
|
|
||||||
|
// TRANSACTION API / CORE DRAW API
|
||||||
|
// These MAY be overridden by the subclass to provide device-specific
|
||||||
|
// optimized code. Otherwise 'generic' versions are used.
|
||||||
|
virtual void startWrite(void);
|
||||||
|
virtual void writePixel(int16_t x, int16_t y, uint16_t color);
|
||||||
|
virtual void writeFillRect(int16_t x, int16_t y, int16_t w, int16_t h,
|
||||||
|
uint16_t color);
|
||||||
|
virtual void writeFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
|
||||||
|
virtual void writeFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
|
||||||
|
virtual void writeLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
|
||||||
|
uint16_t color);
|
||||||
|
virtual void endWrite(void);
|
||||||
|
|
||||||
|
// CONTROL API
|
||||||
|
// These MAY be overridden by the subclass to provide device-specific
|
||||||
|
// optimized code. Otherwise 'generic' versions are used.
|
||||||
|
virtual void setRotation(uint8_t r);
|
||||||
|
virtual void invertDisplay(bool i);
|
||||||
|
|
||||||
|
// BASIC DRAW API
|
||||||
|
// These MAY be overridden by the subclass to provide device-specific
|
||||||
|
// optimized code. Otherwise 'generic' versions are used.
|
||||||
|
|
||||||
|
// It's good to implement those, even if using transaction API
|
||||||
|
virtual void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
|
||||||
|
virtual void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
|
||||||
|
virtual void fillRect(int16_t x, int16_t y, int16_t w, int16_t h,
|
||||||
|
uint16_t color);
|
||||||
|
virtual void fillScreen(uint16_t color);
|
||||||
|
// Optional and probably not necessary to change
|
||||||
|
virtual void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
|
||||||
|
uint16_t color);
|
||||||
|
virtual void drawRect(int16_t x, int16_t y, int16_t w, int16_t h,
|
||||||
|
uint16_t color);
|
||||||
|
|
||||||
|
// These exist only with Adafruit_GFX (no subclass overrides)
|
||||||
|
void drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color);
|
||||||
|
void drawCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername,
|
||||||
|
uint16_t color);
|
||||||
|
void fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color);
|
||||||
|
void fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername,
|
||||||
|
int16_t delta, uint16_t color);
|
||||||
|
void drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2,
|
||||||
|
int16_t y2, uint16_t color);
|
||||||
|
void fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2,
|
||||||
|
int16_t y2, uint16_t color);
|
||||||
|
void drawRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h,
|
||||||
|
int16_t radius, uint16_t color);
|
||||||
|
void fillRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h,
|
||||||
|
int16_t radius, uint16_t color);
|
||||||
|
void drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w,
|
||||||
|
int16_t h, uint16_t color);
|
||||||
|
void drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w,
|
||||||
|
int16_t h, uint16_t color, uint16_t bg);
|
||||||
|
void drawBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w, int16_t h,
|
||||||
|
uint16_t color);
|
||||||
|
void drawBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w, int16_t h,
|
||||||
|
uint16_t color, uint16_t bg);
|
||||||
|
void drawXBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w,
|
||||||
|
int16_t h, uint16_t color);
|
||||||
|
void drawGrayscaleBitmap(int16_t x, int16_t y, const uint8_t bitmap[],
|
||||||
|
int16_t w, int16_t h);
|
||||||
|
void drawGrayscaleBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w,
|
||||||
|
int16_t h);
|
||||||
|
void drawGrayscaleBitmap(int16_t x, int16_t y, const uint8_t bitmap[],
|
||||||
|
const uint8_t mask[], int16_t w, int16_t h);
|
||||||
|
void drawGrayscaleBitmap(int16_t x, int16_t y, uint8_t *bitmap, uint8_t *mask,
|
||||||
|
int16_t w, int16_t h);
|
||||||
|
void drawRGBBitmap(int16_t x, int16_t y, const uint16_t bitmap[], int16_t w,
|
||||||
|
int16_t h);
|
||||||
|
void drawRGBBitmap(int16_t x, int16_t y, uint16_t *bitmap, int16_t w,
|
||||||
|
int16_t h);
|
||||||
|
void drawRGBBitmap(int16_t x, int16_t y, const uint16_t bitmap[],
|
||||||
|
const uint8_t mask[], int16_t w, int16_t h);
|
||||||
|
void drawRGBBitmap(int16_t x, int16_t y, uint16_t *bitmap, uint8_t *mask,
|
||||||
|
int16_t w, int16_t h);
|
||||||
|
void drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color,
|
||||||
|
uint16_t bg, uint8_t size);
|
||||||
|
void drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color,
|
||||||
|
uint16_t bg, uint8_t size_x, uint8_t size_y);
|
||||||
|
void getTextBounds(const char *string, int16_t x, int16_t y, int16_t *x1,
|
||||||
|
int16_t *y1, uint16_t *w, uint16_t *h);
|
||||||
|
void getTextBounds(const __FlashStringHelper *s, int16_t x, int16_t y,
|
||||||
|
int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h);
|
||||||
|
void getTextBounds(const String &str, int16_t x, int16_t y, int16_t *x1,
|
||||||
|
int16_t *y1, uint16_t *w, uint16_t *h);
|
||||||
|
void setTextSize(uint8_t s);
|
||||||
|
void setTextSize(uint8_t sx, uint8_t sy);
|
||||||
|
void setFont(const GFXfont *f = NULL);
|
||||||
|
|
||||||
|
/**********************************************************************/
|
||||||
|
/*!
|
||||||
|
@brief Set text cursor location
|
||||||
|
@param x X coordinate in pixels
|
||||||
|
@param y Y coordinate in pixels
|
||||||
|
*/
|
||||||
|
/**********************************************************************/
|
||||||
|
void setCursor(int16_t x, int16_t y) {
|
||||||
|
cursor_x = x;
|
||||||
|
cursor_y = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**********************************************************************/
|
||||||
|
/*!
|
||||||
|
@brief Set text font color with transparant background
|
||||||
|
@param c 16-bit 5-6-5 Color to draw text with
|
||||||
|
@note For 'transparent' background, background and foreground
|
||||||
|
are set to same color rather than using a separate flag.
|
||||||
|
*/
|
||||||
|
/**********************************************************************/
|
||||||
|
void setTextColor(uint16_t c) { textcolor = textbgcolor = c; }
|
||||||
|
|
||||||
|
/**********************************************************************/
|
||||||
|
/*!
|
||||||
|
@brief Set text font color with custom background color
|
||||||
|
@param c 16-bit 5-6-5 Color to draw text with
|
||||||
|
@param bg 16-bit 5-6-5 Color to draw background/fill with
|
||||||
|
*/
|
||||||
|
/**********************************************************************/
|
||||||
|
void setTextColor(uint16_t c, uint16_t bg) {
|
||||||
|
textcolor = c;
|
||||||
|
textbgcolor = bg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**********************************************************************/
|
||||||
|
/*!
|
||||||
|
@brief Set whether text that is too long for the screen width should
|
||||||
|
automatically wrap around to the next line (else clip right).
|
||||||
|
@param w true for wrapping, false for clipping
|
||||||
|
*/
|
||||||
|
/**********************************************************************/
|
||||||
|
void setTextWrap(bool w) { wrap = w; }
|
||||||
|
|
||||||
|
/**********************************************************************/
|
||||||
|
/*!
|
||||||
|
@brief Enable (or disable) Code Page 437-compatible charset.
|
||||||
|
There was an error in glcdfont.c for the longest time -- one
|
||||||
|
character (#176, the 'light shade' block) was missing -- this
|
||||||
|
threw off the index of every character that followed it.
|
||||||
|
But a TON of code has been written with the erroneous
|
||||||
|
character indices. By default, the library uses the original
|
||||||
|
'wrong' behavior and old sketches will still work. Pass
|
||||||
|
'true' to this function to use correct CP437 character values
|
||||||
|
in your code.
|
||||||
|
@param x true = enable (new behavior), false = disable (old behavior)
|
||||||
|
*/
|
||||||
|
/**********************************************************************/
|
||||||
|
void cp437(bool x = true) { _cp437 = x; }
|
||||||
|
|
||||||
|
using Print::write;
|
||||||
|
#if ARDUINO >= 100
|
||||||
|
virtual size_t write(uint8_t);
|
||||||
|
#else
|
||||||
|
virtual void write(uint8_t);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/*!
|
||||||
|
@brief Get width of the display, accounting for current rotation
|
||||||
|
@returns Width in pixels
|
||||||
|
*/
|
||||||
|
/************************************************************************/
|
||||||
|
int16_t width(void) const { return _width; };
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/*!
|
||||||
|
@brief Get height of the display, accounting for current rotation
|
||||||
|
@returns Height in pixels
|
||||||
|
*/
|
||||||
|
/************************************************************************/
|
||||||
|
int16_t height(void) const { return _height; }
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/*!
|
||||||
|
@brief Get rotation setting for display
|
||||||
|
@returns 0 thru 3 corresponding to 4 cardinal rotations
|
||||||
|
*/
|
||||||
|
/************************************************************************/
|
||||||
|
uint8_t getRotation(void) const { return rotation; }
|
||||||
|
|
||||||
|
// get current cursor position (get rotation safe maximum values,
|
||||||
|
// using: width() for x, height() for y)
|
||||||
|
/************************************************************************/
|
||||||
|
/*!
|
||||||
|
@brief Get text cursor X location
|
||||||
|
@returns X coordinate in pixels
|
||||||
|
*/
|
||||||
|
/************************************************************************/
|
||||||
|
int16_t getCursorX(void) const { return cursor_x; }
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/*!
|
||||||
|
@brief Get text cursor Y location
|
||||||
|
@returns Y coordinate in pixels
|
||||||
|
*/
|
||||||
|
/************************************************************************/
|
||||||
|
int16_t getCursorY(void) const { return cursor_y; };
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void charBounds(unsigned char c, int16_t *x, int16_t *y, int16_t *minx,
|
||||||
|
int16_t *miny, int16_t *maxx, int16_t *maxy);
|
||||||
|
int16_t WIDTH; ///< This is the 'raw' display width - never changes
|
||||||
|
int16_t HEIGHT; ///< This is the 'raw' display height - never changes
|
||||||
|
int16_t _width; ///< Display width as modified by current rotation
|
||||||
|
int16_t _height; ///< Display height as modified by current rotation
|
||||||
|
int16_t cursor_x; ///< x location to start print()ing text
|
||||||
|
int16_t cursor_y; ///< y location to start print()ing text
|
||||||
|
uint16_t textcolor; ///< 16-bit background color for print()
|
||||||
|
uint16_t textbgcolor; ///< 16-bit text color for print()
|
||||||
|
uint8_t textsize_x; ///< Desired magnification in X-axis of text to print()
|
||||||
|
uint8_t textsize_y; ///< Desired magnification in Y-axis of text to print()
|
||||||
|
uint8_t rotation; ///< Display rotation (0 thru 3)
|
||||||
|
bool wrap; ///< If set, 'wrap' text at right edge of display
|
||||||
|
bool _cp437; ///< If set, use correct CP437 charset (default is off)
|
||||||
|
GFXfont *gfxFont; ///< Pointer to special font
|
||||||
|
};
|
||||||
|
|
||||||
|
/// A simple drawn button UI element
|
||||||
|
class Adafruit_GFX_Button {
|
||||||
|
|
||||||
|
public:
|
||||||
|
Adafruit_GFX_Button(void);
|
||||||
|
// "Classic" initButton() uses center & size
|
||||||
|
void initButton(Adafruit_GFX *gfx, int16_t x, int16_t y, uint16_t w,
|
||||||
|
uint16_t h, uint16_t outline, uint16_t fill,
|
||||||
|
uint16_t textcolor, char *label, uint8_t textsize);
|
||||||
|
void initButton(Adafruit_GFX *gfx, int16_t x, int16_t y, uint16_t w,
|
||||||
|
uint16_t h, uint16_t outline, uint16_t fill,
|
||||||
|
uint16_t textcolor, char *label, uint8_t textsize_x,
|
||||||
|
uint8_t textsize_y);
|
||||||
|
// New/alt initButton() uses upper-left corner & size
|
||||||
|
void initButtonUL(Adafruit_GFX *gfx, int16_t x1, int16_t y1, uint16_t w,
|
||||||
|
uint16_t h, uint16_t outline, uint16_t fill,
|
||||||
|
uint16_t textcolor, char *label, uint8_t textsize);
|
||||||
|
void initButtonUL(Adafruit_GFX *gfx, int16_t x1, int16_t y1, uint16_t w,
|
||||||
|
uint16_t h, uint16_t outline, uint16_t fill,
|
||||||
|
uint16_t textcolor, char *label, uint8_t textsize_x,
|
||||||
|
uint8_t textsize_y);
|
||||||
|
void drawButton(bool inverted = false);
|
||||||
|
bool contains(int16_t x, int16_t y);
|
||||||
|
|
||||||
|
/**********************************************************************/
|
||||||
|
/*!
|
||||||
|
@brief Sets button state, should be done by some touch function
|
||||||
|
@param p True for pressed, false for not.
|
||||||
|
*/
|
||||||
|
/**********************************************************************/
|
||||||
|
void press(bool p) {
|
||||||
|
laststate = currstate;
|
||||||
|
currstate = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool justPressed();
|
||||||
|
bool justReleased();
|
||||||
|
|
||||||
|
/**********************************************************************/
|
||||||
|
/*!
|
||||||
|
@brief Query whether the button is currently pressed
|
||||||
|
@returns True if pressed
|
||||||
|
*/
|
||||||
|
/**********************************************************************/
|
||||||
|
bool isPressed(void) { return currstate; };
|
||||||
|
|
||||||
|
private:
|
||||||
|
Adafruit_GFX *_gfx;
|
||||||
|
int16_t _x1, _y1; // Coordinates of top-left corner
|
||||||
|
uint16_t _w, _h;
|
||||||
|
uint8_t _textsize_x;
|
||||||
|
uint8_t _textsize_y;
|
||||||
|
uint16_t _outlinecolor, _fillcolor, _textcolor;
|
||||||
|
char _label[10];
|
||||||
|
|
||||||
|
bool currstate, laststate;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// A GFX 1-bit canvas context for graphics
|
||||||
|
class GFXcanvas1 : public Adafruit_GFX {
|
||||||
|
public:
|
||||||
|
GFXcanvas1(uint16_t w, uint16_t h);
|
||||||
|
~GFXcanvas1(void);
|
||||||
|
void drawPixel(int16_t x, int16_t y, uint16_t color);
|
||||||
|
void fillScreen(uint16_t color);
|
||||||
|
void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
|
||||||
|
void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
|
||||||
|
bool getPixel(int16_t x, int16_t y) const;
|
||||||
|
/**********************************************************************/
|
||||||
|
/*!
|
||||||
|
@brief Get a pointer to the internal buffer memory
|
||||||
|
@returns A pointer to the allocated buffer
|
||||||
|
*/
|
||||||
|
/**********************************************************************/
|
||||||
|
uint8_t *getBuffer(void) const { return buffer; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool getRawPixel(int16_t x, int16_t y) const;
|
||||||
|
void drawFastRawVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
|
||||||
|
void drawFastRawHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
|
||||||
|
uint8_t *buffer; ///< Raster data: no longer private, allow subclass access
|
||||||
|
|
||||||
|
private:
|
||||||
|
#ifdef __AVR__
|
||||||
|
// Bitmask tables of 0x80>>X and ~(0x80>>X), because X>>Y is slow on AVR
|
||||||
|
static const uint8_t PROGMEM GFXsetBit[], GFXclrBit[];
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
/// A GFX 8-bit canvas context for graphics
|
||||||
|
class GFXcanvas8 : public Adafruit_GFX {
|
||||||
|
public:
|
||||||
|
GFXcanvas8(uint16_t w, uint16_t h);
|
||||||
|
~GFXcanvas8(void);
|
||||||
|
void drawPixel(int16_t x, int16_t y, uint16_t color);
|
||||||
|
void fillScreen(uint16_t color);
|
||||||
|
void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
|
||||||
|
void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
|
||||||
|
uint8_t getPixel(int16_t x, int16_t y) const;
|
||||||
|
/**********************************************************************/
|
||||||
|
/*!
|
||||||
|
@brief Get a pointer to the internal buffer memory
|
||||||
|
@returns A pointer to the allocated buffer
|
||||||
|
*/
|
||||||
|
/**********************************************************************/
|
||||||
|
uint8_t *getBuffer(void) const { return buffer; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
uint8_t getRawPixel(int16_t x, int16_t y) const;
|
||||||
|
void drawFastRawVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
|
||||||
|
void drawFastRawHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
|
||||||
|
uint8_t *buffer; ///< Raster data: no longer private, allow subclass access
|
||||||
|
};
|
||||||
|
|
||||||
|
/// A GFX 16-bit canvas context for graphics
|
||||||
|
class GFXcanvas16 : public Adafruit_GFX {
|
||||||
|
public:
|
||||||
|
GFXcanvas16(uint16_t w, uint16_t h);
|
||||||
|
~GFXcanvas16(void);
|
||||||
|
void drawPixel(int16_t x, int16_t y, uint16_t color);
|
||||||
|
void fillScreen(uint16_t color);
|
||||||
|
void byteSwap(void);
|
||||||
|
void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
|
||||||
|
void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
|
||||||
|
uint16_t getPixel(int16_t x, int16_t y) const;
|
||||||
|
/**********************************************************************/
|
||||||
|
/*!
|
||||||
|
@brief Get a pointer to the internal buffer memory
|
||||||
|
@returns A pointer to the allocated buffer
|
||||||
|
*/
|
||||||
|
/**********************************************************************/
|
||||||
|
uint16_t *getBuffer(void) const { return buffer; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
uint16_t getRawPixel(int16_t x, int16_t y) const;
|
||||||
|
void drawFastRawVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
|
||||||
|
void drawFastRawHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
|
||||||
|
uint16_t *buffer; ///< Raster data: no longer private, allow subclass access
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // _ADAFRUIT_GFX_H
|
||||||
422
libraries/Adafruit_GFX_Library/Adafruit_GrayOLED.cpp
Normal file
422
libraries/Adafruit_GFX_Library/Adafruit_GrayOLED.cpp
Normal file
@@ -0,0 +1,422 @@
|
|||||||
|
/*!
|
||||||
|
* @file Adafruit_GrayOLED.cpp
|
||||||
|
*
|
||||||
|
* This is documentation for Adafruit's generic library for grayscale
|
||||||
|
* OLED displays: http://www.adafruit.com/category/63_98
|
||||||
|
*
|
||||||
|
* These displays use I2C or SPI to communicate. I2C requires 2 pins
|
||||||
|
* (SCL+SDA) and optionally a RESET pin. SPI requires 4 pins (MOSI, SCK,
|
||||||
|
* select, data/command) and optionally a reset pin. Hardware SPI or
|
||||||
|
* 'bitbang' software SPI are both supported.
|
||||||
|
*
|
||||||
|
* Adafruit invests time and resources providing this open source code,
|
||||||
|
* please support Adafruit and open-source hardware by purchasing
|
||||||
|
* products from Adafruit!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Not for ATtiny, at all
|
||||||
|
#if !defined(__AVR_ATtiny85__) && !defined(__AVR_ATtiny84__)
|
||||||
|
|
||||||
|
#include "Adafruit_GrayOLED.h"
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
|
||||||
|
// SOME DEFINES AND STATIC VARIABLES USED INTERNALLY -----------------------
|
||||||
|
|
||||||
|
#define grayoled_swap(a, b) \
|
||||||
|
(((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b))) ///< No-temp-var swap operation
|
||||||
|
|
||||||
|
// CONSTRUCTORS, DESTRUCTOR ------------------------------------------------
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief Constructor for I2C-interfaced OLED displays.
|
||||||
|
@param bpp Bits per pixel, 1 for monochrome, 4 for 16-gray
|
||||||
|
@param w
|
||||||
|
Display width in pixels
|
||||||
|
@param h
|
||||||
|
Display height in pixels
|
||||||
|
@param twi
|
||||||
|
Pointer to an existing TwoWire instance (e.g. &Wire, the
|
||||||
|
microcontroller's primary I2C bus).
|
||||||
|
@param rst_pin
|
||||||
|
Reset pin (using Arduino pin numbering), or -1 if not used
|
||||||
|
(some displays might be wired to share the microcontroller's
|
||||||
|
reset pin).
|
||||||
|
@param clkDuring
|
||||||
|
Speed (in Hz) for Wire transmissions in library calls.
|
||||||
|
Defaults to 400000 (400 KHz), a known 'safe' value for most
|
||||||
|
microcontrollers, and meets the OLED datasheet spec.
|
||||||
|
Some systems can operate I2C faster (800 KHz for ESP32, 1 MHz
|
||||||
|
for many other 32-bit MCUs), and some (perhaps not all)
|
||||||
|
Many OLED's can work with this -- so it's optionally be specified
|
||||||
|
here and is not a default behavior. (Ignored if using pre-1.5.7
|
||||||
|
Arduino software, which operates I2C at a fixed 100 KHz.)
|
||||||
|
@param clkAfter
|
||||||
|
Speed (in Hz) for Wire transmissions following library
|
||||||
|
calls. Defaults to 100000 (100 KHz), the default Arduino Wire
|
||||||
|
speed. This is done rather than leaving it at the 'during' speed
|
||||||
|
because other devices on the I2C bus might not be compatible
|
||||||
|
with the faster rate. (Ignored if using pre-1.5.7 Arduino
|
||||||
|
software, which operates I2C at a fixed 100 KHz.)
|
||||||
|
@note Call the object's begin() function before use -- buffer
|
||||||
|
allocation is performed there!
|
||||||
|
*/
|
||||||
|
Adafruit_GrayOLED::Adafruit_GrayOLED(uint8_t bpp, uint16_t w, uint16_t h,
|
||||||
|
TwoWire *twi, int8_t rst_pin,
|
||||||
|
uint32_t clkDuring, uint32_t clkAfter)
|
||||||
|
: Adafruit_GFX(w, h), i2c_preclk(clkDuring), i2c_postclk(clkAfter),
|
||||||
|
buffer(NULL), dcPin(-1), csPin(-1), rstPin(rst_pin), _bpp(bpp) {
|
||||||
|
i2c_dev = NULL;
|
||||||
|
_theWire = twi;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief Constructor for SPI GrayOLED displays, using software (bitbang)
|
||||||
|
SPI.
|
||||||
|
@param bpp Bits per pixel, 1 for monochrome, 4 for 16-gray
|
||||||
|
@param w
|
||||||
|
Display width in pixels
|
||||||
|
@param h
|
||||||
|
Display height in pixels
|
||||||
|
@param mosi_pin
|
||||||
|
MOSI (master out, slave in) pin (using Arduino pin numbering).
|
||||||
|
This transfers serial data from microcontroller to display.
|
||||||
|
@param sclk_pin
|
||||||
|
SCLK (serial clock) pin (using Arduino pin numbering).
|
||||||
|
This clocks each bit from MOSI.
|
||||||
|
@param dc_pin
|
||||||
|
Data/command pin (using Arduino pin numbering), selects whether
|
||||||
|
display is receiving commands (low) or data (high).
|
||||||
|
@param rst_pin
|
||||||
|
Reset pin (using Arduino pin numbering), or -1 if not used
|
||||||
|
(some displays might be wired to share the microcontroller's
|
||||||
|
reset pin).
|
||||||
|
@param cs_pin
|
||||||
|
Chip-select pin (using Arduino pin numbering) for sharing the
|
||||||
|
bus with other devices. Active low.
|
||||||
|
@note Call the object's begin() function before use -- buffer
|
||||||
|
allocation is performed there!
|
||||||
|
*/
|
||||||
|
Adafruit_GrayOLED::Adafruit_GrayOLED(uint8_t bpp, uint16_t w, uint16_t h,
|
||||||
|
int8_t mosi_pin, int8_t sclk_pin,
|
||||||
|
int8_t dc_pin, int8_t rst_pin,
|
||||||
|
int8_t cs_pin)
|
||||||
|
: Adafruit_GFX(w, h), dcPin(dc_pin), csPin(cs_pin), rstPin(rst_pin),
|
||||||
|
_bpp(bpp) {
|
||||||
|
|
||||||
|
spi_dev = new Adafruit_SPIDevice(cs_pin, sclk_pin, -1, mosi_pin, 1000000);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief Constructor for SPI GrayOLED displays, using native hardware SPI.
|
||||||
|
@param bpp Bits per pixel, 1 for monochrome, 4 for 16-gray
|
||||||
|
@param w
|
||||||
|
Display width in pixels
|
||||||
|
@param h
|
||||||
|
Display height in pixels
|
||||||
|
@param spi
|
||||||
|
Pointer to an existing SPIClass instance (e.g. &SPI, the
|
||||||
|
microcontroller's primary SPI bus).
|
||||||
|
@param dc_pin
|
||||||
|
Data/command pin (using Arduino pin numbering), selects whether
|
||||||
|
display is receiving commands (low) or data (high).
|
||||||
|
@param rst_pin
|
||||||
|
Reset pin (using Arduino pin numbering), or -1 if not used
|
||||||
|
(some displays might be wired to share the microcontroller's
|
||||||
|
reset pin).
|
||||||
|
@param cs_pin
|
||||||
|
Chip-select pin (using Arduino pin numbering) for sharing the
|
||||||
|
bus with other devices. Active low.
|
||||||
|
@param bitrate
|
||||||
|
SPI clock rate for transfers to this display. Default if
|
||||||
|
unspecified is 8000000UL (8 MHz).
|
||||||
|
@note Call the object's begin() function before use -- buffer
|
||||||
|
allocation is performed there!
|
||||||
|
*/
|
||||||
|
Adafruit_GrayOLED::Adafruit_GrayOLED(uint8_t bpp, uint16_t w, uint16_t h,
|
||||||
|
SPIClass *spi, int8_t dc_pin,
|
||||||
|
int8_t rst_pin, int8_t cs_pin,
|
||||||
|
uint32_t bitrate)
|
||||||
|
: Adafruit_GFX(w, h), dcPin(dc_pin), csPin(cs_pin), rstPin(rst_pin),
|
||||||
|
_bpp(bpp) {
|
||||||
|
|
||||||
|
spi_dev = new Adafruit_SPIDevice(cs_pin, bitrate, SPI_BITORDER_MSBFIRST,
|
||||||
|
SPI_MODE0, spi);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief Destructor for Adafruit_GrayOLED object.
|
||||||
|
*/
|
||||||
|
Adafruit_GrayOLED::~Adafruit_GrayOLED(void) {
|
||||||
|
if (buffer) {
|
||||||
|
free(buffer);
|
||||||
|
buffer = NULL;
|
||||||
|
}
|
||||||
|
if (spi_dev)
|
||||||
|
delete spi_dev;
|
||||||
|
if (i2c_dev)
|
||||||
|
delete i2c_dev;
|
||||||
|
}
|
||||||
|
|
||||||
|
// LOW-LEVEL UTILS ---------------------------------------------------------
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief Issue single command byte to OLED, using I2C or hard/soft SPI as
|
||||||
|
needed.
|
||||||
|
@param c The single byte command
|
||||||
|
*/
|
||||||
|
void Adafruit_GrayOLED::oled_command(uint8_t c) {
|
||||||
|
if (i2c_dev) { // I2C
|
||||||
|
uint8_t buf[2] = {0x00, c}; // Co = 0, D/C = 0
|
||||||
|
i2c_dev->write(buf, 2);
|
||||||
|
} else { // SPI (hw or soft) -- transaction started in calling function
|
||||||
|
digitalWrite(dcPin, LOW);
|
||||||
|
spi_dev->write(&c, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Issue list of commands to GrayOLED
|
||||||
|
/*!
|
||||||
|
@brief Issue multiple bytes of commands OLED, using I2C or hard/soft SPI as
|
||||||
|
needed.
|
||||||
|
@param c Pointer to the command array
|
||||||
|
@param n The number of bytes in the command array
|
||||||
|
@returns True for success on ability to write the data in I2C.
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool Adafruit_GrayOLED::oled_commandList(const uint8_t *c, uint8_t n) {
|
||||||
|
if (i2c_dev) { // I2C
|
||||||
|
uint8_t dc_byte = 0x00; // Co = 0, D/C = 0
|
||||||
|
if (!i2c_dev->write((uint8_t *)c, n, true, &dc_byte, 1)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else { // SPI -- transaction started in calling function
|
||||||
|
digitalWrite(dcPin, LOW);
|
||||||
|
if (!spi_dev->write((uint8_t *)c, n)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ALLOCATE & INIT DISPLAY -------------------------------------------------
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief Allocate RAM for image buffer, initialize peripherals and pins.
|
||||||
|
Note that subclasses must call this before other begin() init
|
||||||
|
@param addr
|
||||||
|
I2C address of corresponding oled display.
|
||||||
|
SPI displays (hardware or software) do not use addresses, but
|
||||||
|
this argument is still required. Default if unspecified is 0x3C.
|
||||||
|
@param reset
|
||||||
|
If true, and if the reset pin passed to the constructor is
|
||||||
|
valid, a hard reset will be performed before initializing the
|
||||||
|
display. If using multiple oled displays on the same bus, and
|
||||||
|
if they all share the same reset pin, you should only pass true
|
||||||
|
on the first display being initialized, false on all others,
|
||||||
|
else the already-initialized displays would be reset. Default if
|
||||||
|
unspecified is true.
|
||||||
|
@return true on successful allocation/init, false otherwise.
|
||||||
|
Well-behaved code should check the return value before
|
||||||
|
proceeding.
|
||||||
|
@note MUST call this function before any drawing or updates!
|
||||||
|
*/
|
||||||
|
bool Adafruit_GrayOLED::_init(uint8_t addr, bool reset) {
|
||||||
|
|
||||||
|
// attempt to malloc the bitmap framebuffer
|
||||||
|
if ((!buffer) &&
|
||||||
|
!(buffer = (uint8_t *)malloc(_bpp * WIDTH * ((HEIGHT + 7) / 8)))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset OLED if requested and reset pin specified in constructor
|
||||||
|
if (reset && (rstPin >= 0)) {
|
||||||
|
pinMode(rstPin, OUTPUT);
|
||||||
|
digitalWrite(rstPin, HIGH);
|
||||||
|
delay(10); // VDD goes high at start, pause
|
||||||
|
digitalWrite(rstPin, LOW); // Bring reset low
|
||||||
|
delay(10); // Wait 10 ms
|
||||||
|
digitalWrite(rstPin, HIGH); // Bring out of reset
|
||||||
|
delay(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup pin directions
|
||||||
|
if (_theWire) { // using I2C
|
||||||
|
i2c_dev = new Adafruit_I2CDevice(addr, _theWire);
|
||||||
|
// look for i2c address:
|
||||||
|
if (!i2c_dev || !i2c_dev->begin()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else { // Using one of the SPI modes, either soft or hardware
|
||||||
|
if (!spi_dev || !spi_dev->begin()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
pinMode(dcPin, OUTPUT); // Set data/command pin as output
|
||||||
|
}
|
||||||
|
|
||||||
|
clearDisplay();
|
||||||
|
|
||||||
|
// set max dirty window
|
||||||
|
window_x1 = 0;
|
||||||
|
window_y1 = 0;
|
||||||
|
window_x2 = WIDTH - 1;
|
||||||
|
window_y2 = HEIGHT - 1;
|
||||||
|
|
||||||
|
return true; // Success
|
||||||
|
}
|
||||||
|
|
||||||
|
// DRAWING FUNCTIONS -------------------------------------------------------
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief Set/clear/invert a single pixel. This is also invoked by the
|
||||||
|
Adafruit_GFX library in generating many higher-level graphics
|
||||||
|
primitives.
|
||||||
|
@param x
|
||||||
|
Column of display -- 0 at left to (screen width - 1) at right.
|
||||||
|
@param y
|
||||||
|
Row of display -- 0 at top to (screen height -1) at bottom.
|
||||||
|
@param color
|
||||||
|
Pixel color, one of: MONOOLED_BLACK, MONOOLED_WHITE or
|
||||||
|
MONOOLED_INVERT.
|
||||||
|
@note Changes buffer contents only, no immediate effect on display.
|
||||||
|
Follow up with a call to display(), or with other graphics
|
||||||
|
commands as needed by one's own application.
|
||||||
|
*/
|
||||||
|
void Adafruit_GrayOLED::drawPixel(int16_t x, int16_t y, uint16_t color) {
|
||||||
|
if ((x >= 0) && (x < width()) && (y >= 0) && (y < height())) {
|
||||||
|
// Pixel is in-bounds. Rotate coordinates if needed.
|
||||||
|
switch (getRotation()) {
|
||||||
|
case 1:
|
||||||
|
grayoled_swap(x, y);
|
||||||
|
x = WIDTH - x - 1;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
x = WIDTH - x - 1;
|
||||||
|
y = HEIGHT - y - 1;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
grayoled_swap(x, y);
|
||||||
|
y = HEIGHT - y - 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// adjust dirty window
|
||||||
|
window_x1 = min(window_x1, x);
|
||||||
|
window_y1 = min(window_y1, y);
|
||||||
|
window_x2 = max(window_x2, x);
|
||||||
|
window_y2 = max(window_y2, y);
|
||||||
|
|
||||||
|
if (_bpp == 1) {
|
||||||
|
switch (color) {
|
||||||
|
case MONOOLED_WHITE:
|
||||||
|
buffer[x + (y / 8) * WIDTH] |= (1 << (y & 7));
|
||||||
|
break;
|
||||||
|
case MONOOLED_BLACK:
|
||||||
|
buffer[x + (y / 8) * WIDTH] &= ~(1 << (y & 7));
|
||||||
|
break;
|
||||||
|
case MONOOLED_INVERSE:
|
||||||
|
buffer[x + (y / 8) * WIDTH] ^= (1 << (y & 7));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_bpp == 4) {
|
||||||
|
uint8_t *pixelptr = &buffer[x / 2 + (y * WIDTH / 2)];
|
||||||
|
// Serial.printf("(%d, %d) -> offset %d\n", x, y, x/2 + (y * WIDTH / 2));
|
||||||
|
if (x % 2 == 0) { // even, left nibble
|
||||||
|
uint8_t t = pixelptr[0] & 0x0F;
|
||||||
|
t |= (color & 0xF) << 4;
|
||||||
|
pixelptr[0] = t;
|
||||||
|
} else { // odd, right lower nibble
|
||||||
|
uint8_t t = pixelptr[0] & 0xF0;
|
||||||
|
t |= color & 0xF;
|
||||||
|
pixelptr[0] = t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief Clear contents of display buffer (set all pixels to off).
|
||||||
|
@note Changes buffer contents only, no immediate effect on display.
|
||||||
|
Follow up with a call to display(), or with other graphics
|
||||||
|
commands as needed by one's own application.
|
||||||
|
*/
|
||||||
|
void Adafruit_GrayOLED::clearDisplay(void) {
|
||||||
|
memset(buffer, 0, _bpp * WIDTH * ((HEIGHT + 7) / 8));
|
||||||
|
// set max dirty window
|
||||||
|
window_x1 = 0;
|
||||||
|
window_y1 = 0;
|
||||||
|
window_x2 = WIDTH - 1;
|
||||||
|
window_y2 = HEIGHT - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief Return color of a single pixel in display buffer.
|
||||||
|
@param x
|
||||||
|
Column of display -- 0 at left to (screen width - 1) at right.
|
||||||
|
@param y
|
||||||
|
Row of display -- 0 at top to (screen height -1) at bottom.
|
||||||
|
@return true if pixel is set (usually MONOOLED_WHITE, unless display invert
|
||||||
|
mode is enabled), false if clear (MONOOLED_BLACK).
|
||||||
|
@note Reads from buffer contents; may not reflect current contents of
|
||||||
|
screen if display() has not been called.
|
||||||
|
*/
|
||||||
|
bool Adafruit_GrayOLED::getPixel(int16_t x, int16_t y) {
|
||||||
|
if ((x >= 0) && (x < width()) && (y >= 0) && (y < height())) {
|
||||||
|
// Pixel is in-bounds. Rotate coordinates if needed.
|
||||||
|
switch (getRotation()) {
|
||||||
|
case 1:
|
||||||
|
grayoled_swap(x, y);
|
||||||
|
x = WIDTH - x - 1;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
x = WIDTH - x - 1;
|
||||||
|
y = HEIGHT - y - 1;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
grayoled_swap(x, y);
|
||||||
|
y = HEIGHT - y - 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return (buffer[x + (y / 8) * WIDTH] & (1 << (y & 7)));
|
||||||
|
}
|
||||||
|
return false; // Pixel out of bounds
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief Get base address of display buffer for direct reading or writing.
|
||||||
|
@return Pointer to an unsigned 8-bit array, column-major, columns padded
|
||||||
|
to full byte boundary if needed.
|
||||||
|
*/
|
||||||
|
uint8_t *Adafruit_GrayOLED::getBuffer(void) { return buffer; }
|
||||||
|
|
||||||
|
// OTHER HARDWARE SETTINGS -------------------------------------------------
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief Enable or disable display invert mode (white-on-black vs
|
||||||
|
black-on-white). Handy for testing!
|
||||||
|
@param i
|
||||||
|
If true, switch to invert mode (black-on-white), else normal
|
||||||
|
mode (white-on-black).
|
||||||
|
@note This has an immediate effect on the display, no need to call the
|
||||||
|
display() function -- buffer contents are not changed, rather a
|
||||||
|
different pixel mode of the display hardware is used. When
|
||||||
|
enabled, drawing MONOOLED_BLACK (value 0) pixels will actually draw
|
||||||
|
white, MONOOLED_WHITE (value 1) will draw black.
|
||||||
|
*/
|
||||||
|
void Adafruit_GrayOLED::invertDisplay(bool i) {
|
||||||
|
oled_command(i ? GRAYOLED_INVERTDISPLAY : GRAYOLED_NORMALDISPLAY);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief Adjust the display contrast.
|
||||||
|
@param level The contrast level from 0 to 0x7F
|
||||||
|
@note This has an immediate effect on the display, no need to call the
|
||||||
|
display() function -- buffer contents are not changed.
|
||||||
|
*/
|
||||||
|
void Adafruit_GrayOLED::setContrast(uint8_t level) {
|
||||||
|
uint8_t cmd[] = {GRAYOLED_SETCONTRAST, level};
|
||||||
|
oled_commandList(cmd, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ATTIN85 not supported */
|
||||||
101
libraries/Adafruit_GFX_Library/Adafruit_GrayOLED.h
Normal file
101
libraries/Adafruit_GFX_Library/Adafruit_GrayOLED.h
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
/*!
|
||||||
|
* @file Adafruit_GrayOLED.h
|
||||||
|
*
|
||||||
|
* This is part of for Adafruit's GFX library, supplying generic support
|
||||||
|
* for grayscale OLED displays: http://www.adafruit.com/category/63_98
|
||||||
|
*
|
||||||
|
* These displays use I2C or SPI to communicate. I2C requires 2 pins
|
||||||
|
* (SCL+SDA) and optionally a RESET pin. SPI requires 4 pins (MOSI, SCK,
|
||||||
|
* select, data/command) and optionally a reset pin. Hardware SPI or
|
||||||
|
* 'bitbang' software SPI are both supported.
|
||||||
|
*
|
||||||
|
* Adafruit invests time and resources providing this open source code,
|
||||||
|
* please support Adafruit and open-source hardware by purchasing
|
||||||
|
* products from Adafruit!
|
||||||
|
*
|
||||||
|
* Written by Limor Fried/Ladyada for Adafruit Industries, with
|
||||||
|
* contributions from the open source community.
|
||||||
|
*
|
||||||
|
* BSD license, all text above, and the splash screen header file,
|
||||||
|
* must be included in any redistribution.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _Adafruit_GRAYOLED_H_
|
||||||
|
#define _Adafruit_GRAYOLED_H_
|
||||||
|
|
||||||
|
// Not for ATtiny, at all
|
||||||
|
#if !defined(__AVR_ATtiny85__) && !defined(__AVR_ATtiny84__)
|
||||||
|
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <Adafruit_I2CDevice.h>
|
||||||
|
#include <Adafruit_SPIDevice.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
|
||||||
|
#define GRAYOLED_SETCONTRAST 0x81 ///< Generic contrast for almost all OLEDs
|
||||||
|
#define GRAYOLED_NORMALDISPLAY 0xA6 ///< Generic non-invert for almost all OLEDs
|
||||||
|
#define GRAYOLED_INVERTDISPLAY 0xA7 ///< Generic invert for almost all OLEDs
|
||||||
|
|
||||||
|
#define MONOOLED_BLACK 0 ///< Default black 'color' for monochrome OLEDS
|
||||||
|
#define MONOOLED_WHITE 1 ///< Default white 'color' for monochrome OLEDS
|
||||||
|
#define MONOOLED_INVERSE 2 ///< Default inversion command for monochrome OLEDS
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief Class that stores state and functions for interacting with
|
||||||
|
generic grayscale OLED displays.
|
||||||
|
*/
|
||||||
|
class Adafruit_GrayOLED : public Adafruit_GFX {
|
||||||
|
public:
|
||||||
|
Adafruit_GrayOLED(uint8_t bpp, uint16_t w, uint16_t h, TwoWire *twi = &Wire,
|
||||||
|
int8_t rst_pin = -1, uint32_t preclk = 400000,
|
||||||
|
uint32_t postclk = 100000);
|
||||||
|
Adafruit_GrayOLED(uint8_t bpp, uint16_t w, uint16_t h, int8_t mosi_pin,
|
||||||
|
int8_t sclk_pin, int8_t dc_pin, int8_t rst_pin,
|
||||||
|
int8_t cs_pin);
|
||||||
|
Adafruit_GrayOLED(uint8_t bpp, uint16_t w, uint16_t h, SPIClass *spi,
|
||||||
|
int8_t dc_pin, int8_t rst_pin, int8_t cs_pin,
|
||||||
|
uint32_t bitrate = 8000000UL);
|
||||||
|
|
||||||
|
~Adafruit_GrayOLED(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief The function that sub-classes define that writes out the buffer to
|
||||||
|
the display over I2C or SPI
|
||||||
|
**/
|
||||||
|
virtual void display(void) = 0;
|
||||||
|
void clearDisplay(void);
|
||||||
|
void invertDisplay(bool i);
|
||||||
|
void setContrast(uint8_t contrastlevel);
|
||||||
|
void drawPixel(int16_t x, int16_t y, uint16_t color);
|
||||||
|
bool getPixel(int16_t x, int16_t y);
|
||||||
|
uint8_t *getBuffer(void);
|
||||||
|
|
||||||
|
void oled_command(uint8_t c);
|
||||||
|
bool oled_commandList(const uint8_t *c, uint8_t n);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool _init(uint8_t i2caddr = 0x3C, bool reset = true);
|
||||||
|
|
||||||
|
Adafruit_SPIDevice *spi_dev = NULL; ///< The SPI interface BusIO device
|
||||||
|
Adafruit_I2CDevice *i2c_dev = NULL; ///< The I2C interface BusIO device
|
||||||
|
int32_t i2c_preclk = 400000, ///< Configurable 'high speed' I2C rate
|
||||||
|
i2c_postclk = 100000; ///< Configurable 'low speed' I2C rate
|
||||||
|
uint8_t *buffer = NULL; ///< Internal 1:1 framebuffer of display mem
|
||||||
|
|
||||||
|
int16_t window_x1, ///< Dirty tracking window minimum x
|
||||||
|
window_y1, ///< Dirty tracking window minimum y
|
||||||
|
window_x2, ///< Dirty tracking window maximum x
|
||||||
|
window_y2; ///< Dirty tracking window maximum y
|
||||||
|
|
||||||
|
int dcPin, ///< The Arduino pin connected to D/C (for SPI)
|
||||||
|
csPin, ///< The Arduino pin connected to CS (for SPI)
|
||||||
|
rstPin; ///< The Arduino pin connected to reset (-1 if unused)
|
||||||
|
|
||||||
|
uint8_t _bpp = 1; ///< Bits per pixel color for this display
|
||||||
|
private:
|
||||||
|
TwoWire *_theWire = NULL; ///< The underlying hardware I2C
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // end __AVR_ATtiny85__ __AVR_ATtiny84__
|
||||||
|
#endif // _Adafruit_GrayOLED_H_
|
||||||
2562
libraries/Adafruit_GFX_Library/Adafruit_SPITFT.cpp
Normal file
2562
libraries/Adafruit_GFX_Library/Adafruit_SPITFT.cpp
Normal file
File diff suppressed because it is too large
Load Diff
531
libraries/Adafruit_GFX_Library/Adafruit_SPITFT.h
Normal file
531
libraries/Adafruit_GFX_Library/Adafruit_SPITFT.h
Normal file
@@ -0,0 +1,531 @@
|
|||||||
|
/*!
|
||||||
|
* @file Adafruit_SPITFT.h
|
||||||
|
*
|
||||||
|
* Part of Adafruit's GFX graphics library. Originally this class was
|
||||||
|
* written to handle a range of color TFT displays connected via SPI,
|
||||||
|
* but over time this library and some display-specific subclasses have
|
||||||
|
* mutated to include some color OLEDs as well as parallel-interfaced
|
||||||
|
* displays. The name's been kept for the sake of older code.
|
||||||
|
*
|
||||||
|
* Adafruit invests time and resources providing this open source code,
|
||||||
|
* please support Adafruit and open-source hardware by purchasing
|
||||||
|
* products from Adafruit!
|
||||||
|
*
|
||||||
|
* Written by Limor "ladyada" Fried for Adafruit Industries,
|
||||||
|
* with contributions from the open source community.
|
||||||
|
*
|
||||||
|
* BSD license, all text here must be included in any redistribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ADAFRUIT_SPITFT_H_
|
||||||
|
#define _ADAFRUIT_SPITFT_H_
|
||||||
|
|
||||||
|
// Not for ATtiny, at all
|
||||||
|
#if !defined(__AVR_ATtiny85__) && !defined(__AVR_ATtiny84__)
|
||||||
|
|
||||||
|
#include "Adafruit_GFX.h"
|
||||||
|
#include <SPI.h>
|
||||||
|
|
||||||
|
// HARDWARE CONFIG ---------------------------------------------------------
|
||||||
|
|
||||||
|
#if defined(__AVR__)
|
||||||
|
typedef uint8_t ADAGFX_PORT_t; ///< PORT values are 8-bit
|
||||||
|
#define USE_FAST_PINIO ///< Use direct PORT register access
|
||||||
|
#elif defined(ARDUINO_STM32_FEATHER) // WICED
|
||||||
|
typedef class HardwareSPI SPIClass; ///< SPI is a bit odd on WICED
|
||||||
|
typedef uint32_t ADAGFX_PORT_t; ///< PORT values are 32-bit
|
||||||
|
#elif defined(__arm__)
|
||||||
|
#if defined(ARDUINO_ARCH_SAMD)
|
||||||
|
// Adafruit M0, M4
|
||||||
|
typedef uint32_t ADAGFX_PORT_t; ///< PORT values are 32-bit
|
||||||
|
#define USE_FAST_PINIO ///< Use direct PORT register access
|
||||||
|
#define HAS_PORT_SET_CLR ///< PORTs have set & clear registers
|
||||||
|
#elif defined(CORE_TEENSY)
|
||||||
|
// PJRC Teensy 4.x
|
||||||
|
#if defined(__IMXRT1052__) || defined(__IMXRT1062__) // Teensy 4.x
|
||||||
|
typedef uint32_t ADAGFX_PORT_t; ///< PORT values are 32-bit
|
||||||
|
// PJRC Teensy 3.x
|
||||||
|
#else
|
||||||
|
typedef uint8_t ADAGFX_PORT_t; ///< PORT values are 8-bit
|
||||||
|
#endif
|
||||||
|
#define USE_FAST_PINIO ///< Use direct PORT register access
|
||||||
|
#define HAS_PORT_SET_CLR ///< PORTs have set & clear registers
|
||||||
|
#else
|
||||||
|
// Arduino Due?
|
||||||
|
typedef uint32_t ADAGFX_PORT_t; ///< PORT values are 32-bit
|
||||||
|
// USE_FAST_PINIO not available here (yet)...Due has a totally different
|
||||||
|
// GPIO register set and will require some changes elsewhere (e.g. in
|
||||||
|
// constructors especially).
|
||||||
|
#endif
|
||||||
|
#else // !ARM
|
||||||
|
// Probably ESP8266 or ESP32. USE_FAST_PINIO is not available here (yet)
|
||||||
|
// but don't worry about it too much...the digitalWrite() implementation
|
||||||
|
// on these platforms is reasonably efficient and already RAM-resident,
|
||||||
|
// only gotcha then is no parallel connection support for now.
|
||||||
|
typedef uint32_t ADAGFX_PORT_t; ///< PORT values are 32-bit
|
||||||
|
#endif // end !ARM
|
||||||
|
typedef volatile ADAGFX_PORT_t *PORTreg_t; ///< PORT register type
|
||||||
|
|
||||||
|
#if defined(__AVR__)
|
||||||
|
#define DEFAULT_SPI_FREQ 8000000L ///< Hardware SPI default speed
|
||||||
|
#else
|
||||||
|
#define DEFAULT_SPI_FREQ 16000000L ///< Hardware SPI default speed
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ADAFRUIT_PYPORTAL) || defined(ADAFRUIT_PYPORTAL_M4_TITANO) || \
|
||||||
|
defined(ADAFRUIT_PYBADGE_M4_EXPRESS) || \
|
||||||
|
defined(ADAFRUIT_PYGAMER_M4_EXPRESS) || \
|
||||||
|
defined(ADAFRUIT_MONSTER_M4SK_EXPRESS) || defined(NRF52_SERIES) || \
|
||||||
|
defined(ADAFRUIT_CIRCUITPLAYGROUND_M0)
|
||||||
|
#define USE_SPI_DMA ///< Auto DMA
|
||||||
|
#else
|
||||||
|
//#define USE_SPI_DMA ///< If set,
|
||||||
|
// use DMA if available
|
||||||
|
#endif
|
||||||
|
// Another "oops" name -- this now also handles parallel DMA.
|
||||||
|
// If DMA is enabled, Arduino sketch MUST #include <Adafruit_ZeroDMA.h>
|
||||||
|
// Estimated RAM usage:
|
||||||
|
// 4 bytes/pixel on display major axis + 8 bytes/pixel on minor axis,
|
||||||
|
// e.g. 320x240 pixels = 320 * 4 + 240 * 8 = 3,200 bytes.
|
||||||
|
|
||||||
|
#if defined(USE_SPI_DMA) && (defined(__SAMD51__) || defined(ARDUINO_SAMD_ZERO))
|
||||||
|
#include <Adafruit_ZeroDMA.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// This is kind of a kludge. Needed a way to disambiguate the software SPI
|
||||||
|
// and parallel constructors via their argument lists. Originally tried a
|
||||||
|
// bool as the first argument to the parallel constructor (specifying 8-bit
|
||||||
|
// vs 16-bit interface) but the compiler regards this as equivalent to an
|
||||||
|
// integer and thus still ambiguous. SO...the parallel constructor requires
|
||||||
|
// an enumerated type as the first argument: tft8 (for 8-bit parallel) or
|
||||||
|
// tft16 (for 16-bit)...even though 16-bit isn't fully implemented or tested
|
||||||
|
// and might never be, still needed that disambiguation from soft SPI.
|
||||||
|
/*! For first arg to parallel constructor */
|
||||||
|
enum tftBusWidth { tft8bitbus, tft16bitbus };
|
||||||
|
|
||||||
|
// CLASS DEFINITION --------------------------------------------------------
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief Adafruit_SPITFT is an intermediary class between Adafruit_GFX
|
||||||
|
and various hardware-specific subclasses for different displays.
|
||||||
|
It handles certain operations that are common to a range of
|
||||||
|
displays (address window, area fills, etc.). Originally these were
|
||||||
|
all color TFT displays interfaced via SPI, but it's since expanded
|
||||||
|
to include color OLEDs and parallel-interfaced TFTs. THE NAME HAS
|
||||||
|
BEEN KEPT TO AVOID BREAKING A LOT OF SUBCLASSES AND EXAMPLE CODE.
|
||||||
|
Many of the class member functions similarly live on with names
|
||||||
|
that don't necessarily accurately describe what they're doing,
|
||||||
|
again to avoid breaking a lot of other code. If in doubt, read
|
||||||
|
the comments.
|
||||||
|
*/
|
||||||
|
class Adafruit_SPITFT : public Adafruit_GFX {
|
||||||
|
|
||||||
|
public:
|
||||||
|
// CONSTRUCTORS --------------------------------------------------------
|
||||||
|
|
||||||
|
// Software SPI constructor: expects width & height (at default rotation
|
||||||
|
// setting 0), 4 signal pins (cs, dc, mosi, sclk), 2 optional pins
|
||||||
|
// (reset, miso). cs argument is required but can be -1 if unused --
|
||||||
|
// rather than moving it to the optional arguments, it was done this way
|
||||||
|
// to avoid breaking existing code (-1 option was a later addition).
|
||||||
|
Adafruit_SPITFT(uint16_t w, uint16_t h, int8_t cs, int8_t dc, int8_t mosi,
|
||||||
|
int8_t sck, int8_t rst = -1, int8_t miso = -1);
|
||||||
|
|
||||||
|
// Hardware SPI constructor using the default SPI port: expects width &
|
||||||
|
// height (at default rotation setting 0), 2 signal pins (cs, dc),
|
||||||
|
// optional reset pin. cs is required but can be -1 if unused -- rather
|
||||||
|
// than moving it to the optional arguments, it was done this way to
|
||||||
|
// avoid breaking existing code (-1 option was a later addition).
|
||||||
|
Adafruit_SPITFT(uint16_t w, uint16_t h, int8_t cs, int8_t dc,
|
||||||
|
int8_t rst = -1);
|
||||||
|
|
||||||
|
#if !defined(ESP8266) // See notes in .cpp
|
||||||
|
// Hardware SPI constructor using an arbitrary SPI peripheral: expects
|
||||||
|
// width & height (rotation 0), SPIClass pointer, 2 signal pins (cs, dc)
|
||||||
|
// and optional reset pin. cs is required but can be -1 if unused.
|
||||||
|
Adafruit_SPITFT(uint16_t w, uint16_t h, SPIClass *spiClass, int8_t cs,
|
||||||
|
int8_t dc, int8_t rst = -1);
|
||||||
|
#endif // end !ESP8266
|
||||||
|
|
||||||
|
// Parallel constructor: expects width & height (rotation 0), flag
|
||||||
|
// indicating whether 16-bit (true) or 8-bit (false) interface, 3 signal
|
||||||
|
// pins (d0, wr, dc), 3 optional pins (cs, rst, rd). 16-bit parallel
|
||||||
|
// isn't even fully implemented but the 'wide' flag was added as a
|
||||||
|
// required argument to avoid ambiguity with other constructors.
|
||||||
|
Adafruit_SPITFT(uint16_t w, uint16_t h, tftBusWidth busWidth, int8_t d0,
|
||||||
|
int8_t wr, int8_t dc, int8_t cs = -1, int8_t rst = -1,
|
||||||
|
int8_t rd = -1);
|
||||||
|
|
||||||
|
// DESTRUCTOR ----------------------------------------------------------
|
||||||
|
|
||||||
|
~Adafruit_SPITFT(){};
|
||||||
|
|
||||||
|
// CLASS MEMBER FUNCTIONS ----------------------------------------------
|
||||||
|
|
||||||
|
// These first two functions MUST be declared by subclasses:
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief Display-specific initialization function.
|
||||||
|
@param freq SPI frequency, in hz (or 0 for default or unused).
|
||||||
|
*/
|
||||||
|
virtual void begin(uint32_t freq) = 0;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief Set up the specific display hardware's "address window"
|
||||||
|
for subsequent pixel-pushing operations.
|
||||||
|
@param x Leftmost pixel of area to be drawn (MUST be within
|
||||||
|
display bounds at current rotation setting).
|
||||||
|
@param y Topmost pixel of area to be drawn (MUST be within
|
||||||
|
display bounds at current rotation setting).
|
||||||
|
@param w Width of area to be drawn, in pixels (MUST be >0 and,
|
||||||
|
added to x, within display bounds at current rotation).
|
||||||
|
@param h Height of area to be drawn, in pixels (MUST be >0 and,
|
||||||
|
added to x, within display bounds at current rotation).
|
||||||
|
*/
|
||||||
|
virtual void setAddrWindow(uint16_t x, uint16_t y, uint16_t w,
|
||||||
|
uint16_t h) = 0;
|
||||||
|
|
||||||
|
// Remaining functions do not need to be declared in subclasses
|
||||||
|
// unless they wish to provide hardware-specific optimizations.
|
||||||
|
// Brief comments here...documented more thoroughly in .cpp file.
|
||||||
|
|
||||||
|
// Subclass' begin() function invokes this to initialize hardware.
|
||||||
|
// freq=0 to use default SPI speed. spiMode must be one of the SPI_MODEn
|
||||||
|
// values defined in SPI.h, which are NOT the same as 0 for SPI_MODE0,
|
||||||
|
// 1 for SPI_MODE1, etc...use ONLY the SPI_MODEn defines! Only!
|
||||||
|
// Name is outdated (interface may be parallel) but for compatibility:
|
||||||
|
void initSPI(uint32_t freq = 0, uint8_t spiMode = SPI_MODE0);
|
||||||
|
void setSPISpeed(uint32_t freq);
|
||||||
|
// Chip select and/or hardware SPI transaction start as needed:
|
||||||
|
void startWrite(void);
|
||||||
|
// Chip deselect and/or hardware SPI transaction end as needed:
|
||||||
|
void endWrite(void);
|
||||||
|
void sendCommand(uint8_t commandByte, uint8_t *dataBytes,
|
||||||
|
uint8_t numDataBytes);
|
||||||
|
void sendCommand(uint8_t commandByte, const uint8_t *dataBytes = NULL,
|
||||||
|
uint8_t numDataBytes = 0);
|
||||||
|
void sendCommand16(uint16_t commandWord, const uint8_t *dataBytes = NULL,
|
||||||
|
uint8_t numDataBytes = 0);
|
||||||
|
uint8_t readcommand8(uint8_t commandByte, uint8_t index = 0);
|
||||||
|
uint16_t readcommand16(uint16_t addr);
|
||||||
|
|
||||||
|
// These functions require a chip-select and/or SPI transaction
|
||||||
|
// around them. Higher-level graphics primitives might start a
|
||||||
|
// single transaction and then make multiple calls to these functions
|
||||||
|
// (e.g. circle or text rendering might make repeated lines or rects)
|
||||||
|
// before ending the transaction. It's more efficient than starting a
|
||||||
|
// transaction every time.
|
||||||
|
void writePixel(int16_t x, int16_t y, uint16_t color);
|
||||||
|
void writePixels(uint16_t *colors, uint32_t len, bool block = true,
|
||||||
|
bool bigEndian = false);
|
||||||
|
void writeColor(uint16_t color, uint32_t len);
|
||||||
|
void writeFillRect(int16_t x, int16_t y, int16_t w, int16_t h,
|
||||||
|
uint16_t color);
|
||||||
|
void writeFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
|
||||||
|
void writeFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
|
||||||
|
// This is a new function, similar to writeFillRect() except that
|
||||||
|
// all arguments MUST be onscreen, sorted and clipped. If higher-level
|
||||||
|
// primitives can handle their own sorting/clipping, it avoids repeating
|
||||||
|
// such operations in the low-level code, making it potentially faster.
|
||||||
|
// CALLING THIS WITH UNCLIPPED OR NEGATIVE VALUES COULD BE DISASTROUS.
|
||||||
|
inline void writeFillRectPreclipped(int16_t x, int16_t y, int16_t w,
|
||||||
|
int16_t h, uint16_t color);
|
||||||
|
// Another new function, companion to the new non-blocking
|
||||||
|
// writePixels() variant.
|
||||||
|
void dmaWait(void);
|
||||||
|
// Used by writePixels() in some situations, but might have rare need in
|
||||||
|
// user code, so it's public...
|
||||||
|
bool dmaBusy(void) const; // true if DMA is used and busy, false otherwise
|
||||||
|
void swapBytes(uint16_t *src, uint32_t len, uint16_t *dest = NULL);
|
||||||
|
|
||||||
|
// These functions are similar to the 'write' functions above, but with
|
||||||
|
// a chip-select and/or SPI transaction built-in. They're typically used
|
||||||
|
// solo -- that is, as graphics primitives in themselves, not invoked by
|
||||||
|
// higher-level primitives (which should use the functions above).
|
||||||
|
void drawPixel(int16_t x, int16_t y, uint16_t color);
|
||||||
|
void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
|
||||||
|
void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
|
||||||
|
void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
|
||||||
|
// A single-pixel push encapsulated in a transaction. I don't think
|
||||||
|
// this is used anymore (BMP demos might've used it?) but is provided
|
||||||
|
// for backward compatibility, consider it deprecated:
|
||||||
|
void pushColor(uint16_t color);
|
||||||
|
|
||||||
|
using Adafruit_GFX::drawRGBBitmap; // Check base class first
|
||||||
|
void drawRGBBitmap(int16_t x, int16_t y, uint16_t *pcolors, int16_t w,
|
||||||
|
int16_t h);
|
||||||
|
|
||||||
|
void invertDisplay(bool i);
|
||||||
|
uint16_t color565(uint8_t r, uint8_t g, uint8_t b);
|
||||||
|
|
||||||
|
// Despite parallel additions, function names kept for compatibility:
|
||||||
|
void spiWrite(uint8_t b); // Write single byte as DATA
|
||||||
|
void writeCommand(uint8_t cmd); // Write single byte as COMMAND
|
||||||
|
uint8_t spiRead(void); // Read single byte of data
|
||||||
|
void write16(uint16_t w); // Write 16-bit value as DATA
|
||||||
|
void writeCommand16(uint16_t cmd); // Write 16-bit value as COMMAND
|
||||||
|
uint16_t read16(void); // Read single 16-bit value
|
||||||
|
|
||||||
|
// Most of these low-level functions were formerly macros in
|
||||||
|
// Adafruit_SPITFT_Macros.h. Some have been made into inline functions
|
||||||
|
// to avoid macro mishaps. Despite the addition of code for a parallel
|
||||||
|
// display interface, the names have been kept for backward
|
||||||
|
// compatibility (some subclasses may be invoking these):
|
||||||
|
void SPI_WRITE16(uint16_t w); // Not inline
|
||||||
|
void SPI_WRITE32(uint32_t l); // Not inline
|
||||||
|
// Old code had both a spiWrite16() function and SPI_WRITE16 macro
|
||||||
|
// in addition to the SPI_WRITE32 macro. The latter two have been
|
||||||
|
// made into functions here, and spiWrite16() removed (use SPI_WRITE16()
|
||||||
|
// instead). It looks like most subclasses had gotten comfortable with
|
||||||
|
// SPI_WRITE16 and SPI_WRITE32 anyway so those names were kept rather
|
||||||
|
// than the less-obnoxious camelcase variants, oh well.
|
||||||
|
|
||||||
|
// Placing these functions entirely in the class definition inlines
|
||||||
|
// them implicitly them while allowing their use in other code:
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief Set the chip-select line HIGH. Does NOT check whether CS pin
|
||||||
|
is set (>=0), that should be handled in calling function.
|
||||||
|
Despite function name, this is used even if the display
|
||||||
|
connection is parallel.
|
||||||
|
*/
|
||||||
|
void SPI_CS_HIGH(void) {
|
||||||
|
#if defined(USE_FAST_PINIO)
|
||||||
|
#if defined(HAS_PORT_SET_CLR)
|
||||||
|
#if defined(KINETISK)
|
||||||
|
*csPortSet = 1;
|
||||||
|
#else // !KINETISK
|
||||||
|
*csPortSet = csPinMask;
|
||||||
|
#endif // end !KINETISK
|
||||||
|
#else // !HAS_PORT_SET_CLR
|
||||||
|
*csPort |= csPinMaskSet;
|
||||||
|
#endif // end !HAS_PORT_SET_CLR
|
||||||
|
#else // !USE_FAST_PINIO
|
||||||
|
digitalWrite(_cs, HIGH);
|
||||||
|
#endif // end !USE_FAST_PINIO
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief Set the chip-select line LOW. Does NOT check whether CS pin
|
||||||
|
is set (>=0), that should be handled in calling function.
|
||||||
|
Despite function name, this is used even if the display
|
||||||
|
connection is parallel.
|
||||||
|
*/
|
||||||
|
void SPI_CS_LOW(void) {
|
||||||
|
#if defined(USE_FAST_PINIO)
|
||||||
|
#if defined(HAS_PORT_SET_CLR)
|
||||||
|
#if defined(KINETISK)
|
||||||
|
*csPortClr = 1;
|
||||||
|
#else // !KINETISK
|
||||||
|
*csPortClr = csPinMask;
|
||||||
|
#endif // end !KINETISK
|
||||||
|
#else // !HAS_PORT_SET_CLR
|
||||||
|
*csPort &= csPinMaskClr;
|
||||||
|
#endif // end !HAS_PORT_SET_CLR
|
||||||
|
#else // !USE_FAST_PINIO
|
||||||
|
digitalWrite(_cs, LOW);
|
||||||
|
#endif // end !USE_FAST_PINIO
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief Set the data/command line HIGH (data mode).
|
||||||
|
*/
|
||||||
|
void SPI_DC_HIGH(void) {
|
||||||
|
#if defined(USE_FAST_PINIO)
|
||||||
|
#if defined(HAS_PORT_SET_CLR)
|
||||||
|
#if defined(KINETISK)
|
||||||
|
*dcPortSet = 1;
|
||||||
|
#else // !KINETISK
|
||||||
|
*dcPortSet = dcPinMask;
|
||||||
|
#endif // end !KINETISK
|
||||||
|
#else // !HAS_PORT_SET_CLR
|
||||||
|
*dcPort |= dcPinMaskSet;
|
||||||
|
#endif // end !HAS_PORT_SET_CLR
|
||||||
|
#else // !USE_FAST_PINIO
|
||||||
|
digitalWrite(_dc, HIGH);
|
||||||
|
#endif // end !USE_FAST_PINIO
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief Set the data/command line LOW (command mode).
|
||||||
|
*/
|
||||||
|
void SPI_DC_LOW(void) {
|
||||||
|
#if defined(USE_FAST_PINIO)
|
||||||
|
#if defined(HAS_PORT_SET_CLR)
|
||||||
|
#if defined(KINETISK)
|
||||||
|
*dcPortClr = 1;
|
||||||
|
#else // !KINETISK
|
||||||
|
*dcPortClr = dcPinMask;
|
||||||
|
#endif // end !KINETISK
|
||||||
|
#else // !HAS_PORT_SET_CLR
|
||||||
|
*dcPort &= dcPinMaskClr;
|
||||||
|
#endif // end !HAS_PORT_SET_CLR
|
||||||
|
#else // !USE_FAST_PINIO
|
||||||
|
digitalWrite(_dc, LOW);
|
||||||
|
#endif // end !USE_FAST_PINIO
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// A few more low-level member functions -- some may have previously
|
||||||
|
// been macros. Shouldn't have a need to access these externally, so
|
||||||
|
// they've been moved to the protected section. Additionally, they're
|
||||||
|
// declared inline here and the code is in the .cpp file, since outside
|
||||||
|
// code doesn't need to see these.
|
||||||
|
inline void SPI_MOSI_HIGH(void);
|
||||||
|
inline void SPI_MOSI_LOW(void);
|
||||||
|
inline void SPI_SCK_HIGH(void);
|
||||||
|
inline void SPI_SCK_LOW(void);
|
||||||
|
inline bool SPI_MISO_READ(void);
|
||||||
|
inline void SPI_BEGIN_TRANSACTION(void);
|
||||||
|
inline void SPI_END_TRANSACTION(void);
|
||||||
|
inline void TFT_WR_STROBE(void); // Parallel interface write strobe
|
||||||
|
inline void TFT_RD_HIGH(void); // Parallel interface read high
|
||||||
|
inline void TFT_RD_LOW(void); // Parallel interface read low
|
||||||
|
|
||||||
|
// CLASS INSTANCE VARIABLES --------------------------------------------
|
||||||
|
|
||||||
|
// Here be dragons! There's a big union of three structures here --
|
||||||
|
// one each for hardware SPI, software (bitbang) SPI, and parallel
|
||||||
|
// interfaces. This is to save some memory, since a display's connection
|
||||||
|
// will be only one of these. The order of some things is a little weird
|
||||||
|
// in an attempt to get values to align and pack better in RAM.
|
||||||
|
|
||||||
|
#if defined(USE_FAST_PINIO)
|
||||||
|
#if defined(HAS_PORT_SET_CLR)
|
||||||
|
PORTreg_t csPortSet; ///< PORT register for chip select SET
|
||||||
|
PORTreg_t csPortClr; ///< PORT register for chip select CLEAR
|
||||||
|
PORTreg_t dcPortSet; ///< PORT register for data/command SET
|
||||||
|
PORTreg_t dcPortClr; ///< PORT register for data/command CLEAR
|
||||||
|
#else // !HAS_PORT_SET_CLR
|
||||||
|
PORTreg_t csPort; ///< PORT register for chip select
|
||||||
|
PORTreg_t dcPort; ///< PORT register for data/command
|
||||||
|
#endif // end HAS_PORT_SET_CLR
|
||||||
|
#endif // end USE_FAST_PINIO
|
||||||
|
#if defined(__cplusplus) && (__cplusplus >= 201100)
|
||||||
|
union {
|
||||||
|
#endif
|
||||||
|
struct { // Values specific to HARDWARE SPI:
|
||||||
|
SPIClass *_spi; ///< SPI class pointer
|
||||||
|
#if defined(SPI_HAS_TRANSACTION)
|
||||||
|
SPISettings settings; ///< SPI transaction settings
|
||||||
|
#else
|
||||||
|
uint32_t _freq; ///< SPI bitrate (if no SPI transactions)
|
||||||
|
#endif
|
||||||
|
uint32_t _mode; ///< SPI data mode (transactions or no)
|
||||||
|
} hwspi; ///< Hardware SPI values
|
||||||
|
struct { // Values specific to SOFTWARE SPI:
|
||||||
|
#if defined(USE_FAST_PINIO)
|
||||||
|
PORTreg_t misoPort; ///< PORT (PIN) register for MISO
|
||||||
|
#if defined(HAS_PORT_SET_CLR)
|
||||||
|
PORTreg_t mosiPortSet; ///< PORT register for MOSI SET
|
||||||
|
PORTreg_t mosiPortClr; ///< PORT register for MOSI CLEAR
|
||||||
|
PORTreg_t sckPortSet; ///< PORT register for SCK SET
|
||||||
|
PORTreg_t sckPortClr; ///< PORT register for SCK CLEAR
|
||||||
|
#if !defined(KINETISK)
|
||||||
|
ADAGFX_PORT_t mosiPinMask; ///< Bitmask for MOSI
|
||||||
|
ADAGFX_PORT_t sckPinMask; ///< Bitmask for SCK
|
||||||
|
#endif // end !KINETISK
|
||||||
|
#else // !HAS_PORT_SET_CLR
|
||||||
|
PORTreg_t mosiPort; ///< PORT register for MOSI
|
||||||
|
PORTreg_t sckPort; ///< PORT register for SCK
|
||||||
|
ADAGFX_PORT_t mosiPinMaskSet; ///< Bitmask for MOSI SET (OR)
|
||||||
|
ADAGFX_PORT_t mosiPinMaskClr; ///< Bitmask for MOSI CLEAR (AND)
|
||||||
|
ADAGFX_PORT_t sckPinMaskSet; ///< Bitmask for SCK SET (OR bitmask)
|
||||||
|
ADAGFX_PORT_t sckPinMaskClr; ///< Bitmask for SCK CLEAR (AND)
|
||||||
|
#endif // end HAS_PORT_SET_CLR
|
||||||
|
#if !defined(KINETISK)
|
||||||
|
ADAGFX_PORT_t misoPinMask; ///< Bitmask for MISO
|
||||||
|
#endif // end !KINETISK
|
||||||
|
#endif // end USE_FAST_PINIO
|
||||||
|
int8_t _mosi; ///< MOSI pin #
|
||||||
|
int8_t _miso; ///< MISO pin #
|
||||||
|
int8_t _sck; ///< SCK pin #
|
||||||
|
} swspi; ///< Software SPI values
|
||||||
|
struct { // Values specific to 8-bit parallel:
|
||||||
|
#if defined(USE_FAST_PINIO)
|
||||||
|
|
||||||
|
#if defined(__IMXRT1052__) || defined(__IMXRT1062__) // Teensy 4.x
|
||||||
|
volatile uint32_t *writePort; ///< PORT register for DATA WRITE
|
||||||
|
volatile uint32_t *readPort; ///< PORT (PIN) register for DATA READ
|
||||||
|
#else
|
||||||
|
volatile uint8_t *writePort; ///< PORT register for DATA WRITE
|
||||||
|
volatile uint8_t *readPort; ///< PORT (PIN) register for DATA READ
|
||||||
|
#endif
|
||||||
|
#if defined(HAS_PORT_SET_CLR)
|
||||||
|
// Port direction register pointers are always 8-bit regardless of
|
||||||
|
// PORTreg_t -- even if 32-bit port, we modify a byte-aligned 8 bits.
|
||||||
|
#if defined(__IMXRT1052__) || defined(__IMXRT1062__) // Teensy 4.x
|
||||||
|
volatile uint32_t *dirSet; ///< PORT byte data direction SET
|
||||||
|
volatile uint32_t *dirClr; ///< PORT byte data direction CLEAR
|
||||||
|
#else
|
||||||
|
volatile uint8_t *dirSet; ///< PORT byte data direction SET
|
||||||
|
volatile uint8_t *dirClr; ///< PORT byte data direction CLEAR
|
||||||
|
#endif
|
||||||
|
PORTreg_t wrPortSet; ///< PORT register for write strobe SET
|
||||||
|
PORTreg_t wrPortClr; ///< PORT register for write strobe CLEAR
|
||||||
|
PORTreg_t rdPortSet; ///< PORT register for read strobe SET
|
||||||
|
PORTreg_t rdPortClr; ///< PORT register for read strobe CLEAR
|
||||||
|
#if !defined(KINETISK)
|
||||||
|
ADAGFX_PORT_t wrPinMask; ///< Bitmask for write strobe
|
||||||
|
#endif // end !KINETISK
|
||||||
|
ADAGFX_PORT_t rdPinMask; ///< Bitmask for read strobe
|
||||||
|
#else // !HAS_PORT_SET_CLR
|
||||||
|
// Port direction register pointer is always 8-bit regardless of
|
||||||
|
// PORTreg_t -- even if 32-bit port, we modify a byte-aligned 8 bits.
|
||||||
|
volatile uint8_t *portDir; ///< PORT direction register
|
||||||
|
PORTreg_t wrPort; ///< PORT register for write strobe
|
||||||
|
PORTreg_t rdPort; ///< PORT register for read strobe
|
||||||
|
ADAGFX_PORT_t wrPinMaskSet; ///< Bitmask for write strobe SET (OR)
|
||||||
|
ADAGFX_PORT_t wrPinMaskClr; ///< Bitmask for write strobe CLEAR (AND)
|
||||||
|
ADAGFX_PORT_t rdPinMaskSet; ///< Bitmask for read strobe SET (OR)
|
||||||
|
ADAGFX_PORT_t rdPinMaskClr; ///< Bitmask for read strobe CLEAR (AND)
|
||||||
|
#endif // end HAS_PORT_SET_CLR
|
||||||
|
#endif // end USE_FAST_PINIO
|
||||||
|
int8_t _d0; ///< Data pin 0 #
|
||||||
|
int8_t _wr; ///< Write strobe pin #
|
||||||
|
int8_t _rd; ///< Read strobe pin # (or -1)
|
||||||
|
bool wide = 0; ///< If true, is 16-bit interface
|
||||||
|
} tft8; ///< Parallel interface settings
|
||||||
|
#if defined(__cplusplus) && (__cplusplus >= 201100)
|
||||||
|
}; ///< Only one interface is active
|
||||||
|
#endif
|
||||||
|
#if defined(USE_SPI_DMA) && \
|
||||||
|
(defined(__SAMD51__) || \
|
||||||
|
defined(ARDUINO_SAMD_ZERO)) // Used by hardware SPI and tft8
|
||||||
|
Adafruit_ZeroDMA dma; ///< DMA instance
|
||||||
|
DmacDescriptor *dptr = NULL; ///< 1st descriptor
|
||||||
|
DmacDescriptor *descriptor = NULL; ///< Allocated descriptor list
|
||||||
|
uint16_t *pixelBuf[2]; ///< Working buffers
|
||||||
|
uint16_t maxFillLen; ///< Max pixels per DMA xfer
|
||||||
|
uint16_t lastFillColor = 0; ///< Last color used w/fill
|
||||||
|
uint32_t lastFillLen = 0; ///< # of pixels w/last fill
|
||||||
|
uint8_t onePixelBuf; ///< For hi==lo fill
|
||||||
|
#endif
|
||||||
|
#if defined(USE_FAST_PINIO)
|
||||||
|
#if defined(HAS_PORT_SET_CLR)
|
||||||
|
#if !defined(KINETISK)
|
||||||
|
ADAGFX_PORT_t csPinMask; ///< Bitmask for chip select
|
||||||
|
ADAGFX_PORT_t dcPinMask; ///< Bitmask for data/command
|
||||||
|
#endif // end !KINETISK
|
||||||
|
#else // !HAS_PORT_SET_CLR
|
||||||
|
ADAGFX_PORT_t csPinMaskSet; ///< Bitmask for chip select SET (OR)
|
||||||
|
ADAGFX_PORT_t csPinMaskClr; ///< Bitmask for chip select CLEAR (AND)
|
||||||
|
ADAGFX_PORT_t dcPinMaskSet; ///< Bitmask for data/command SET (OR)
|
||||||
|
ADAGFX_PORT_t dcPinMaskClr; ///< Bitmask for data/command CLEAR (AND)
|
||||||
|
#endif // end HAS_PORT_SET_CLR
|
||||||
|
#endif // end USE_FAST_PINIO
|
||||||
|
uint8_t connection; ///< TFT_HARD_SPI, TFT_SOFT_SPI, etc.
|
||||||
|
int8_t _rst; ///< Reset pin # (or -1)
|
||||||
|
int8_t _cs; ///< Chip select pin # (or -1)
|
||||||
|
int8_t _dc; ///< Data/command pin #
|
||||||
|
|
||||||
|
int16_t _xstart = 0; ///< Internal framebuffer X offset
|
||||||
|
int16_t _ystart = 0; ///< Internal framebuffer Y offset
|
||||||
|
uint8_t invertOnCommand = 0; ///< Command to enable invert mode
|
||||||
|
uint8_t invertOffCommand = 0; ///< Command to disable invert mode
|
||||||
|
|
||||||
|
uint32_t _freq = 0; ///< Dummy var to keep subclasses happy
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // end __AVR_ATtiny85__ __AVR_ATtiny84__
|
||||||
|
#endif // end _ADAFRUIT_SPITFT_H_
|
||||||
6
libraries/Adafruit_GFX_Library/Adafruit_SPITFT_Macros.h
Normal file
6
libraries/Adafruit_GFX_Library/Adafruit_SPITFT_Macros.h
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
// THIS FILE INTENTIONALLY LEFT BLANK.
|
||||||
|
|
||||||
|
// Macros previously #defined here have been made into (mostly) inline
|
||||||
|
// functions in the Adafruit_SPITFT class. Other libraries might still
|
||||||
|
// contain code trying to #include this header file, so until everything's
|
||||||
|
// updated this file still exists (but doing nothing) to avoid trouble.
|
||||||
11
libraries/Adafruit_GFX_Library/CMakeLists.txt
Normal file
11
libraries/Adafruit_GFX_Library/CMakeLists.txt
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# Adafruit GFX Library
|
||||||
|
# https://github.com/adafruit/Adafruit-GFX-Library
|
||||||
|
# BSD License
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.5)
|
||||||
|
|
||||||
|
idf_component_register(SRCS "Adafruit_GFX.cpp" "Adafruit_GrayOLED.cpp" "Adafruit_SPITFT.cpp" "glcdfont.c"
|
||||||
|
INCLUDE_DIRS "."
|
||||||
|
REQUIRES arduino Adafruit_BusIO)
|
||||||
|
|
||||||
|
project(Adafruit-GFX-Library)
|
||||||
229
libraries/Adafruit_GFX_Library/Fonts/FreeMono12pt7b.h
Normal file
229
libraries/Adafruit_GFX_Library/Fonts/FreeMono12pt7b.h
Normal file
@@ -0,0 +1,229 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
|
||||||
|
const uint8_t FreeMono12pt7bBitmaps[] PROGMEM = {
|
||||||
|
0x49, 0x24, 0x92, 0x48, 0x01, 0xF8, 0xE7, 0xE7, 0x67, 0x42, 0x42, 0x42,
|
||||||
|
0x42, 0x09, 0x02, 0x41, 0x10, 0x44, 0x11, 0x1F, 0xF1, 0x10, 0x4C, 0x12,
|
||||||
|
0x3F, 0xE1, 0x20, 0x48, 0x12, 0x04, 0x81, 0x20, 0x48, 0x04, 0x07, 0xA2,
|
||||||
|
0x19, 0x02, 0x40, 0x10, 0x03, 0x00, 0x3C, 0x00, 0x80, 0x10, 0x06, 0x01,
|
||||||
|
0xE0, 0xA7, 0xC0, 0x40, 0x10, 0x04, 0x00, 0x3C, 0x19, 0x84, 0x21, 0x08,
|
||||||
|
0x66, 0x0F, 0x00, 0x0C, 0x1C, 0x78, 0x01, 0xE0, 0xCC, 0x21, 0x08, 0x43,
|
||||||
|
0x30, 0x78, 0x3E, 0x30, 0x10, 0x08, 0x02, 0x03, 0x03, 0x47, 0x14, 0x8A,
|
||||||
|
0x43, 0x11, 0x8F, 0x60, 0xFD, 0xA4, 0x90, 0x05, 0x25, 0x24, 0x92, 0x48,
|
||||||
|
0x92, 0x24, 0x11, 0x24, 0x89, 0x24, 0x92, 0x92, 0x90, 0x00, 0x04, 0x02,
|
||||||
|
0x11, 0x07, 0xF0, 0xC0, 0x50, 0x48, 0x42, 0x00, 0x08, 0x04, 0x02, 0x01,
|
||||||
|
0x00, 0x87, 0xFC, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x3B, 0x9C, 0xCE,
|
||||||
|
0x62, 0x00, 0xFF, 0xE0, 0xFF, 0x80, 0x00, 0x80, 0xC0, 0x40, 0x20, 0x20,
|
||||||
|
0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x00, 0x80,
|
||||||
|
0x80, 0x40, 0x00, 0x1C, 0x31, 0x90, 0x58, 0x38, 0x0C, 0x06, 0x03, 0x01,
|
||||||
|
0x80, 0xC0, 0x60, 0x30, 0x34, 0x13, 0x18, 0x70, 0x30, 0xE1, 0x44, 0x81,
|
||||||
|
0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, 0x1F, 0xC0, 0x1E, 0x10, 0x90,
|
||||||
|
0x68, 0x10, 0x08, 0x0C, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x0E,
|
||||||
|
0x07, 0xFE, 0x3E, 0x10, 0x40, 0x08, 0x02, 0x00, 0x80, 0x40, 0xE0, 0x04,
|
||||||
|
0x00, 0x80, 0x10, 0x04, 0x01, 0x00, 0xD8, 0x63, 0xE0, 0x06, 0x0A, 0x0A,
|
||||||
|
0x12, 0x22, 0x22, 0x42, 0x42, 0x82, 0x82, 0xFF, 0x02, 0x02, 0x02, 0x0F,
|
||||||
|
0x7F, 0x20, 0x10, 0x08, 0x04, 0x02, 0xF1, 0x8C, 0x03, 0x00, 0x80, 0x40,
|
||||||
|
0x20, 0x18, 0x16, 0x18, 0xF0, 0x0F, 0x8C, 0x08, 0x08, 0x04, 0x04, 0x02,
|
||||||
|
0x79, 0x46, 0xC1, 0xE0, 0x60, 0x28, 0x14, 0x19, 0x08, 0x78, 0xFF, 0x81,
|
||||||
|
0x81, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08,
|
||||||
|
0x08, 0x3E, 0x31, 0xB0, 0x70, 0x18, 0x0C, 0x05, 0x8C, 0x38, 0x63, 0x40,
|
||||||
|
0x60, 0x30, 0x18, 0x1B, 0x18, 0xF8, 0x3C, 0x31, 0x30, 0x50, 0x28, 0x0C,
|
||||||
|
0x0F, 0x06, 0x85, 0x3C, 0x80, 0x40, 0x40, 0x20, 0x20, 0x63, 0xE0, 0xFF,
|
||||||
|
0x80, 0x07, 0xFC, 0x39, 0xCE, 0x00, 0x00, 0x06, 0x33, 0x98, 0xC4, 0x00,
|
||||||
|
0x00, 0xC0, 0x60, 0x18, 0x0C, 0x06, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03,
|
||||||
|
0x00, 0x30, 0x01, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x0F, 0xFF, 0xC0, 0x06,
|
||||||
|
0x00, 0x30, 0x01, 0x80, 0x18, 0x01, 0x80, 0xC0, 0x30, 0x18, 0x0C, 0x02,
|
||||||
|
0x00, 0x00, 0x3E, 0x60, 0xA0, 0x20, 0x10, 0x08, 0x08, 0x18, 0x10, 0x08,
|
||||||
|
0x00, 0x00, 0x00, 0x01, 0xC0, 0xE0, 0x1C, 0x31, 0x10, 0x50, 0x28, 0x14,
|
||||||
|
0x3A, 0x25, 0x22, 0x91, 0x4C, 0xA3, 0xF0, 0x08, 0x02, 0x01, 0x80, 0x7C,
|
||||||
|
0x3F, 0x00, 0x0C, 0x00, 0x48, 0x01, 0x20, 0x04, 0x40, 0x21, 0x00, 0x84,
|
||||||
|
0x04, 0x08, 0x1F, 0xE0, 0x40, 0x82, 0x01, 0x08, 0x04, 0x20, 0x13, 0xE1,
|
||||||
|
0xF0, 0xFF, 0x08, 0x11, 0x01, 0x20, 0x24, 0x04, 0x81, 0x1F, 0xC2, 0x06,
|
||||||
|
0x40, 0x68, 0x05, 0x00, 0xA0, 0x14, 0x05, 0xFF, 0x00, 0x1E, 0x48, 0x74,
|
||||||
|
0x05, 0x01, 0x80, 0x20, 0x08, 0x02, 0x00, 0x80, 0x20, 0x04, 0x01, 0x01,
|
||||||
|
0x30, 0x87, 0xC0, 0xFE, 0x10, 0x44, 0x09, 0x02, 0x40, 0x50, 0x14, 0x05,
|
||||||
|
0x01, 0x40, 0x50, 0x14, 0x0D, 0x02, 0x41, 0x3F, 0x80, 0xFF, 0xC8, 0x09,
|
||||||
|
0x01, 0x20, 0x04, 0x00, 0x88, 0x1F, 0x02, 0x20, 0x40, 0x08, 0x01, 0x00,
|
||||||
|
0xA0, 0x14, 0x03, 0xFF, 0xC0, 0xFF, 0xE8, 0x05, 0x00, 0xA0, 0x04, 0x00,
|
||||||
|
0x88, 0x1F, 0x02, 0x20, 0x40, 0x08, 0x01, 0x00, 0x20, 0x04, 0x01, 0xF0,
|
||||||
|
0x00, 0x1F, 0x46, 0x19, 0x01, 0x60, 0x28, 0x01, 0x00, 0x20, 0x04, 0x00,
|
||||||
|
0x83, 0xF0, 0x0B, 0x01, 0x20, 0x23, 0x0C, 0x3E, 0x00, 0xE1, 0xD0, 0x24,
|
||||||
|
0x09, 0x02, 0x40, 0x90, 0x27, 0xF9, 0x02, 0x40, 0x90, 0x24, 0x09, 0x02,
|
||||||
|
0x40, 0xB8, 0x70, 0xFE, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, 0x20,
|
||||||
|
0x40, 0x81, 0x1F, 0xC0, 0x0F, 0xE0, 0x10, 0x02, 0x00, 0x40, 0x08, 0x01,
|
||||||
|
0x00, 0x20, 0x04, 0x80, 0x90, 0x12, 0x02, 0x40, 0xC6, 0x30, 0x7C, 0x00,
|
||||||
|
0xF1, 0xE4, 0x0C, 0x41, 0x04, 0x20, 0x44, 0x04, 0x80, 0x5C, 0x06, 0x60,
|
||||||
|
0x43, 0x04, 0x10, 0x40, 0x84, 0x08, 0x40, 0xCF, 0x07, 0xF8, 0x04, 0x00,
|
||||||
|
0x80, 0x10, 0x02, 0x00, 0x40, 0x08, 0x01, 0x00, 0x20, 0x04, 0x04, 0x80,
|
||||||
|
0x90, 0x12, 0x03, 0xFF, 0xC0, 0xE0, 0x3B, 0x01, 0x94, 0x14, 0xA0, 0xA4,
|
||||||
|
0x89, 0x24, 0x49, 0x14, 0x48, 0xA2, 0x45, 0x12, 0x10, 0x90, 0x04, 0x80,
|
||||||
|
0x24, 0x01, 0x78, 0x3C, 0xE0, 0xF6, 0x02, 0x50, 0x25, 0x02, 0x48, 0x24,
|
||||||
|
0xC2, 0x44, 0x24, 0x22, 0x43, 0x24, 0x12, 0x40, 0xA4, 0x0A, 0x40, 0x6F,
|
||||||
|
0x06, 0x0F, 0x03, 0x0C, 0x60, 0x64, 0x02, 0x80, 0x18, 0x01, 0x80, 0x18,
|
||||||
|
0x01, 0x80, 0x18, 0x01, 0x40, 0x26, 0x06, 0x30, 0xC0, 0xF0, 0xFF, 0x10,
|
||||||
|
0x64, 0x05, 0x01, 0x40, 0x50, 0x34, 0x19, 0xFC, 0x40, 0x10, 0x04, 0x01,
|
||||||
|
0x00, 0x40, 0x3E, 0x00, 0x0F, 0x03, 0x0C, 0x60, 0x64, 0x02, 0x80, 0x18,
|
||||||
|
0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x40, 0x26, 0x06, 0x30, 0xC1,
|
||||||
|
0xF0, 0x0C, 0x01, 0xF1, 0x30, 0xE0, 0xFF, 0x04, 0x18, 0x40, 0xC4, 0x04,
|
||||||
|
0x40, 0x44, 0x0C, 0x41, 0x87, 0xE0, 0x43, 0x04, 0x10, 0x40, 0x84, 0x04,
|
||||||
|
0x40, 0x4F, 0x03, 0x1F, 0x48, 0x34, 0x05, 0x01, 0x40, 0x08, 0x01, 0xC0,
|
||||||
|
0x0E, 0x00, 0x40, 0x18, 0x06, 0x01, 0xE1, 0xA7, 0xC0, 0xFF, 0xF0, 0x86,
|
||||||
|
0x10, 0x82, 0x00, 0x40, 0x08, 0x01, 0x00, 0x20, 0x04, 0x00, 0x80, 0x10,
|
||||||
|
0x02, 0x00, 0x40, 0x7F, 0x00, 0xF0, 0xF4, 0x02, 0x40, 0x24, 0x02, 0x40,
|
||||||
|
0x24, 0x02, 0x40, 0x24, 0x02, 0x40, 0x24, 0x02, 0x40, 0x22, 0x04, 0x30,
|
||||||
|
0xC0, 0xF0, 0xF8, 0x7C, 0x80, 0x22, 0x01, 0x04, 0x04, 0x10, 0x20, 0x40,
|
||||||
|
0x80, 0x82, 0x02, 0x10, 0x08, 0x40, 0x11, 0x00, 0x48, 0x01, 0xA0, 0x03,
|
||||||
|
0x00, 0x0C, 0x00, 0xF8, 0x7C, 0x80, 0x22, 0x00, 0x88, 0xC2, 0x23, 0x10,
|
||||||
|
0x8E, 0x42, 0x29, 0x09, 0x24, 0x24, 0x90, 0x91, 0x41, 0x85, 0x06, 0x14,
|
||||||
|
0x18, 0x70, 0x60, 0x80, 0xF0, 0xF2, 0x06, 0x30, 0x41, 0x08, 0x09, 0x80,
|
||||||
|
0x50, 0x06, 0x00, 0x60, 0x0D, 0x00, 0x88, 0x10, 0xC2, 0x04, 0x60, 0x2F,
|
||||||
|
0x0F, 0xF0, 0xF2, 0x02, 0x10, 0x41, 0x04, 0x08, 0x80, 0x50, 0x05, 0x00,
|
||||||
|
0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x01, 0xFC, 0xFF, 0x40,
|
||||||
|
0xA0, 0x90, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x10, 0x50, 0x30, 0x18,
|
||||||
|
0x0F, 0xFC, 0xF2, 0x49, 0x24, 0x92, 0x49, 0x24, 0x9C, 0x80, 0x60, 0x10,
|
||||||
|
0x08, 0x02, 0x01, 0x00, 0x40, 0x20, 0x08, 0x04, 0x01, 0x00, 0x80, 0x20,
|
||||||
|
0x10, 0x04, 0x02, 0x00, 0x80, 0x40, 0xE4, 0x92, 0x49, 0x24, 0x92, 0x49,
|
||||||
|
0x3C, 0x08, 0x0C, 0x09, 0x0C, 0x4C, 0x14, 0x04, 0xFF, 0xFC, 0x84, 0x21,
|
||||||
|
0x3E, 0x00, 0x60, 0x08, 0x02, 0x3F, 0x98, 0x28, 0x0A, 0x02, 0xC3, 0x9F,
|
||||||
|
0x30, 0xE0, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00, 0x13, 0xE0, 0xA0,
|
||||||
|
0x86, 0x02, 0x20, 0x09, 0x00, 0x48, 0x02, 0x40, 0x13, 0x01, 0x14, 0x1B,
|
||||||
|
0x9F, 0x00, 0x1F, 0x4C, 0x19, 0x01, 0x40, 0x28, 0x01, 0x00, 0x20, 0x02,
|
||||||
|
0x00, 0x60, 0x43, 0xF0, 0x00, 0xC0, 0x08, 0x01, 0x00, 0x20, 0x04, 0x3C,
|
||||||
|
0x98, 0x52, 0x06, 0x80, 0x50, 0x0A, 0x01, 0x40, 0x24, 0x0C, 0xC2, 0x87,
|
||||||
|
0x98, 0x3F, 0x18, 0x68, 0x06, 0x01, 0xFF, 0xE0, 0x08, 0x03, 0x00, 0x60,
|
||||||
|
0xC7, 0xC0, 0x0F, 0x98, 0x08, 0x04, 0x02, 0x07, 0xF8, 0x80, 0x40, 0x20,
|
||||||
|
0x10, 0x08, 0x04, 0x02, 0x01, 0x03, 0xF8, 0x1E, 0x6C, 0x39, 0x03, 0x40,
|
||||||
|
0x28, 0x05, 0x00, 0xA0, 0x12, 0x06, 0x61, 0x43, 0xC8, 0x01, 0x00, 0x20,
|
||||||
|
0x08, 0x3E, 0x00, 0xC0, 0x10, 0x04, 0x01, 0x00, 0x40, 0x13, 0x87, 0x11,
|
||||||
|
0x82, 0x40, 0x90, 0x24, 0x09, 0x02, 0x40, 0x90, 0x2E, 0x1C, 0x08, 0x04,
|
||||||
|
0x02, 0x00, 0x00, 0x03, 0xC0, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00,
|
||||||
|
0x80, 0x43, 0xFE, 0x04, 0x08, 0x10, 0x00, 0x1F, 0xC0, 0x81, 0x02, 0x04,
|
||||||
|
0x08, 0x10, 0x20, 0x40, 0x81, 0x02, 0x0B, 0xE0, 0xE0, 0x02, 0x00, 0x20,
|
||||||
|
0x02, 0x00, 0x20, 0x02, 0x3C, 0x21, 0x02, 0x60, 0x2C, 0x03, 0x80, 0x24,
|
||||||
|
0x02, 0x20, 0x21, 0x02, 0x08, 0xE1, 0xF0, 0x78, 0x04, 0x02, 0x01, 0x00,
|
||||||
|
0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x43, 0xFE,
|
||||||
|
0xDC, 0xE3, 0x19, 0x90, 0x84, 0x84, 0x24, 0x21, 0x21, 0x09, 0x08, 0x48,
|
||||||
|
0x42, 0x42, 0x17, 0x18, 0xC0, 0x67, 0x83, 0x84, 0x20, 0x22, 0x02, 0x20,
|
||||||
|
0x22, 0x02, 0x20, 0x22, 0x02, 0x20, 0x2F, 0x07, 0x1F, 0x04, 0x11, 0x01,
|
||||||
|
0x40, 0x18, 0x03, 0x00, 0x60, 0x0A, 0x02, 0x20, 0x83, 0xE0, 0xCF, 0x85,
|
||||||
|
0x06, 0x60, 0x24, 0x01, 0x40, 0x14, 0x01, 0x40, 0x16, 0x02, 0x50, 0x44,
|
||||||
|
0xF8, 0x40, 0x04, 0x00, 0x40, 0x0F, 0x00, 0x1E, 0x6C, 0x3B, 0x03, 0x40,
|
||||||
|
0x28, 0x05, 0x00, 0xA0, 0x12, 0x06, 0x61, 0x43, 0xC8, 0x01, 0x00, 0x20,
|
||||||
|
0x04, 0x03, 0xC0, 0xE3, 0x8B, 0x13, 0x80, 0x80, 0x20, 0x08, 0x02, 0x00,
|
||||||
|
0x80, 0x20, 0x3F, 0x80, 0x1F, 0x58, 0x34, 0x05, 0x80, 0x1E, 0x00, 0x60,
|
||||||
|
0x06, 0x01, 0xC0, 0xAF, 0xC0, 0x20, 0x04, 0x00, 0x80, 0x10, 0x0F, 0xF0,
|
||||||
|
0x40, 0x08, 0x01, 0x00, 0x20, 0x04, 0x00, 0x80, 0x10, 0x03, 0x04, 0x3F,
|
||||||
|
0x00, 0xC1, 0xC8, 0x09, 0x01, 0x20, 0x24, 0x04, 0x80, 0x90, 0x12, 0x02,
|
||||||
|
0x61, 0xC7, 0xCC, 0xF8, 0xF9, 0x01, 0x08, 0x10, 0x60, 0x81, 0x08, 0x08,
|
||||||
|
0x40, 0x22, 0x01, 0x20, 0x05, 0x00, 0x30, 0x00, 0xF0, 0x7A, 0x01, 0x10,
|
||||||
|
0x08, 0x8C, 0x42, 0x62, 0x12, 0x90, 0xA5, 0x05, 0x18, 0x28, 0xC0, 0x86,
|
||||||
|
0x00, 0x78, 0xF3, 0x04, 0x18, 0x80, 0xD0, 0x06, 0x00, 0x70, 0x09, 0x81,
|
||||||
|
0x0C, 0x20, 0x6F, 0x8F, 0xF0, 0xF2, 0x02, 0x20, 0x41, 0x04, 0x10, 0x80,
|
||||||
|
0x88, 0x09, 0x00, 0x50, 0x06, 0x00, 0x20, 0x04, 0x00, 0x40, 0x08, 0x0F,
|
||||||
|
0xE0, 0xFF, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0xBF,
|
||||||
|
0xC0, 0x19, 0x08, 0x42, 0x10, 0x84, 0x64, 0x18, 0x42, 0x10, 0x84, 0x20,
|
||||||
|
0xC0, 0xFF, 0xFF, 0xC0, 0xC1, 0x08, 0x42, 0x10, 0x84, 0x10, 0x4C, 0x42,
|
||||||
|
0x10, 0x84, 0x26, 0x00, 0x38, 0x13, 0x38, 0x38};
|
||||||
|
|
||||||
|
const GFXglyph FreeMono12pt7bGlyphs[] PROGMEM = {
|
||||||
|
{0, 0, 0, 14, 0, 1}, // 0x20 ' '
|
||||||
|
{0, 3, 15, 14, 6, -14}, // 0x21 '!'
|
||||||
|
{6, 8, 7, 14, 3, -14}, // 0x22 '"'
|
||||||
|
{13, 10, 16, 14, 2, -14}, // 0x23 '#'
|
||||||
|
{33, 10, 17, 14, 2, -14}, // 0x24 '$'
|
||||||
|
{55, 10, 15, 14, 2, -14}, // 0x25 '%'
|
||||||
|
{74, 9, 12, 14, 3, -11}, // 0x26 '&'
|
||||||
|
{88, 3, 7, 14, 5, -14}, // 0x27 '''
|
||||||
|
{91, 3, 18, 14, 7, -14}, // 0x28 '('
|
||||||
|
{98, 3, 18, 14, 4, -14}, // 0x29 ')'
|
||||||
|
{105, 9, 9, 14, 3, -14}, // 0x2A '*'
|
||||||
|
{116, 9, 11, 14, 3, -11}, // 0x2B '+'
|
||||||
|
{129, 5, 7, 14, 3, -3}, // 0x2C ','
|
||||||
|
{134, 11, 1, 14, 2, -6}, // 0x2D '-'
|
||||||
|
{136, 3, 3, 14, 5, -2}, // 0x2E '.'
|
||||||
|
{138, 9, 18, 14, 3, -15}, // 0x2F '/'
|
||||||
|
{159, 9, 15, 14, 3, -14}, // 0x30 '0'
|
||||||
|
{176, 7, 14, 14, 4, -13}, // 0x31 '1'
|
||||||
|
{189, 9, 15, 14, 2, -14}, // 0x32 '2'
|
||||||
|
{206, 10, 15, 14, 2, -14}, // 0x33 '3'
|
||||||
|
{225, 8, 15, 14, 3, -14}, // 0x34 '4'
|
||||||
|
{240, 9, 15, 14, 3, -14}, // 0x35 '5'
|
||||||
|
{257, 9, 15, 14, 3, -14}, // 0x36 '6'
|
||||||
|
{274, 8, 15, 14, 3, -14}, // 0x37 '7'
|
||||||
|
{289, 9, 15, 14, 3, -14}, // 0x38 '8'
|
||||||
|
{306, 9, 15, 14, 3, -14}, // 0x39 '9'
|
||||||
|
{323, 3, 10, 14, 5, -9}, // 0x3A ':'
|
||||||
|
{327, 5, 13, 14, 3, -9}, // 0x3B ';'
|
||||||
|
{336, 11, 11, 14, 2, -11}, // 0x3C '<'
|
||||||
|
{352, 12, 4, 14, 1, -8}, // 0x3D '='
|
||||||
|
{358, 11, 11, 14, 2, -11}, // 0x3E '>'
|
||||||
|
{374, 9, 14, 14, 3, -13}, // 0x3F '?'
|
||||||
|
{390, 9, 16, 14, 3, -14}, // 0x40 '@'
|
||||||
|
{408, 14, 14, 14, 0, -13}, // 0x41 'A'
|
||||||
|
{433, 11, 14, 14, 2, -13}, // 0x42 'B'
|
||||||
|
{453, 10, 14, 14, 2, -13}, // 0x43 'C'
|
||||||
|
{471, 10, 14, 14, 2, -13}, // 0x44 'D'
|
||||||
|
{489, 11, 14, 14, 2, -13}, // 0x45 'E'
|
||||||
|
{509, 11, 14, 14, 2, -13}, // 0x46 'F'
|
||||||
|
{529, 11, 14, 14, 2, -13}, // 0x47 'G'
|
||||||
|
{549, 10, 14, 14, 2, -13}, // 0x48 'H'
|
||||||
|
{567, 7, 14, 14, 4, -13}, // 0x49 'I'
|
||||||
|
{580, 11, 14, 14, 2, -13}, // 0x4A 'J'
|
||||||
|
{600, 12, 14, 14, 2, -13}, // 0x4B 'K'
|
||||||
|
{621, 11, 14, 14, 2, -13}, // 0x4C 'L'
|
||||||
|
{641, 13, 14, 14, 1, -13}, // 0x4D 'M'
|
||||||
|
{664, 12, 14, 14, 1, -13}, // 0x4E 'N'
|
||||||
|
{685, 12, 14, 14, 1, -13}, // 0x4F 'O'
|
||||||
|
{706, 10, 14, 14, 2, -13}, // 0x50 'P'
|
||||||
|
{724, 12, 17, 14, 1, -13}, // 0x51 'Q'
|
||||||
|
{750, 12, 14, 14, 2, -13}, // 0x52 'R'
|
||||||
|
{771, 10, 14, 14, 2, -13}, // 0x53 'S'
|
||||||
|
{789, 11, 14, 14, 2, -13}, // 0x54 'T'
|
||||||
|
{809, 12, 14, 14, 1, -13}, // 0x55 'U'
|
||||||
|
{830, 14, 14, 14, 0, -13}, // 0x56 'V'
|
||||||
|
{855, 14, 14, 14, 0, -13}, // 0x57 'W'
|
||||||
|
{880, 12, 14, 14, 1, -13}, // 0x58 'X'
|
||||||
|
{901, 12, 14, 14, 1, -13}, // 0x59 'Y'
|
||||||
|
{922, 9, 14, 14, 3, -13}, // 0x5A 'Z'
|
||||||
|
{938, 3, 18, 14, 7, -14}, // 0x5B '['
|
||||||
|
{945, 9, 18, 14, 3, -15}, // 0x5C '\'
|
||||||
|
{966, 3, 18, 14, 5, -14}, // 0x5D ']'
|
||||||
|
{973, 9, 6, 14, 3, -14}, // 0x5E '^'
|
||||||
|
{980, 14, 1, 14, 0, 3}, // 0x5F '_'
|
||||||
|
{982, 4, 4, 14, 4, -15}, // 0x60 '`'
|
||||||
|
{984, 10, 10, 14, 2, -9}, // 0x61 'a'
|
||||||
|
{997, 13, 15, 14, 0, -14}, // 0x62 'b'
|
||||||
|
{1022, 11, 10, 14, 2, -9}, // 0x63 'c'
|
||||||
|
{1036, 11, 15, 14, 2, -14}, // 0x64 'd'
|
||||||
|
{1057, 10, 10, 14, 2, -9}, // 0x65 'e'
|
||||||
|
{1070, 9, 15, 14, 4, -14}, // 0x66 'f'
|
||||||
|
{1087, 11, 14, 14, 2, -9}, // 0x67 'g'
|
||||||
|
{1107, 10, 15, 14, 2, -14}, // 0x68 'h'
|
||||||
|
{1126, 9, 15, 14, 3, -14}, // 0x69 'i'
|
||||||
|
{1143, 7, 19, 14, 3, -14}, // 0x6A 'j'
|
||||||
|
{1160, 12, 15, 14, 1, -14}, // 0x6B 'k'
|
||||||
|
{1183, 9, 15, 14, 3, -14}, // 0x6C 'l'
|
||||||
|
{1200, 13, 10, 14, 1, -9}, // 0x6D 'm'
|
||||||
|
{1217, 12, 10, 14, 1, -9}, // 0x6E 'n'
|
||||||
|
{1232, 11, 10, 14, 2, -9}, // 0x6F 'o'
|
||||||
|
{1246, 12, 14, 14, 1, -9}, // 0x70 'p'
|
||||||
|
{1267, 11, 14, 14, 2, -9}, // 0x71 'q'
|
||||||
|
{1287, 10, 10, 14, 3, -9}, // 0x72 'r'
|
||||||
|
{1300, 10, 10, 14, 2, -9}, // 0x73 's'
|
||||||
|
{1313, 11, 14, 14, 1, -13}, // 0x74 't'
|
||||||
|
{1333, 11, 10, 14, 2, -9}, // 0x75 'u'
|
||||||
|
{1347, 13, 10, 14, 1, -9}, // 0x76 'v'
|
||||||
|
{1364, 13, 10, 14, 1, -9}, // 0x77 'w'
|
||||||
|
{1381, 12, 10, 14, 1, -9}, // 0x78 'x'
|
||||||
|
{1396, 12, 14, 14, 1, -9}, // 0x79 'y'
|
||||||
|
{1417, 9, 10, 14, 3, -9}, // 0x7A 'z'
|
||||||
|
{1429, 5, 18, 14, 5, -14}, // 0x7B '{'
|
||||||
|
{1441, 1, 18, 14, 7, -14}, // 0x7C '|'
|
||||||
|
{1444, 5, 18, 14, 5, -14}, // 0x7D '}'
|
||||||
|
{1456, 10, 3, 14, 2, -7}}; // 0x7E '~'
|
||||||
|
|
||||||
|
const GFXfont FreeMono12pt7b PROGMEM = {(uint8_t *)FreeMono12pt7bBitmaps,
|
||||||
|
(GFXglyph *)FreeMono12pt7bGlyphs, 0x20,
|
||||||
|
0x7E, 24};
|
||||||
|
|
||||||
|
// Approx. 2132 bytes
|
||||||
365
libraries/Adafruit_GFX_Library/Fonts/FreeMono18pt7b.h
Normal file
365
libraries/Adafruit_GFX_Library/Fonts/FreeMono18pt7b.h
Normal file
@@ -0,0 +1,365 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
|
||||||
|
const uint8_t FreeMono18pt7bBitmaps[] PROGMEM = {
|
||||||
|
0x27, 0x77, 0x77, 0x77, 0x77, 0x22, 0x22, 0x20, 0x00, 0x6F, 0xF6, 0xF1,
|
||||||
|
0xFE, 0x3F, 0xC7, 0xF8, 0xFF, 0x1E, 0xC3, 0x98, 0x33, 0x06, 0x60, 0xCC,
|
||||||
|
0x18, 0x04, 0x20, 0x10, 0x80, 0x42, 0x01, 0x08, 0x04, 0x20, 0x10, 0x80,
|
||||||
|
0x42, 0x01, 0x10, 0x04, 0x41, 0xFF, 0xF0, 0x44, 0x02, 0x10, 0x08, 0x40,
|
||||||
|
0x21, 0x0F, 0xFF, 0xC2, 0x10, 0x08, 0x40, 0x21, 0x00, 0x84, 0x02, 0x10,
|
||||||
|
0x08, 0x40, 0x23, 0x00, 0x88, 0x02, 0x20, 0x02, 0x00, 0x10, 0x00, 0x80,
|
||||||
|
0x1F, 0xA3, 0x07, 0x10, 0x09, 0x00, 0x48, 0x00, 0x40, 0x03, 0x00, 0x0C,
|
||||||
|
0x00, 0x3C, 0x00, 0x1E, 0x00, 0x18, 0x00, 0x20, 0x01, 0x80, 0x0C, 0x00,
|
||||||
|
0x70, 0x05, 0xE0, 0xC9, 0xF8, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00,
|
||||||
|
0x10, 0x00, 0x1E, 0x00, 0x42, 0x01, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08,
|
||||||
|
0x10, 0x08, 0x40, 0x0F, 0x00, 0x00, 0x1E, 0x01, 0xF0, 0x1F, 0x01, 0xE0,
|
||||||
|
0x0E, 0x00, 0x00, 0x3C, 0x00, 0x86, 0x02, 0x06, 0x04, 0x04, 0x08, 0x08,
|
||||||
|
0x10, 0x30, 0x10, 0xC0, 0x1E, 0x00, 0x0F, 0xC1, 0x00, 0x20, 0x02, 0x00,
|
||||||
|
0x20, 0x02, 0x00, 0x10, 0x01, 0x00, 0x08, 0x03, 0xC0, 0x6C, 0x3C, 0x62,
|
||||||
|
0x82, 0x68, 0x34, 0x81, 0xCC, 0x08, 0x61, 0xC3, 0xE7, 0xFF, 0xFF, 0xF6,
|
||||||
|
0x66, 0x66, 0x08, 0xC4, 0x62, 0x31, 0x8C, 0xC6, 0x31, 0x8C, 0x63, 0x18,
|
||||||
|
0xC3, 0x18, 0xC2, 0x18, 0xC3, 0x18, 0x86, 0x10, 0xC2, 0x18, 0xC6, 0x10,
|
||||||
|
0xC6, 0x31, 0x8C, 0x63, 0x18, 0x8C, 0x62, 0x31, 0x98, 0x80, 0x02, 0x00,
|
||||||
|
0x10, 0x00, 0x80, 0x04, 0x0C, 0x21, 0x9D, 0x70, 0x1C, 0x00, 0xA0, 0x0D,
|
||||||
|
0x80, 0xC6, 0x04, 0x10, 0x40, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00,
|
||||||
|
0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0xFF, 0xFE, 0x02,
|
||||||
|
0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,
|
||||||
|
0x01, 0x00, 0x3E, 0x78, 0xF3, 0xC7, 0x8E, 0x18, 0x70, 0xC1, 0x80, 0xFF,
|
||||||
|
0xFE, 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x08, 0x00, 0xC0, 0x04, 0x00, 0x60,
|
||||||
|
0x02, 0x00, 0x30, 0x01, 0x00, 0x18, 0x00, 0x80, 0x0C, 0x00, 0x40, 0x02,
|
||||||
|
0x00, 0x20, 0x01, 0x00, 0x10, 0x00, 0x80, 0x08, 0x00, 0x40, 0x04, 0x00,
|
||||||
|
0x20, 0x02, 0x00, 0x10, 0x01, 0x00, 0x08, 0x00, 0x80, 0x04, 0x00, 0x00,
|
||||||
|
0x0F, 0x81, 0x82, 0x08, 0x08, 0x80, 0x24, 0x01, 0x60, 0x0E, 0x00, 0x30,
|
||||||
|
0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00,
|
||||||
|
0x30, 0x03, 0x40, 0x12, 0x00, 0x88, 0x08, 0x60, 0xC0, 0xF8, 0x00, 0x06,
|
||||||
|
0x00, 0x70, 0x06, 0x80, 0x64, 0x06, 0x20, 0x31, 0x00, 0x08, 0x00, 0x40,
|
||||||
|
0x02, 0x00, 0x10, 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, 0x00,
|
||||||
|
0x40, 0x02, 0x00, 0x10, 0x00, 0x80, 0x04, 0x0F, 0xFF, 0x80, 0x0F, 0x80,
|
||||||
|
0xC3, 0x08, 0x04, 0x80, 0x24, 0x00, 0x80, 0x04, 0x00, 0x20, 0x02, 0x00,
|
||||||
|
0x10, 0x01, 0x00, 0x10, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80,
|
||||||
|
0x18, 0x01, 0x80, 0x58, 0x03, 0x80, 0x1F, 0xFF, 0x80, 0x0F, 0xC0, 0xC0,
|
||||||
|
0x86, 0x01, 0x00, 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x04, 0x00,
|
||||||
|
0x20, 0x0F, 0x00, 0x06, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x40,
|
||||||
|
0x01, 0x00, 0x04, 0x00, 0x2C, 0x01, 0x9C, 0x0C, 0x0F, 0xC0, 0x01, 0xC0,
|
||||||
|
0x14, 0x02, 0x40, 0x64, 0x04, 0x40, 0xC4, 0x08, 0x41, 0x84, 0x10, 0x42,
|
||||||
|
0x04, 0x20, 0x44, 0x04, 0x40, 0x48, 0x04, 0xFF, 0xF0, 0x04, 0x00, 0x40,
|
||||||
|
0x04, 0x00, 0x40, 0x04, 0x07, 0xF0, 0x3F, 0xF0, 0x80, 0x02, 0x00, 0x08,
|
||||||
|
0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x0B, 0xF0, 0x30, 0x30, 0x00, 0x60,
|
||||||
|
0x00, 0x80, 0x01, 0x00, 0x04, 0x00, 0x10, 0x00, 0x40, 0x01, 0x00, 0x0E,
|
||||||
|
0x00, 0x2C, 0x01, 0x0C, 0x18, 0x0F, 0xC0, 0x01, 0xF0, 0x60, 0x18, 0x03,
|
||||||
|
0x00, 0x20, 0x04, 0x00, 0x40, 0x0C, 0x00, 0x80, 0x08, 0xF8, 0x98, 0x4A,
|
||||||
|
0x02, 0xE0, 0x3C, 0x01, 0x80, 0x14, 0x01, 0x40, 0x14, 0x03, 0x20, 0x21,
|
||||||
|
0x0C, 0x0F, 0x80, 0xFF, 0xF8, 0x01, 0x80, 0x18, 0x03, 0x00, 0x20, 0x02,
|
||||||
|
0x00, 0x20, 0x04, 0x00, 0x40, 0x04, 0x00, 0xC0, 0x08, 0x00, 0x80, 0x18,
|
||||||
|
0x01, 0x00, 0x10, 0x01, 0x00, 0x30, 0x02, 0x00, 0x20, 0x02, 0x00, 0x0F,
|
||||||
|
0x81, 0x83, 0x10, 0x05, 0x80, 0x38, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x03,
|
||||||
|
0x40, 0x11, 0x83, 0x07, 0xF0, 0x60, 0xC4, 0x01, 0x60, 0x0E, 0x00, 0x30,
|
||||||
|
0x01, 0x80, 0x0E, 0x00, 0xD0, 0x04, 0x60, 0xC1, 0xFC, 0x00, 0x1F, 0x03,
|
||||||
|
0x08, 0x40, 0x4C, 0x02, 0x80, 0x28, 0x02, 0x80, 0x18, 0x03, 0xC0, 0x74,
|
||||||
|
0x05, 0x21, 0x91, 0xF1, 0x00, 0x10, 0x03, 0x00, 0x20, 0x02, 0x00, 0x40,
|
||||||
|
0x0C, 0x01, 0x80, 0x60, 0xF8, 0x00, 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x00,
|
||||||
|
0x1D, 0xFF, 0xFD, 0xC0, 0x1C, 0x7C, 0xF9, 0xF1, 0xC0, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xF1, 0xE3, 0x8F, 0x1C, 0x38, 0xE1, 0xC3, 0x06, 0x00, 0x00, 0x06,
|
||||||
|
0x00, 0x18, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x06, 0x00, 0x38,
|
||||||
|
0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x18, 0x00, 0x1C, 0x00, 0x0E,
|
||||||
|
0x00, 0x07, 0x00, 0x03, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x07, 0xFF, 0xFC, 0xC0, 0x00, 0xC0, 0x00, 0xE0, 0x00, 0x70,
|
||||||
|
0x00, 0x38, 0x00, 0x1C, 0x00, 0x0C, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x70,
|
||||||
|
0x03, 0x80, 0x0C, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0x60, 0x00, 0x3F,
|
||||||
|
0x8E, 0x0C, 0x80, 0x28, 0x01, 0x80, 0x10, 0x01, 0x00, 0x10, 0x02, 0x00,
|
||||||
|
0xC0, 0x38, 0x06, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E,
|
||||||
|
0x01, 0xF0, 0x1F, 0x00, 0xE0, 0x0F, 0x01, 0x86, 0x08, 0x08, 0x80, 0x24,
|
||||||
|
0x01, 0x40, 0x0A, 0x00, 0x50, 0x1E, 0x83, 0x14, 0x20, 0xA2, 0x05, 0x10,
|
||||||
|
0x28, 0x81, 0x46, 0x0A, 0x18, 0x50, 0x3F, 0x80, 0x04, 0x00, 0x10, 0x00,
|
||||||
|
0x80, 0x02, 0x00, 0x18, 0x18, 0x3F, 0x00, 0x1F, 0xF0, 0x00, 0x06, 0x80,
|
||||||
|
0x00, 0x34, 0x00, 0x01, 0x30, 0x00, 0x18, 0x80, 0x00, 0x86, 0x00, 0x04,
|
||||||
|
0x30, 0x00, 0x60, 0x80, 0x02, 0x06, 0x00, 0x10, 0x10, 0x01, 0x80, 0x80,
|
||||||
|
0x08, 0x06, 0x00, 0x7F, 0xF0, 0x06, 0x00, 0x80, 0x20, 0x06, 0x01, 0x00,
|
||||||
|
0x10, 0x18, 0x00, 0xC0, 0x80, 0x06, 0x04, 0x00, 0x11, 0xFC, 0x0F, 0xF0,
|
||||||
|
0xFF, 0xF8, 0x04, 0x01, 0x01, 0x00, 0x20, 0x40, 0x04, 0x10, 0x01, 0x04,
|
||||||
|
0x00, 0x41, 0x00, 0x10, 0x40, 0x08, 0x10, 0x0C, 0x07, 0xFF, 0x01, 0x00,
|
||||||
|
0x70, 0x40, 0x06, 0x10, 0x00, 0x84, 0x00, 0x11, 0x00, 0x04, 0x40, 0x01,
|
||||||
|
0x10, 0x00, 0x44, 0x00, 0x21, 0x00, 0x33, 0xFF, 0xF8, 0x03, 0xF1, 0x06,
|
||||||
|
0x0E, 0x8C, 0x01, 0xC4, 0x00, 0x64, 0x00, 0x12, 0x00, 0x0A, 0x00, 0x01,
|
||||||
|
0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00,
|
||||||
|
0x04, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x20, 0x01, 0x88, 0x01, 0x83,
|
||||||
|
0x03, 0x80, 0x7E, 0x00, 0xFF, 0xE0, 0x20, 0x18, 0x20, 0x0C, 0x20, 0x04,
|
||||||
|
0x20, 0x02, 0x20, 0x02, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01,
|
||||||
|
0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x02, 0x20, 0x02,
|
||||||
|
0x20, 0x04, 0x20, 0x0C, 0x20, 0x18, 0xFF, 0xE0, 0xFF, 0xFF, 0x08, 0x00,
|
||||||
|
0x84, 0x00, 0x42, 0x00, 0x21, 0x00, 0x10, 0x80, 0x00, 0x40, 0x00, 0x20,
|
||||||
|
0x40, 0x10, 0x20, 0x0F, 0xF0, 0x04, 0x08, 0x02, 0x04, 0x01, 0x00, 0x00,
|
||||||
|
0x80, 0x00, 0x40, 0x02, 0x20, 0x01, 0x10, 0x00, 0x88, 0x00, 0x44, 0x00,
|
||||||
|
0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0x88, 0x00, 0x44, 0x00, 0x22, 0x00, 0x11,
|
||||||
|
0x00, 0x08, 0x80, 0x00, 0x40, 0x00, 0x20, 0x40, 0x10, 0x20, 0x0F, 0xF0,
|
||||||
|
0x04, 0x08, 0x02, 0x04, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20,
|
||||||
|
0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x1F, 0xF8, 0x00, 0x03, 0xF9,
|
||||||
|
0x06, 0x07, 0x84, 0x00, 0xC4, 0x00, 0x24, 0x00, 0x12, 0x00, 0x02, 0x00,
|
||||||
|
0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x0F, 0xF8,
|
||||||
|
0x00, 0x14, 0x00, 0x09, 0x00, 0x04, 0x80, 0x02, 0x20, 0x01, 0x18, 0x00,
|
||||||
|
0x83, 0x01, 0xC0, 0x7F, 0x00, 0xFC, 0x3F, 0x20, 0x04, 0x20, 0x04, 0x20,
|
||||||
|
0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x3F,
|
||||||
|
0xFC, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20,
|
||||||
|
0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0xFC, 0x3F, 0xFF, 0xF8, 0x10,
|
||||||
|
0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00,
|
||||||
|
0x10, 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02,
|
||||||
|
0x00, 0x10, 0x00, 0x81, 0xFF, 0xF0, 0x03, 0xFF, 0x80, 0x04, 0x00, 0x02,
|
||||||
|
0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00,
|
||||||
|
0x08, 0x00, 0x04, 0x00, 0x02, 0x10, 0x01, 0x08, 0x00, 0x84, 0x00, 0x42,
|
||||||
|
0x00, 0x21, 0x00, 0x10, 0x80, 0x10, 0x20, 0x18, 0x0C, 0x18, 0x01, 0xF0,
|
||||||
|
0x00, 0xFF, 0x1F, 0x84, 0x01, 0x81, 0x00, 0xC0, 0x40, 0x60, 0x10, 0x30,
|
||||||
|
0x04, 0x18, 0x01, 0x0C, 0x00, 0x46, 0x00, 0x13, 0x00, 0x05, 0xF0, 0x01,
|
||||||
|
0xC6, 0x00, 0x60, 0xC0, 0x10, 0x18, 0x04, 0x06, 0x01, 0x00, 0xC0, 0x40,
|
||||||
|
0x30, 0x10, 0x04, 0x04, 0x01, 0x81, 0x00, 0x23, 0xFC, 0x0F, 0xFF, 0x80,
|
||||||
|
0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04,
|
||||||
|
0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00,
|
||||||
|
0x42, 0x00, 0x84, 0x01, 0x08, 0x02, 0x10, 0x04, 0x20, 0x0F, 0xFF, 0xF0,
|
||||||
|
0xF0, 0x01, 0xE7, 0x00, 0x70, 0xA0, 0x0A, 0x16, 0x03, 0x42, 0x40, 0x48,
|
||||||
|
0x4C, 0x19, 0x08, 0x82, 0x21, 0x10, 0x44, 0x23, 0x18, 0x84, 0x22, 0x10,
|
||||||
|
0x86, 0xC2, 0x10, 0x50, 0x42, 0x0E, 0x08, 0x41, 0xC1, 0x08, 0x00, 0x21,
|
||||||
|
0x00, 0x04, 0x20, 0x00, 0x84, 0x00, 0x10, 0x80, 0x02, 0x7F, 0x03, 0xF0,
|
||||||
|
0xF8, 0x1F, 0xC6, 0x00, 0x41, 0xC0, 0x10, 0x50, 0x04, 0x12, 0x01, 0x04,
|
||||||
|
0xC0, 0x41, 0x10, 0x10, 0x46, 0x04, 0x10, 0x81, 0x04, 0x10, 0x41, 0x04,
|
||||||
|
0x10, 0x40, 0x84, 0x10, 0x31, 0x04, 0x04, 0x41, 0x01, 0x90, 0x40, 0x24,
|
||||||
|
0x10, 0x05, 0x04, 0x01, 0xC1, 0x00, 0x31, 0xFC, 0x0C, 0x03, 0xE0, 0x06,
|
||||||
|
0x0C, 0x04, 0x01, 0x04, 0x00, 0x46, 0x00, 0x32, 0x00, 0x0B, 0x00, 0x05,
|
||||||
|
0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00,
|
||||||
|
0x0E, 0x00, 0x0D, 0x00, 0x04, 0xC0, 0x06, 0x20, 0x02, 0x08, 0x02, 0x03,
|
||||||
|
0x06, 0x00, 0x7C, 0x00, 0xFF, 0xF0, 0x10, 0x0C, 0x10, 0x02, 0x10, 0x03,
|
||||||
|
0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x03, 0x10, 0x06, 0x10, 0x0C,
|
||||||
|
0x1F, 0xF0, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00,
|
||||||
|
0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0xFF, 0xC0, 0x03, 0xE0, 0x06, 0x0C,
|
||||||
|
0x04, 0x01, 0x04, 0x00, 0x46, 0x00, 0x32, 0x00, 0x0B, 0x00, 0x07, 0x00,
|
||||||
|
0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0E,
|
||||||
|
0x00, 0x0D, 0x00, 0x04, 0xC0, 0x06, 0x20, 0x02, 0x08, 0x02, 0x03, 0x06,
|
||||||
|
0x00, 0xFC, 0x00, 0x30, 0x00, 0x30, 0x00, 0x7F, 0xC6, 0x38, 0x1E, 0xFF,
|
||||||
|
0xF0, 0x02, 0x01, 0x80, 0x40, 0x08, 0x08, 0x01, 0x81, 0x00, 0x10, 0x20,
|
||||||
|
0x02, 0x04, 0x00, 0x40, 0x80, 0x18, 0x10, 0x06, 0x02, 0x03, 0x80, 0x7F,
|
||||||
|
0xC0, 0x08, 0x18, 0x01, 0x01, 0x80, 0x20, 0x18, 0x04, 0x01, 0x80, 0x80,
|
||||||
|
0x10, 0x10, 0x03, 0x02, 0x00, 0x20, 0x40, 0x06, 0x7F, 0x80, 0x70, 0x0F,
|
||||||
|
0xC8, 0x61, 0xE2, 0x01, 0x90, 0x02, 0x40, 0x09, 0x00, 0x04, 0x00, 0x08,
|
||||||
|
0x00, 0x38, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18,
|
||||||
|
0x00, 0x60, 0x01, 0x80, 0x0F, 0x00, 0x2B, 0x03, 0x23, 0xF0, 0xFF, 0xFF,
|
||||||
|
0x02, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x10, 0x20, 0x20, 0x00, 0x40, 0x00,
|
||||||
|
0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20,
|
||||||
|
0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x01, 0xFF, 0xC0,
|
||||||
|
0xFC, 0x1F, 0x90, 0x01, 0x08, 0x00, 0x84, 0x00, 0x42, 0x00, 0x21, 0x00,
|
||||||
|
0x10, 0x80, 0x08, 0x40, 0x04, 0x20, 0x02, 0x10, 0x01, 0x08, 0x00, 0x84,
|
||||||
|
0x00, 0x42, 0x00, 0x21, 0x00, 0x10, 0x80, 0x08, 0x40, 0x04, 0x10, 0x04,
|
||||||
|
0x0C, 0x06, 0x03, 0x06, 0x00, 0x7C, 0x00, 0xFE, 0x03, 0xF8, 0x80, 0x02,
|
||||||
|
0x04, 0x00, 0x10, 0x30, 0x01, 0x80, 0x80, 0x08, 0x06, 0x00, 0xC0, 0x30,
|
||||||
|
0x06, 0x00, 0x80, 0x20, 0x06, 0x03, 0x00, 0x30, 0x10, 0x00, 0x80, 0x80,
|
||||||
|
0x06, 0x0C, 0x00, 0x10, 0x40, 0x00, 0x86, 0x00, 0x06, 0x20, 0x00, 0x11,
|
||||||
|
0x00, 0x00, 0xD8, 0x00, 0x06, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00,
|
||||||
|
0xFC, 0x0F, 0xE8, 0x00, 0x19, 0x00, 0x03, 0x10, 0x00, 0x62, 0x00, 0x08,
|
||||||
|
0x41, 0x81, 0x08, 0x28, 0x21, 0x05, 0x04, 0x21, 0xA0, 0x84, 0x36, 0x30,
|
||||||
|
0x84, 0x46, 0x08, 0x88, 0xC1, 0x31, 0x18, 0x24, 0x12, 0x04, 0x82, 0x40,
|
||||||
|
0xB0, 0x48, 0x14, 0x09, 0x02, 0x80, 0xA0, 0x30, 0x1C, 0x06, 0x03, 0x80,
|
||||||
|
0x7E, 0x0F, 0xC2, 0x00, 0x60, 0x60, 0x0C, 0x06, 0x03, 0x00, 0x60, 0xC0,
|
||||||
|
0x0C, 0x10, 0x00, 0xC6, 0x00, 0x0D, 0x80, 0x00, 0xA0, 0x00, 0x1C, 0x00,
|
||||||
|
0x03, 0x80, 0x00, 0xD8, 0x00, 0x11, 0x00, 0x06, 0x30, 0x01, 0x83, 0x00,
|
||||||
|
0x60, 0x30, 0x08, 0x06, 0x03, 0x00, 0x60, 0xC0, 0x06, 0x7F, 0x07, 0xF0,
|
||||||
|
0xFC, 0x1F, 0x98, 0x03, 0x04, 0x01, 0x03, 0x01, 0x80, 0xC1, 0x80, 0x20,
|
||||||
|
0x80, 0x18, 0xC0, 0x04, 0x40, 0x03, 0x60, 0x00, 0xE0, 0x00, 0x20, 0x00,
|
||||||
|
0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x80,
|
||||||
|
0x00, 0x40, 0x00, 0x20, 0x03, 0xFF, 0x80, 0xFF, 0xF4, 0x00, 0xA0, 0x09,
|
||||||
|
0x00, 0x48, 0x04, 0x40, 0x40, 0x02, 0x00, 0x20, 0x02, 0x00, 0x10, 0x01,
|
||||||
|
0x00, 0x10, 0x00, 0x80, 0x08, 0x04, 0x80, 0x24, 0x01, 0x40, 0x0C, 0x00,
|
||||||
|
0x60, 0x03, 0xFF, 0xF0, 0xFC, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0x08,
|
||||||
|
0x42, 0x10, 0x84, 0x21, 0x08, 0x42, 0x10, 0xF8, 0x80, 0x02, 0x00, 0x10,
|
||||||
|
0x00, 0xC0, 0x02, 0x00, 0x18, 0x00, 0x40, 0x03, 0x00, 0x08, 0x00, 0x40,
|
||||||
|
0x01, 0x00, 0x08, 0x00, 0x20, 0x01, 0x00, 0x04, 0x00, 0x20, 0x00, 0x80,
|
||||||
|
0x04, 0x00, 0x10, 0x00, 0x80, 0x02, 0x00, 0x10, 0x00, 0x40, 0x02, 0x00,
|
||||||
|
0x08, 0x00, 0x40, 0xF8, 0x42, 0x10, 0x84, 0x21, 0x08, 0x42, 0x10, 0x84,
|
||||||
|
0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0xF8, 0x02, 0x00, 0x38, 0x03, 0x60,
|
||||||
|
0x11, 0x01, 0x8C, 0x18, 0x31, 0x80, 0xD8, 0x03, 0x80, 0x08, 0xFF, 0xFF,
|
||||||
|
0xF8, 0xC1, 0x83, 0x06, 0x0C, 0x0F, 0xC0, 0x70, 0x30, 0x00, 0x10, 0x00,
|
||||||
|
0x08, 0x00, 0x08, 0x00, 0x08, 0x0F, 0xF8, 0x30, 0x08, 0x40, 0x08, 0x80,
|
||||||
|
0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x38, 0x60, 0xE8, 0x3F, 0x8F, 0xF0,
|
||||||
|
0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x04, 0x00,
|
||||||
|
0x01, 0x0F, 0x80, 0x4C, 0x18, 0x14, 0x01, 0x06, 0x00, 0x21, 0x80, 0x08,
|
||||||
|
0x40, 0x01, 0x10, 0x00, 0x44, 0x00, 0x11, 0x00, 0x04, 0x40, 0x01, 0x18,
|
||||||
|
0x00, 0x86, 0x00, 0x21, 0xC0, 0x10, 0x5C, 0x18, 0xF1, 0xF8, 0x00, 0x07,
|
||||||
|
0xE4, 0x30, 0x78, 0x80, 0x32, 0x00, 0x24, 0x00, 0x50, 0x00, 0x20, 0x00,
|
||||||
|
0x40, 0x00, 0x80, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x12, 0x00, 0xC3,
|
||||||
|
0x07, 0x01, 0xF8, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00,
|
||||||
|
0x08, 0x00, 0x02, 0x00, 0x00, 0x80, 0x7C, 0x20, 0x60, 0xC8, 0x20, 0x0A,
|
||||||
|
0x10, 0x01, 0x84, 0x00, 0x62, 0x00, 0x08, 0x80, 0x02, 0x20, 0x00, 0x88,
|
||||||
|
0x00, 0x22, 0x00, 0x08, 0xC0, 0x06, 0x10, 0x01, 0x82, 0x00, 0xE0, 0x60,
|
||||||
|
0xE8, 0x0F, 0xE3, 0xC0, 0x07, 0xE0, 0x1C, 0x18, 0x30, 0x0C, 0x60, 0x06,
|
||||||
|
0x40, 0x03, 0xC0, 0x03, 0xC0, 0x01, 0xFF, 0xFF, 0xC0, 0x00, 0xC0, 0x00,
|
||||||
|
0x40, 0x00, 0x60, 0x00, 0x30, 0x03, 0x0C, 0x0E, 0x03, 0xF0, 0x03, 0xFC,
|
||||||
|
0x18, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, 0x0F, 0xFF, 0x82, 0x00,
|
||||||
|
0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80,
|
||||||
|
0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0xFF, 0xF0, 0x0F,
|
||||||
|
0xC7, 0x9C, 0x3A, 0x18, 0x07, 0x08, 0x01, 0x8C, 0x00, 0xC4, 0x00, 0x22,
|
||||||
|
0x00, 0x11, 0x00, 0x08, 0x80, 0x04, 0x40, 0x02, 0x10, 0x03, 0x08, 0x01,
|
||||||
|
0x82, 0x01, 0x40, 0xC3, 0x20, 0x3F, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00,
|
||||||
|
0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7F, 0x00, 0xF0, 0x00,
|
||||||
|
0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x47,
|
||||||
|
0xC0, 0x2C, 0x18, 0x1C, 0x04, 0x0C, 0x01, 0x04, 0x00, 0x82, 0x00, 0x41,
|
||||||
|
0x00, 0x20, 0x80, 0x10, 0x40, 0x08, 0x20, 0x04, 0x10, 0x02, 0x08, 0x01,
|
||||||
|
0x04, 0x00, 0x82, 0x00, 0x47, 0xC0, 0xF8, 0x06, 0x00, 0x18, 0x00, 0x60,
|
||||||
|
0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x02, 0x00, 0x08,
|
||||||
|
0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02,
|
||||||
|
0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x03, 0xFF, 0xF0, 0x03, 0x00,
|
||||||
|
0xC0, 0x30, 0x0C, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x40, 0x10, 0x04,
|
||||||
|
0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00,
|
||||||
|
0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, 0x08, 0x06, 0xFE, 0x00, 0xF0,
|
||||||
|
0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
|
||||||
|
0xFE, 0x10, 0x30, 0x10, 0xE0, 0x11, 0xC0, 0x13, 0x00, 0x16, 0x00, 0x1E,
|
||||||
|
0x00, 0x1B, 0x00, 0x11, 0x80, 0x10, 0xC0, 0x10, 0x60, 0x10, 0x30, 0x10,
|
||||||
|
0x18, 0x10, 0x1C, 0xF0, 0x3F, 0x7E, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80,
|
||||||
|
0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20,
|
||||||
|
0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08,
|
||||||
|
0x00, 0x20, 0x00, 0x80, 0xFF, 0xFC, 0xEF, 0x9E, 0x07, 0x1E, 0x20, 0xC1,
|
||||||
|
0x82, 0x10, 0x20, 0x42, 0x04, 0x08, 0x40, 0x81, 0x08, 0x10, 0x21, 0x02,
|
||||||
|
0x04, 0x20, 0x40, 0x84, 0x08, 0x10, 0x81, 0x02, 0x10, 0x20, 0x42, 0x04,
|
||||||
|
0x08, 0x40, 0x81, 0x3E, 0x1C, 0x38, 0x71, 0xF0, 0x0B, 0x06, 0x07, 0x01,
|
||||||
|
0x03, 0x00, 0x41, 0x00, 0x20, 0x80, 0x10, 0x40, 0x08, 0x20, 0x04, 0x10,
|
||||||
|
0x02, 0x08, 0x01, 0x04, 0x00, 0x82, 0x00, 0x41, 0x00, 0x20, 0x80, 0x13,
|
||||||
|
0xF0, 0x3E, 0x07, 0xC0, 0x30, 0x60, 0x80, 0x22, 0x00, 0x24, 0x00, 0x50,
|
||||||
|
0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x05, 0x00, 0x12, 0x00,
|
||||||
|
0x22, 0x00, 0x83, 0x06, 0x01, 0xF0, 0x00, 0xF1, 0xFC, 0x05, 0xC1, 0x81,
|
||||||
|
0xC0, 0x10, 0x60, 0x02, 0x18, 0x00, 0xC4, 0x00, 0x11, 0x00, 0x04, 0x40,
|
||||||
|
0x01, 0x10, 0x00, 0x44, 0x00, 0x11, 0x80, 0x08, 0x60, 0x02, 0x14, 0x01,
|
||||||
|
0x04, 0xC1, 0x81, 0x0F, 0x80, 0x40, 0x00, 0x10, 0x00, 0x04, 0x00, 0x01,
|
||||||
|
0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xE3, 0xC6,
|
||||||
|
0x0E, 0x86, 0x00, 0xE1, 0x00, 0x18, 0xC0, 0x06, 0x20, 0x00, 0x88, 0x00,
|
||||||
|
0x22, 0x00, 0x08, 0x80, 0x02, 0x20, 0x00, 0x84, 0x00, 0x61, 0x00, 0x18,
|
||||||
|
0x20, 0x0A, 0x06, 0x0C, 0x80, 0x7C, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00,
|
||||||
|
0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, 0x0F, 0xF0, 0xF8,
|
||||||
|
0x7C, 0x11, 0x8C, 0x2C, 0x00, 0x70, 0x00, 0xC0, 0x01, 0x00, 0x02, 0x00,
|
||||||
|
0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01,
|
||||||
|
0x00, 0x3F, 0xFC, 0x00, 0x0F, 0xD1, 0x83, 0x98, 0x04, 0x80, 0x24, 0x00,
|
||||||
|
0x30, 0x00, 0xF0, 0x00, 0xFC, 0x00, 0x30, 0x00, 0xE0, 0x03, 0x00, 0x1C,
|
||||||
|
0x01, 0xF0, 0x1A, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08,
|
||||||
|
0x00, 0x08, 0x00, 0xFF, 0xFC, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08,
|
||||||
|
0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08,
|
||||||
|
0x00, 0x08, 0x00, 0x08, 0x01, 0x06, 0x0F, 0x03, 0xF8, 0xF0, 0x3E, 0x08,
|
||||||
|
0x01, 0x04, 0x00, 0x82, 0x00, 0x41, 0x00, 0x20, 0x80, 0x10, 0x40, 0x08,
|
||||||
|
0x20, 0x04, 0x10, 0x02, 0x08, 0x01, 0x04, 0x00, 0x82, 0x00, 0x41, 0x00,
|
||||||
|
0xE0, 0x41, 0xD0, 0x1F, 0x8E, 0xFE, 0x0F, 0xE2, 0x00, 0x20, 0x60, 0x0C,
|
||||||
|
0x0C, 0x01, 0x80, 0x80, 0x20, 0x18, 0x0C, 0x01, 0x01, 0x00, 0x30, 0x60,
|
||||||
|
0x02, 0x08, 0x00, 0x41, 0x00, 0x0C, 0x60, 0x00, 0x88, 0x00, 0x19, 0x00,
|
||||||
|
0x01, 0x40, 0x00, 0x38, 0x00, 0xFC, 0x07, 0xE4, 0x00, 0x10, 0x80, 0x02,
|
||||||
|
0x18, 0x20, 0xC3, 0x0E, 0x18, 0x21, 0x42, 0x04, 0x28, 0x40, 0x8D, 0x88,
|
||||||
|
0x19, 0x93, 0x03, 0x22, 0x60, 0x2C, 0x68, 0x05, 0x85, 0x00, 0xA0, 0xA0,
|
||||||
|
0x1C, 0x1C, 0x01, 0x81, 0x80, 0x7C, 0x1F, 0x18, 0x03, 0x06, 0x03, 0x01,
|
||||||
|
0x83, 0x00, 0x63, 0x00, 0x1B, 0x00, 0x07, 0x00, 0x03, 0x80, 0x03, 0x60,
|
||||||
|
0x03, 0x18, 0x03, 0x06, 0x03, 0x01, 0x83, 0x00, 0x61, 0x00, 0x33, 0xF0,
|
||||||
|
0x7E, 0xFC, 0x1F, 0x90, 0x01, 0x8C, 0x00, 0x86, 0x00, 0xC1, 0x80, 0x40,
|
||||||
|
0xC0, 0x60, 0x20, 0x20, 0x18, 0x30, 0x04, 0x10, 0x03, 0x08, 0x00, 0x8C,
|
||||||
|
0x00, 0x64, 0x00, 0x16, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x01, 0x00, 0x01,
|
||||||
|
0x80, 0x00, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x20, 0x07, 0xFE, 0x00,
|
||||||
|
0xFF, 0xF4, 0x01, 0x20, 0x09, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00,
|
||||||
|
0xC0, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x14, 0x00, 0xA0, 0x07, 0xFF,
|
||||||
|
0xE0, 0x07, 0x0C, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
|
||||||
|
0x30, 0xC0, 0x30, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
|
||||||
|
0x0C, 0x07, 0xFF, 0xFF, 0xFF, 0x80, 0xE0, 0x30, 0x10, 0x10, 0x10, 0x10,
|
||||||
|
0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x07, 0x0C, 0x10, 0x10, 0x10, 0x10,
|
||||||
|
0x10, 0x10, 0x10, 0x10, 0x10, 0x30, 0xE0, 0x1C, 0x00, 0x44, 0x0D, 0x84,
|
||||||
|
0x36, 0x04, 0x40, 0x07, 0x00};
|
||||||
|
|
||||||
|
const GFXglyph FreeMono18pt7bGlyphs[] PROGMEM = {
|
||||||
|
{0, 0, 0, 21, 0, 1}, // 0x20 ' '
|
||||||
|
{0, 4, 22, 21, 8, -21}, // 0x21 '!'
|
||||||
|
{11, 11, 10, 21, 5, -20}, // 0x22 '"'
|
||||||
|
{25, 14, 24, 21, 3, -21}, // 0x23 '#'
|
||||||
|
{67, 13, 26, 21, 4, -22}, // 0x24 '$'
|
||||||
|
{110, 15, 21, 21, 3, -20}, // 0x25 '%'
|
||||||
|
{150, 12, 18, 21, 4, -17}, // 0x26 '&'
|
||||||
|
{177, 4, 10, 21, 8, -20}, // 0x27 '''
|
||||||
|
{182, 5, 25, 21, 10, -20}, // 0x28 '('
|
||||||
|
{198, 5, 25, 21, 6, -20}, // 0x29 ')'
|
||||||
|
{214, 13, 12, 21, 4, -20}, // 0x2A '*'
|
||||||
|
{234, 15, 17, 21, 3, -17}, // 0x2B '+'
|
||||||
|
{266, 7, 10, 21, 5, -4}, // 0x2C ','
|
||||||
|
{275, 15, 1, 21, 3, -9}, // 0x2D '-'
|
||||||
|
{277, 5, 5, 21, 8, -4}, // 0x2E '.'
|
||||||
|
{281, 13, 26, 21, 4, -22}, // 0x2F '/'
|
||||||
|
{324, 13, 21, 21, 4, -20}, // 0x30 '0'
|
||||||
|
{359, 13, 21, 21, 4, -20}, // 0x31 '1'
|
||||||
|
{394, 13, 21, 21, 3, -20}, // 0x32 '2'
|
||||||
|
{429, 14, 21, 21, 3, -20}, // 0x33 '3'
|
||||||
|
{466, 12, 21, 21, 4, -20}, // 0x34 '4'
|
||||||
|
{498, 14, 21, 21, 3, -20}, // 0x35 '5'
|
||||||
|
{535, 12, 21, 21, 5, -20}, // 0x36 '6'
|
||||||
|
{567, 12, 21, 21, 4, -20}, // 0x37 '7'
|
||||||
|
{599, 13, 21, 21, 4, -20}, // 0x38 '8'
|
||||||
|
{634, 12, 21, 21, 5, -20}, // 0x39 '9'
|
||||||
|
{666, 5, 15, 21, 8, -14}, // 0x3A ':'
|
||||||
|
{676, 7, 20, 21, 5, -14}, // 0x3B ';'
|
||||||
|
{694, 15, 16, 21, 3, -17}, // 0x3C '<'
|
||||||
|
{724, 17, 6, 21, 2, -12}, // 0x3D '='
|
||||||
|
{737, 15, 16, 21, 3, -17}, // 0x3E '>'
|
||||||
|
{767, 12, 20, 21, 5, -19}, // 0x3F '?'
|
||||||
|
{797, 13, 23, 21, 4, -20}, // 0x40 '@'
|
||||||
|
{835, 21, 20, 21, 0, -19}, // 0x41 'A'
|
||||||
|
{888, 18, 20, 21, 1, -19}, // 0x42 'B'
|
||||||
|
{933, 17, 20, 21, 2, -19}, // 0x43 'C'
|
||||||
|
{976, 16, 20, 21, 2, -19}, // 0x44 'D'
|
||||||
|
{1016, 17, 20, 21, 1, -19}, // 0x45 'E'
|
||||||
|
{1059, 17, 20, 21, 1, -19}, // 0x46 'F'
|
||||||
|
{1102, 17, 20, 21, 2, -19}, // 0x47 'G'
|
||||||
|
{1145, 16, 20, 21, 2, -19}, // 0x48 'H'
|
||||||
|
{1185, 13, 20, 21, 4, -19}, // 0x49 'I'
|
||||||
|
{1218, 17, 20, 21, 3, -19}, // 0x4A 'J'
|
||||||
|
{1261, 18, 20, 21, 1, -19}, // 0x4B 'K'
|
||||||
|
{1306, 15, 20, 21, 3, -19}, // 0x4C 'L'
|
||||||
|
{1344, 19, 20, 21, 1, -19}, // 0x4D 'M'
|
||||||
|
{1392, 18, 20, 21, 1, -19}, // 0x4E 'N'
|
||||||
|
{1437, 17, 20, 21, 2, -19}, // 0x4F 'O'
|
||||||
|
{1480, 16, 20, 21, 1, -19}, // 0x50 'P'
|
||||||
|
{1520, 17, 24, 21, 2, -19}, // 0x51 'Q'
|
||||||
|
{1571, 19, 20, 21, 1, -19}, // 0x52 'R'
|
||||||
|
{1619, 14, 20, 21, 3, -19}, // 0x53 'S'
|
||||||
|
{1654, 15, 20, 21, 3, -19}, // 0x54 'T'
|
||||||
|
{1692, 17, 20, 21, 2, -19}, // 0x55 'U'
|
||||||
|
{1735, 21, 20, 21, 0, -19}, // 0x56 'V'
|
||||||
|
{1788, 19, 20, 21, 1, -19}, // 0x57 'W'
|
||||||
|
{1836, 19, 20, 21, 1, -19}, // 0x58 'X'
|
||||||
|
{1884, 17, 20, 21, 2, -19}, // 0x59 'Y'
|
||||||
|
{1927, 13, 20, 21, 4, -19}, // 0x5A 'Z'
|
||||||
|
{1960, 5, 25, 21, 10, -20}, // 0x5B '['
|
||||||
|
{1976, 13, 26, 21, 4, -22}, // 0x5C '\'
|
||||||
|
{2019, 5, 25, 21, 6, -20}, // 0x5D ']'
|
||||||
|
{2035, 13, 9, 21, 4, -20}, // 0x5E '^'
|
||||||
|
{2050, 21, 1, 21, 0, 4}, // 0x5F '_'
|
||||||
|
{2053, 6, 5, 21, 5, -21}, // 0x60 '`'
|
||||||
|
{2057, 16, 15, 21, 3, -14}, // 0x61 'a'
|
||||||
|
{2087, 18, 21, 21, 1, -20}, // 0x62 'b'
|
||||||
|
{2135, 15, 15, 21, 3, -14}, // 0x63 'c'
|
||||||
|
{2164, 18, 21, 21, 2, -20}, // 0x64 'd'
|
||||||
|
{2212, 16, 15, 21, 2, -14}, // 0x65 'e'
|
||||||
|
{2242, 14, 21, 21, 4, -20}, // 0x66 'f'
|
||||||
|
{2279, 17, 22, 21, 2, -14}, // 0x67 'g'
|
||||||
|
{2326, 17, 21, 21, 1, -20}, // 0x68 'h'
|
||||||
|
{2371, 14, 22, 21, 4, -21}, // 0x69 'i'
|
||||||
|
{2410, 10, 29, 21, 5, -21}, // 0x6A 'j'
|
||||||
|
{2447, 16, 21, 21, 2, -20}, // 0x6B 'k'
|
||||||
|
{2489, 14, 21, 21, 4, -20}, // 0x6C 'l'
|
||||||
|
{2526, 19, 15, 21, 1, -14}, // 0x6D 'm'
|
||||||
|
{2562, 17, 15, 21, 1, -14}, // 0x6E 'n'
|
||||||
|
{2594, 15, 15, 21, 3, -14}, // 0x6F 'o'
|
||||||
|
{2623, 18, 22, 21, 1, -14}, // 0x70 'p'
|
||||||
|
{2673, 18, 22, 21, 2, -14}, // 0x71 'q'
|
||||||
|
{2723, 15, 15, 21, 3, -14}, // 0x72 'r'
|
||||||
|
{2752, 13, 15, 21, 4, -14}, // 0x73 's'
|
||||||
|
{2777, 16, 20, 21, 1, -19}, // 0x74 't'
|
||||||
|
{2817, 17, 15, 21, 1, -14}, // 0x75 'u'
|
||||||
|
{2849, 19, 15, 21, 1, -14}, // 0x76 'v'
|
||||||
|
{2885, 19, 15, 21, 1, -14}, // 0x77 'w'
|
||||||
|
{2921, 17, 15, 21, 2, -14}, // 0x78 'x'
|
||||||
|
{2953, 17, 22, 21, 2, -14}, // 0x79 'y'
|
||||||
|
{3000, 13, 15, 21, 4, -14}, // 0x7A 'z'
|
||||||
|
{3025, 8, 25, 21, 6, -20}, // 0x7B '{'
|
||||||
|
{3050, 1, 25, 21, 10, -20}, // 0x7C '|'
|
||||||
|
{3054, 8, 25, 21, 7, -20}, // 0x7D '}'
|
||||||
|
{3079, 15, 5, 21, 3, -11}}; // 0x7E '~'
|
||||||
|
|
||||||
|
const GFXfont FreeMono18pt7b PROGMEM = {(uint8_t *)FreeMono18pt7bBitmaps,
|
||||||
|
(GFXglyph *)FreeMono18pt7bGlyphs, 0x20,
|
||||||
|
0x7E, 35};
|
||||||
|
|
||||||
|
// Approx. 3761 bytes
|
||||||
579
libraries/Adafruit_GFX_Library/Fonts/FreeMono24pt7b.h
Normal file
579
libraries/Adafruit_GFX_Library/Fonts/FreeMono24pt7b.h
Normal file
@@ -0,0 +1,579 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
|
||||||
|
const uint8_t FreeMono24pt7bBitmaps[] PROGMEM = {
|
||||||
|
0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x10, 0x84, 0x21, 0x08,
|
||||||
|
0x00, 0x00, 0x00, 0x03, 0xBF, 0xFF, 0xB8, 0xFE, 0x7F, 0x7C, 0x3E, 0x7C,
|
||||||
|
0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x3C,
|
||||||
|
0x3E, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x01,
|
||||||
|
0x86, 0x00, 0x30, 0xC0, 0x06, 0x18, 0x00, 0xC3, 0x00, 0x18, 0x60, 0x03,
|
||||||
|
0x0C, 0x00, 0x61, 0x80, 0x0C, 0x70, 0x01, 0x8C, 0x00, 0x61, 0x80, 0x0C,
|
||||||
|
0x30, 0x3F, 0xFF, 0xF7, 0xFF, 0xFE, 0x06, 0x18, 0x00, 0xC3, 0x00, 0x18,
|
||||||
|
0x60, 0x03, 0x0C, 0x00, 0x61, 0x80, 0x0C, 0x30, 0x7F, 0xFF, 0xEF, 0xFF,
|
||||||
|
0xFC, 0x06, 0x18, 0x00, 0xC7, 0x00, 0x38, 0xC0, 0x06, 0x18, 0x00, 0xC3,
|
||||||
|
0x00, 0x18, 0x60, 0x03, 0x0C, 0x00, 0x61, 0x80, 0x0C, 0x30, 0x01, 0x86,
|
||||||
|
0x00, 0x30, 0xC0, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x0F, 0xC0,
|
||||||
|
0x0F, 0xFD, 0x87, 0x03, 0xE3, 0x80, 0x39, 0xC0, 0x06, 0x60, 0x01, 0x98,
|
||||||
|
0x00, 0x06, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0xC0, 0x00, 0x7F,
|
||||||
|
0x80, 0x03, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03,
|
||||||
|
0x80, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, 0x80, 0x0E, 0xFC, 0x0F, 0x37,
|
||||||
|
0xFF, 0x80, 0x7F, 0x80, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C,
|
||||||
|
0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x07, 0x80, 0x01, 0xFE, 0x00, 0x38,
|
||||||
|
0x70, 0x03, 0x03, 0x00, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06,
|
||||||
|
0x01, 0x80, 0x30, 0x30, 0x03, 0x87, 0x00, 0x1F, 0xE0, 0x30, 0x78, 0x1F,
|
||||||
|
0x00, 0x1F, 0x80, 0x0F, 0xC0, 0x07, 0xE0, 0x03, 0xF0, 0x00, 0xF8, 0x00,
|
||||||
|
0x0C, 0x01, 0xE0, 0x00, 0x7F, 0x80, 0x0E, 0x1C, 0x00, 0xC0, 0xC0, 0x18,
|
||||||
|
0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x0C, 0x0E, 0x00,
|
||||||
|
0xE1, 0xC0, 0x07, 0xF8, 0x00, 0x1E, 0x00, 0x03, 0xEC, 0x01, 0xFF, 0x00,
|
||||||
|
0xE1, 0x00, 0x70, 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x30,
|
||||||
|
0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x7C, 0x00, 0x3B, 0x83,
|
||||||
|
0xD8, 0x60, 0xFE, 0x0C, 0x33, 0x03, 0x98, 0xC0, 0x66, 0x30, 0x0D, 0x8C,
|
||||||
|
0x03, 0xC3, 0x00, 0x70, 0x60, 0x1C, 0x1C, 0x0F, 0x03, 0x87, 0x7C, 0x7F,
|
||||||
|
0x9F, 0x07, 0x80, 0x00, 0xFE, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x3C,
|
||||||
|
0x70, 0xE1, 0xC3, 0x87, 0x00, 0x06, 0x1C, 0x30, 0xE1, 0x87, 0x0E, 0x18,
|
||||||
|
0x70, 0xE1, 0xC3, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x0C,
|
||||||
|
0x1C, 0x38, 0x70, 0x60, 0xE1, 0xC1, 0x83, 0x83, 0x06, 0x06, 0x04, 0xC1,
|
||||||
|
0xC1, 0x83, 0x83, 0x07, 0x0E, 0x0C, 0x1C, 0x38, 0x70, 0xE0, 0xE1, 0xC3,
|
||||||
|
0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0x87, 0x0E, 0x1C, 0x30, 0x61, 0xC3,
|
||||||
|
0x0E, 0x18, 0x70, 0xC1, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00,
|
||||||
|
0x03, 0x00, 0x00, 0xC0, 0x10, 0x30, 0x3F, 0x8C, 0x7C, 0xFF, 0xFC, 0x07,
|
||||||
|
0xF8, 0x00, 0x78, 0x00, 0x1F, 0x00, 0x0C, 0xC0, 0x06, 0x18, 0x03, 0x87,
|
||||||
|
0x00, 0xC0, 0xC0, 0x60, 0x18, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60,
|
||||||
|
0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06,
|
||||||
|
0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||||
|
0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00,
|
||||||
|
0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00,
|
||||||
|
0x1F, 0x8F, 0x87, 0xC7, 0xC3, 0xE1, 0xE1, 0xF0, 0xF0, 0x78, 0x38, 0x3C,
|
||||||
|
0x1C, 0x0E, 0x06, 0x00, 0x7F, 0xFF, 0xFD, 0xFF, 0xFF, 0xF0, 0x7D, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xEF, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x70, 0x00, 0x18, 0x00,
|
||||||
|
0x06, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x18, 0x00, 0x0C,
|
||||||
|
0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x30, 0x00, 0x0C, 0x00,
|
||||||
|
0x06, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x18, 0x00, 0x06,
|
||||||
|
0x00, 0x03, 0x80, 0x00, 0xC0, 0x00, 0x70, 0x00, 0x18, 0x00, 0x0E, 0x00,
|
||||||
|
0x03, 0x00, 0x01, 0xC0, 0x00, 0x60, 0x00, 0x38, 0x00, 0x0C, 0x00, 0x07,
|
||||||
|
0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x03,
|
||||||
|
0xF0, 0x03, 0xFF, 0x01, 0xE1, 0xE0, 0xE0, 0x18, 0x30, 0x03, 0x1C, 0x00,
|
||||||
|
0xE6, 0x00, 0x19, 0x80, 0x06, 0xE0, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x0F,
|
||||||
|
0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0,
|
||||||
|
0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF8, 0x00,
|
||||||
|
0x76, 0x00, 0x19, 0x80, 0x06, 0x70, 0x03, 0x8C, 0x00, 0xC3, 0x80, 0x60,
|
||||||
|
0x78, 0x78, 0x0F, 0xFC, 0x00, 0xFC, 0x00, 0x03, 0x80, 0x07, 0x80, 0x0F,
|
||||||
|
0x80, 0x1D, 0x80, 0x39, 0x80, 0x71, 0x80, 0xE1, 0x80, 0xC1, 0x80, 0x01,
|
||||||
|
0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
|
||||||
|
0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
|
||||||
|
0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
|
||||||
|
0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xF0, 0x03, 0xFF, 0x01, 0xC0, 0xE0,
|
||||||
|
0xC0, 0x1C, 0x60, 0x03, 0xB8, 0x00, 0x6C, 0x00, 0x0F, 0x00, 0x03, 0x00,
|
||||||
|
0x00, 0xC0, 0x00, 0x30, 0x00, 0x18, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01,
|
||||||
|
0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00,
|
||||||
|
0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30,
|
||||||
|
0x00, 0xD0, 0x00, 0x38, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x03,
|
||||||
|
0xF8, 0x01, 0xFF, 0xC0, 0x70, 0x3C, 0x18, 0x01, 0xC6, 0x00, 0x18, 0x00,
|
||||||
|
0x01, 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x18, 0x00,
|
||||||
|
0x06, 0x00, 0x01, 0xC0, 0x00, 0x70, 0x01, 0xFC, 0x00, 0x3F, 0x00, 0x00,
|
||||||
|
0x78, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00,
|
||||||
|
0x06, 0x00, 0x00, 0xC0, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, 0xD8, 0x00,
|
||||||
|
0x3B, 0x80, 0x0E, 0x3E, 0x07, 0x81, 0xFF, 0xE0, 0x07, 0xE0, 0x00, 0x00,
|
||||||
|
0x3C, 0x00, 0x7C, 0x00, 0x6C, 0x00, 0xCC, 0x00, 0x8C, 0x01, 0x8C, 0x03,
|
||||||
|
0x0C, 0x03, 0x0C, 0x06, 0x0C, 0x04, 0x0C, 0x0C, 0x0C, 0x08, 0x0C, 0x10,
|
||||||
|
0x0C, 0x30, 0x0C, 0x20, 0x0C, 0x60, 0x0C, 0x40, 0x0C, 0x80, 0x0C, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00,
|
||||||
|
0x0C, 0x00, 0x0C, 0x00, 0xFF, 0x00, 0xFF, 0x3F, 0xFF, 0x07, 0xFF, 0xE0,
|
||||||
|
0xC0, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x0C, 0x00, 0x01,
|
||||||
|
0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0xC7, 0xE0, 0x1F, 0xFF, 0x03,
|
||||||
|
0x80, 0x70, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0x60,
|
||||||
|
0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0xC0,
|
||||||
|
0x00, 0x30, 0x00, 0x06, 0xC0, 0x01, 0xDC, 0x00, 0x71, 0xF0, 0x3C, 0x0F,
|
||||||
|
0xFF, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x80, 0x3F, 0xF0, 0x3E, 0x00, 0x1E,
|
||||||
|
0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x00, 0xC0, 0x00, 0x70, 0x00,
|
||||||
|
0x18, 0x00, 0x06, 0x00, 0x03, 0x80, 0x00, 0xC1, 0xF8, 0x31, 0xFF, 0x0C,
|
||||||
|
0xF0, 0xF3, 0x70, 0x0C, 0xD8, 0x01, 0xBC, 0x00, 0x6E, 0x00, 0x0F, 0x80,
|
||||||
|
0x03, 0xC0, 0x00, 0xD8, 0x00, 0x36, 0x00, 0x0D, 0x80, 0x03, 0x30, 0x01,
|
||||||
|
0x8E, 0x00, 0x61, 0xC0, 0x30, 0x38, 0x38, 0x07, 0xFC, 0x00, 0x7C, 0x00,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x01, 0xC0,
|
||||||
|
0x00, 0x60, 0x00, 0x18, 0x00, 0x0E, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00,
|
||||||
|
0x30, 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x30,
|
||||||
|
0x00, 0x0C, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x30, 0x00,
|
||||||
|
0x0C, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x18, 0x00, 0x0C,
|
||||||
|
0x00, 0x03, 0x00, 0x03, 0xF0, 0x03, 0xFF, 0x03, 0xC0, 0xF1, 0xC0, 0x0E,
|
||||||
|
0x60, 0x01, 0xB8, 0x00, 0x7C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0,
|
||||||
|
0x00, 0x36, 0x00, 0x18, 0xC0, 0x0C, 0x1C, 0x0E, 0x03, 0xFF, 0x00, 0xFF,
|
||||||
|
0xC0, 0x70, 0x38, 0x30, 0x03, 0x18, 0x00, 0x66, 0x00, 0x1B, 0x00, 0x03,
|
||||||
|
0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0x60, 0x01, 0x98,
|
||||||
|
0x00, 0xE3, 0x00, 0x70, 0x70, 0x38, 0x0F, 0xFC, 0x00, 0xFC, 0x00, 0x07,
|
||||||
|
0xE0, 0x03, 0xFE, 0x01, 0xC1, 0xC0, 0xC0, 0x38, 0x60, 0x07, 0x18, 0x00,
|
||||||
|
0xCC, 0x00, 0x1B, 0x00, 0x06, 0xC0, 0x01, 0xB0, 0x00, 0x3C, 0x00, 0x1F,
|
||||||
|
0x00, 0x07, 0x60, 0x03, 0xD8, 0x01, 0xB3, 0x00, 0xCC, 0xF0, 0xF3, 0x0F,
|
||||||
|
0xF8, 0xC1, 0xF8, 0x30, 0x00, 0x1C, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00,
|
||||||
|
0xE0, 0x00, 0x30, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x07, 0x80,
|
||||||
|
0x07, 0xC0, 0xFF, 0xC0, 0x1F, 0xC0, 0x00, 0x7D, 0xFF, 0xFF, 0xFF, 0xEF,
|
||||||
|
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xF7, 0xC0, 0x0F, 0x87, 0xF1, 0xFC, 0x7F, 0x1F, 0xC3, 0xE0, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF1, 0xF8, 0x7C, 0x3F, 0x0F,
|
||||||
|
0x83, 0xE0, 0xF0, 0x7C, 0x1E, 0x07, 0x81, 0xC0, 0xF0, 0x38, 0x04, 0x00,
|
||||||
|
0x00, 0x00, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00,
|
||||||
|
0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x00,
|
||||||
|
0x00, 0x78, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00,
|
||||||
|
0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00,
|
||||||
|
0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x38, 0x00, 0x00,
|
||||||
|
0x20, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF,
|
||||||
|
0xFF, 0x7F, 0xFF, 0xFF, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00,
|
||||||
|
0x1E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x03,
|
||||||
|
0xC0, 0x00, 0x07, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x3C, 0x00, 0x01, 0xE0,
|
||||||
|
0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x01, 0xE0,
|
||||||
|
0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x0E, 0x00, 0x00, 0x60,
|
||||||
|
0x00, 0x00, 0x07, 0xF0, 0x1F, 0xFE, 0x3E, 0x07, 0x98, 0x00, 0xEC, 0x00,
|
||||||
|
0x36, 0x00, 0x0F, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x01, 0xC0,
|
||||||
|
0x00, 0xC0, 0x01, 0xC0, 0x03, 0xC0, 0x07, 0xC0, 0x07, 0x00, 0x03, 0x00,
|
||||||
|
0x01, 0x80, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x07, 0x80, 0x07, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00,
|
||||||
|
0x78, 0x00, 0x03, 0xF0, 0x03, 0xFF, 0x01, 0xE0, 0xE0, 0xE0, 0x1C, 0x30,
|
||||||
|
0x03, 0x1C, 0x00, 0x66, 0x00, 0x19, 0x80, 0x06, 0xC0, 0x01, 0xB0, 0x07,
|
||||||
|
0xEC, 0x07, 0xFB, 0x03, 0xC6, 0xC1, 0xC1, 0xB0, 0xE0, 0x6C, 0x30, 0x1B,
|
||||||
|
0x0C, 0x06, 0xC3, 0x01, 0xB0, 0xC0, 0x6C, 0x18, 0x1B, 0x07, 0x86, 0xC0,
|
||||||
|
0xFF, 0xF0, 0x0F, 0xFC, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x18, 0x00,
|
||||||
|
0x07, 0x00, 0x00, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x80, 0xC0, 0xFF, 0xF0,
|
||||||
|
0x0F, 0xE0, 0x07, 0xFF, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x1B, 0x00,
|
||||||
|
0x00, 0x01, 0x98, 0x00, 0x00, 0x11, 0x80, 0x00, 0x03, 0x0C, 0x00, 0x00,
|
||||||
|
0x30, 0xC0, 0x00, 0x06, 0x0C, 0x00, 0x00, 0x60, 0x60, 0x00, 0x06, 0x06,
|
||||||
|
0x00, 0x00, 0xC0, 0x30, 0x00, 0x0C, 0x03, 0x00, 0x00, 0x80, 0x30, 0x00,
|
||||||
|
0x18, 0x01, 0x80, 0x01, 0x80, 0x18, 0x00, 0x3F, 0xFF, 0x80, 0x03, 0xFF,
|
||||||
|
0xFC, 0x00, 0x20, 0x00, 0xC0, 0x06, 0x00, 0x06, 0x00, 0x60, 0x00, 0x60,
|
||||||
|
0x0C, 0x00, 0x06, 0x00, 0xC0, 0x00, 0x30, 0x0C, 0x00, 0x03, 0x01, 0x80,
|
||||||
|
0x00, 0x18, 0x7F, 0xC0, 0x3F, 0xF7, 0xFC, 0x03, 0xFF, 0xFF, 0xFF, 0x03,
|
||||||
|
0xFF, 0xFF, 0x01, 0x80, 0x0E, 0x06, 0x00, 0x1C, 0x18, 0x00, 0x38, 0x60,
|
||||||
|
0x00, 0x61, 0x80, 0x01, 0x86, 0x00, 0x06, 0x18, 0x00, 0x38, 0x60, 0x01,
|
||||||
|
0xC1, 0x80, 0x1E, 0x07, 0xFF, 0xE0, 0x1F, 0xFF, 0xC0, 0x60, 0x03, 0xC1,
|
||||||
|
0x80, 0x03, 0x86, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x60, 0x00, 0x31, 0x80,
|
||||||
|
0x00, 0xC6, 0x00, 0x03, 0x18, 0x00, 0x0C, 0x60, 0x00, 0x61, 0x80, 0x03,
|
||||||
|
0x86, 0x00, 0x1C, 0xFF, 0xFF, 0xE3, 0xFF, 0xFE, 0x00, 0x00, 0xFC, 0x00,
|
||||||
|
0x0F, 0xFE, 0x60, 0xF0, 0x3D, 0x87, 0x00, 0x3E, 0x38, 0x00, 0x38, 0xC0,
|
||||||
|
0x00, 0xE7, 0x00, 0x01, 0x98, 0x00, 0x06, 0x60, 0x00, 0x03, 0x00, 0x00,
|
||||||
|
0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C,
|
||||||
|
0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00,
|
||||||
|
0x00, 0x18, 0x00, 0x00, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00,
|
||||||
|
0xC7, 0x00, 0x06, 0x0E, 0x00, 0x70, 0x1E, 0x07, 0x80, 0x3F, 0xFC, 0x00,
|
||||||
|
0x1F, 0x80, 0xFF, 0xFE, 0x03, 0xFF, 0xFE, 0x03, 0x00, 0x3C, 0x0C, 0x00,
|
||||||
|
0x38, 0x30, 0x00, 0x70, 0xC0, 0x00, 0xC3, 0x00, 0x03, 0x8C, 0x00, 0x06,
|
||||||
|
0x30, 0x00, 0x1C, 0xC0, 0x00, 0x33, 0x00, 0x00, 0xCC, 0x00, 0x03, 0x30,
|
||||||
|
0x00, 0x0C, 0xC0, 0x00, 0x33, 0x00, 0x00, 0xCC, 0x00, 0x03, 0x30, 0x00,
|
||||||
|
0x0C, 0xC0, 0x00, 0x33, 0x00, 0x01, 0x8C, 0x00, 0x06, 0x30, 0x00, 0x30,
|
||||||
|
0xC0, 0x01, 0xC3, 0x00, 0x0E, 0x0C, 0x00, 0xF0, 0xFF, 0xFF, 0x83, 0xFF,
|
||||||
|
0xF8, 0x00, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xE1, 0x80, 0x01, 0x86, 0x00,
|
||||||
|
0x06, 0x18, 0x00, 0x18, 0x60, 0x00, 0x61, 0x80, 0x01, 0x86, 0x00, 0x00,
|
||||||
|
0x18, 0x0C, 0x00, 0x60, 0x30, 0x01, 0x80, 0xC0, 0x07, 0xFF, 0x00, 0x1F,
|
||||||
|
0xFC, 0x00, 0x60, 0x30, 0x01, 0x80, 0xC0, 0x06, 0x03, 0x00, 0x18, 0x00,
|
||||||
|
0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0xC6, 0x00, 0x03, 0x18, 0x00, 0x0C,
|
||||||
|
0x60, 0x00, 0x31, 0x80, 0x00, 0xC6, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x80, 0x00, 0xC6, 0x00,
|
||||||
|
0x03, 0x18, 0x00, 0x0C, 0x60, 0x00, 0x31, 0x80, 0x00, 0xC6, 0x00, 0x00,
|
||||||
|
0x18, 0x0C, 0x00, 0x60, 0x30, 0x01, 0x80, 0xC0, 0x07, 0xFF, 0x00, 0x1F,
|
||||||
|
0xFC, 0x00, 0x60, 0x30, 0x01, 0x80, 0xC0, 0x06, 0x03, 0x00, 0x18, 0x00,
|
||||||
|
0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00,
|
||||||
|
0x60, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0xFF, 0xF0, 0x03, 0xFF,
|
||||||
|
0xC0, 0x00, 0x00, 0xFF, 0x00, 0x07, 0xFF, 0x98, 0x1E, 0x03, 0xF0, 0x70,
|
||||||
|
0x01, 0xE1, 0x80, 0x01, 0xC6, 0x00, 0x01, 0x9C, 0x00, 0x03, 0x30, 0x00,
|
||||||
|
0x00, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00,
|
||||||
|
0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x03, 0xFF,
|
||||||
|
0xC0, 0x07, 0xFF, 0x80, 0x00, 0x1B, 0x00, 0x00, 0x37, 0x00, 0x00, 0x66,
|
||||||
|
0x00, 0x00, 0xCC, 0x00, 0x01, 0x8C, 0x00, 0x03, 0x1C, 0x00, 0x06, 0x1E,
|
||||||
|
0x00, 0x0C, 0x0F, 0x00, 0xF8, 0x0F, 0xFF, 0xC0, 0x03, 0xFC, 0x00, 0x7F,
|
||||||
|
0x01, 0xFC, 0xFE, 0x03, 0xF8, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80,
|
||||||
|
0x03, 0x03, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00,
|
||||||
|
0x30, 0x30, 0x00, 0x60, 0x60, 0x00, 0xC0, 0xFF, 0xFF, 0x81, 0xFF, 0xFF,
|
||||||
|
0x03, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, 0x30,
|
||||||
|
0x30, 0x00, 0x60, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, 0x03, 0x03,
|
||||||
|
0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0xFF, 0x01, 0xFF, 0xFE,
|
||||||
|
0x03, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
|
||||||
|
0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
|
||||||
|
0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
|
||||||
|
0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
|
||||||
|
0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFE, 0x01, 0xFF, 0xFC,
|
||||||
|
0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00,
|
||||||
|
0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00,
|
||||||
|
0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00,
|
||||||
|
0x30, 0x60, 0x00, 0x60, 0xC0, 0x00, 0xC1, 0x80, 0x01, 0x83, 0x00, 0x03,
|
||||||
|
0x06, 0x00, 0x06, 0x0C, 0x00, 0x0C, 0x18, 0x00, 0x30, 0x38, 0x00, 0x60,
|
||||||
|
0x38, 0x01, 0x80, 0x3C, 0x0E, 0x00, 0x3F, 0xF8, 0x00, 0x0F, 0xC0, 0x00,
|
||||||
|
0xFF, 0x81, 0xFE, 0xFF, 0x81, 0xFE, 0x18, 0x00, 0x30, 0x18, 0x00, 0xE0,
|
||||||
|
0x18, 0x01, 0xC0, 0x18, 0x03, 0x80, 0x18, 0x07, 0x00, 0x18, 0x0E, 0x00,
|
||||||
|
0x18, 0x18, 0x00, 0x18, 0x70, 0x00, 0x18, 0xE0, 0x00, 0x19, 0xE0, 0x00,
|
||||||
|
0x1B, 0xF8, 0x00, 0x1F, 0x1C, 0x00, 0x1C, 0x06, 0x00, 0x18, 0x03, 0x00,
|
||||||
|
0x18, 0x03, 0x80, 0x18, 0x01, 0x80, 0x18, 0x00, 0xC0, 0x18, 0x00, 0xC0,
|
||||||
|
0x18, 0x00, 0x60, 0x18, 0x00, 0x60, 0x18, 0x00, 0x70, 0x18, 0x00, 0x30,
|
||||||
|
0xFF, 0x80, 0x3F, 0xFF, 0x80, 0x1F, 0xFF, 0xF0, 0x07, 0xFF, 0x80, 0x01,
|
||||||
|
0x80, 0x00, 0x0C, 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00,
|
||||||
|
0x00, 0xC0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C,
|
||||||
|
0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00,
|
||||||
|
0x06, 0x00, 0x18, 0x30, 0x00, 0xC1, 0x80, 0x06, 0x0C, 0x00, 0x30, 0x60,
|
||||||
|
0x01, 0x83, 0x00, 0x0C, 0x18, 0x00, 0x60, 0xC0, 0x03, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xC0, 0xFC, 0x00, 0x0F, 0xFF, 0x00, 0x03, 0xF3, 0x60, 0x01,
|
||||||
|
0xB0, 0xD8, 0x00, 0x6C, 0x33, 0x00, 0x33, 0x0C, 0xC0, 0x0C, 0xC3, 0x38,
|
||||||
|
0x07, 0x30, 0xC6, 0x01, 0x8C, 0x31, 0xC0, 0xE3, 0x0C, 0x30, 0x30, 0xC3,
|
||||||
|
0x0C, 0x0C, 0x30, 0xC1, 0x86, 0x0C, 0x30, 0x61, 0x83, 0x0C, 0x0C, 0xC0,
|
||||||
|
0xC3, 0x03, 0x30, 0x30, 0xC0, 0x78, 0x0C, 0x30, 0x1E, 0x03, 0x0C, 0x03,
|
||||||
|
0x00, 0xC3, 0x00, 0x00, 0x30, 0xC0, 0x00, 0x0C, 0x30, 0x00, 0x03, 0x0C,
|
||||||
|
0x00, 0x00, 0xC3, 0x00, 0x00, 0x30, 0xC0, 0x00, 0x0C, 0xFF, 0x00, 0x3F,
|
||||||
|
0xFF, 0xC0, 0x0F, 0xF0, 0xFC, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0x1E, 0x00,
|
||||||
|
0x0C, 0x1F, 0x00, 0x0C, 0x1B, 0x00, 0x0C, 0x19, 0x80, 0x0C, 0x19, 0xC0,
|
||||||
|
0x0C, 0x18, 0xC0, 0x0C, 0x18, 0x60, 0x0C, 0x18, 0x60, 0x0C, 0x18, 0x30,
|
||||||
|
0x0C, 0x18, 0x38, 0x0C, 0x18, 0x18, 0x0C, 0x18, 0x0C, 0x0C, 0x18, 0x0E,
|
||||||
|
0x0C, 0x18, 0x06, 0x0C, 0x18, 0x03, 0x0C, 0x18, 0x03, 0x0C, 0x18, 0x01,
|
||||||
|
0x8C, 0x18, 0x01, 0xCC, 0x18, 0x00, 0xCC, 0x18, 0x00, 0x6C, 0x18, 0x00,
|
||||||
|
0x7C, 0x18, 0x00, 0x3C, 0x7F, 0x80, 0x1C, 0x7F, 0x80, 0x1C, 0x00, 0x7E,
|
||||||
|
0x00, 0x01, 0xFF, 0xC0, 0x07, 0x81, 0xE0, 0x0E, 0x00, 0x70, 0x1C, 0x00,
|
||||||
|
0x38, 0x38, 0x00, 0x1C, 0x30, 0x00, 0x0C, 0x70, 0x00, 0x0E, 0x60, 0x00,
|
||||||
|
0x06, 0x60, 0x00, 0x06, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00,
|
||||||
|
0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00,
|
||||||
|
0x03, 0xC0, 0x00, 0x03, 0x60, 0x00, 0x06, 0x60, 0x00, 0x06, 0x70, 0x00,
|
||||||
|
0x0E, 0x30, 0x00, 0x0C, 0x38, 0x00, 0x1C, 0x1C, 0x00, 0x38, 0x0E, 0x00,
|
||||||
|
0x70, 0x07, 0x81, 0xE0, 0x03, 0xFF, 0xC0, 0x00, 0x7E, 0x00, 0xFF, 0xFF,
|
||||||
|
0x07, 0xFF, 0xFE, 0x06, 0x00, 0x78, 0x30, 0x00, 0xE1, 0x80, 0x03, 0x0C,
|
||||||
|
0x00, 0x0C, 0x60, 0x00, 0x63, 0x00, 0x03, 0x18, 0x00, 0x18, 0xC0, 0x01,
|
||||||
|
0xC6, 0x00, 0x0C, 0x30, 0x00, 0xC1, 0x80, 0x1E, 0x0F, 0xFF, 0xC0, 0x7F,
|
||||||
|
0xF8, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, 0x06, 0x00, 0x00,
|
||||||
|
0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x60, 0x00, 0x03, 0x00,
|
||||||
|
0x00, 0xFF, 0xF0, 0x07, 0xFF, 0x80, 0x00, 0x00, 0x7E, 0x00, 0x01, 0xFF,
|
||||||
|
0x80, 0x07, 0x81, 0xE0, 0x0E, 0x00, 0x70, 0x1C, 0x00, 0x38, 0x38, 0x00,
|
||||||
|
0x1C, 0x30, 0x00, 0x0C, 0x70, 0x00, 0x0E, 0x60, 0x00, 0x06, 0x60, 0x00,
|
||||||
|
0x06, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00,
|
||||||
|
0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00,
|
||||||
|
0x03, 0x60, 0x00, 0x06, 0x60, 0x00, 0x06, 0x70, 0x00, 0x0E, 0x30, 0x00,
|
||||||
|
0x0C, 0x18, 0x00, 0x1C, 0x0C, 0x00, 0x38, 0x06, 0x00, 0x70, 0x03, 0x81,
|
||||||
|
0xE0, 0x00, 0xFF, 0xC0, 0x00, 0x7E, 0x00, 0x00, 0xE0, 0x00, 0x03, 0xFF,
|
||||||
|
0x87, 0x07, 0xFF, 0xFE, 0x07, 0x00, 0xF8, 0xFF, 0xFE, 0x00, 0xFF, 0xFF,
|
||||||
|
0x80, 0x18, 0x03, 0xC0, 0x18, 0x00, 0xE0, 0x18, 0x00, 0x60, 0x18, 0x00,
|
||||||
|
0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x30, 0x18, 0x00,
|
||||||
|
0x70, 0x18, 0x00, 0x60, 0x18, 0x01, 0xC0, 0x18, 0x07, 0x80, 0x1F, 0xFF,
|
||||||
|
0x00, 0x1F, 0xFC, 0x00, 0x18, 0x0E, 0x00, 0x18, 0x07, 0x00, 0x18, 0x03,
|
||||||
|
0x80, 0x18, 0x01, 0xC0, 0x18, 0x00, 0xE0, 0x18, 0x00, 0x60, 0x18, 0x00,
|
||||||
|
0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x18, 0xFF, 0x80, 0x1F, 0xFF, 0x80,
|
||||||
|
0x0F, 0x03, 0xF8, 0x00, 0xFF, 0xE6, 0x1E, 0x07, 0xE3, 0x80, 0x1E, 0x30,
|
||||||
|
0x00, 0xE6, 0x00, 0x06, 0x60, 0x00, 0x66, 0x00, 0x06, 0x60, 0x00, 0x07,
|
||||||
|
0x00, 0x00, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0xC0,
|
||||||
|
0x00, 0x3F, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00,
|
||||||
|
0x30, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00, 0x03, 0xE0, 0x00, 0x7E, 0x00,
|
||||||
|
0x06, 0xF8, 0x01, 0xED, 0xE0, 0x7C, 0xCF, 0xFF, 0x00, 0x3F, 0xC0, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x03, 0x00, 0xF0, 0x0C, 0x03, 0xC0, 0x30,
|
||||||
|
0x0F, 0x00, 0xC0, 0x3C, 0x03, 0x00, 0xC0, 0x0C, 0x00, 0x00, 0x30, 0x00,
|
||||||
|
0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00,
|
||||||
|
0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0,
|
||||||
|
0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00,
|
||||||
|
0x03, 0x00, 0x00, 0x0C, 0x00, 0x0F, 0xFF, 0xC0, 0x3F, 0xFF, 0x00, 0xFF,
|
||||||
|
0x01, 0xFF, 0xFE, 0x03, 0xFC, 0xC0, 0x00, 0x61, 0x80, 0x00, 0xC3, 0x00,
|
||||||
|
0x01, 0x86, 0x00, 0x03, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x30, 0x00,
|
||||||
|
0x18, 0x60, 0x00, 0x30, 0xC0, 0x00, 0x61, 0x80, 0x00, 0xC3, 0x00, 0x01,
|
||||||
|
0x86, 0x00, 0x03, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x30, 0x00, 0x18,
|
||||||
|
0x60, 0x00, 0x30, 0xC0, 0x00, 0x61, 0x80, 0x00, 0xC3, 0x80, 0x03, 0x83,
|
||||||
|
0x00, 0x06, 0x07, 0x00, 0x1C, 0x07, 0x00, 0x70, 0x07, 0x83, 0xC0, 0x07,
|
||||||
|
0xFF, 0x00, 0x03, 0xF8, 0x00, 0x7F, 0xC0, 0x3F, 0xF7, 0xFC, 0x03, 0xFF,
|
||||||
|
0x18, 0x00, 0x01, 0x80, 0xC0, 0x00, 0x30, 0x0C, 0x00, 0x03, 0x00, 0x60,
|
||||||
|
0x00, 0x30, 0x06, 0x00, 0x06, 0x00, 0x60, 0x00, 0x60, 0x03, 0x00, 0x0C,
|
||||||
|
0x00, 0x30, 0x00, 0xC0, 0x03, 0x80, 0x0C, 0x00, 0x18, 0x01, 0x80, 0x01,
|
||||||
|
0x80, 0x18, 0x00, 0x0C, 0x03, 0x00, 0x00, 0xC0, 0x30, 0x00, 0x0E, 0x03,
|
||||||
|
0x00, 0x00, 0x60, 0x60, 0x00, 0x06, 0x06, 0x00, 0x00, 0x30, 0xC0, 0x00,
|
||||||
|
0x03, 0x0C, 0x00, 0x00, 0x30, 0x80, 0x00, 0x01, 0x98, 0x00, 0x00, 0x19,
|
||||||
|
0x80, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xE0, 0x00,
|
||||||
|
0xFF, 0x80, 0x7F, 0xFF, 0xE0, 0x1F, 0xF3, 0x00, 0x00, 0x30, 0xC0, 0x00,
|
||||||
|
0x0C, 0x30, 0x00, 0x03, 0x0C, 0x03, 0x80, 0xC3, 0x01, 0xE0, 0x30, 0x60,
|
||||||
|
0x78, 0x0C, 0x18, 0x1F, 0x02, 0x06, 0x04, 0xC0, 0x81, 0x83, 0x30, 0x60,
|
||||||
|
0x60, 0xCC, 0x18, 0x18, 0x31, 0x86, 0x06, 0x18, 0x61, 0x81, 0x86, 0x18,
|
||||||
|
0x60, 0x71, 0x87, 0x18, 0x0C, 0x40, 0xC6, 0x03, 0x30, 0x31, 0x00, 0xCC,
|
||||||
|
0x0C, 0xC0, 0x33, 0x01, 0xB0, 0x0D, 0x80, 0x6C, 0x03, 0x60, 0x1B, 0x00,
|
||||||
|
0xD8, 0x06, 0xC0, 0x34, 0x00, 0xF0, 0x07, 0x00, 0x3C, 0x01, 0xC0, 0x0E,
|
||||||
|
0x00, 0x7F, 0x00, 0xFF, 0x7F, 0x00, 0xFF, 0x18, 0x00, 0x18, 0x0C, 0x00,
|
||||||
|
0x38, 0x0E, 0x00, 0x70, 0x07, 0x00, 0x60, 0x03, 0x00, 0xC0, 0x01, 0x81,
|
||||||
|
0x80, 0x01, 0xC3, 0x80, 0x00, 0xE7, 0x00, 0x00, 0x76, 0x00, 0x00, 0x3C,
|
||||||
|
0x00, 0x00, 0x18, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x66,
|
||||||
|
0x00, 0x00, 0xC3, 0x00, 0x01, 0x81, 0x80, 0x03, 0x81, 0xC0, 0x07, 0x00,
|
||||||
|
0xE0, 0x06, 0x00, 0x60, 0x0C, 0x00, 0x30, 0x18, 0x00, 0x18, 0x38, 0x00,
|
||||||
|
0x1C, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00,
|
||||||
|
0xFF, 0x18, 0x00, 0x18, 0x0C, 0x00, 0x30, 0x0E, 0x00, 0x70, 0x06, 0x00,
|
||||||
|
0x60, 0x03, 0x00, 0xC0, 0x03, 0x81, 0xC0, 0x01, 0x81, 0x80, 0x00, 0xC3,
|
||||||
|
0x00, 0x00, 0xE7, 0x00, 0x00, 0x66, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C,
|
||||||
|
0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18,
|
||||||
|
0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18,
|
||||||
|
0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x07, 0xFF, 0xE0, 0x07, 0xFF,
|
||||||
|
0xE0, 0x7F, 0xFF, 0x9F, 0xFF, 0xE6, 0x00, 0x19, 0x80, 0x0C, 0x60, 0x07,
|
||||||
|
0x18, 0x03, 0x86, 0x00, 0xC1, 0x80, 0x70, 0x00, 0x38, 0x00, 0x0C, 0x00,
|
||||||
|
0x07, 0x00, 0x03, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x38, 0x00, 0x1C,
|
||||||
|
0x00, 0x06, 0x00, 0x03, 0x80, 0x31, 0xC0, 0x0C, 0x60, 0x03, 0x30, 0x00,
|
||||||
|
0xDC, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0,
|
||||||
|
0xFF, 0xFF, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18,
|
||||||
|
0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06,
|
||||||
|
0x0C, 0x18, 0x30, 0x60, 0xFF, 0xFC, 0xC0, 0x00, 0x30, 0x00, 0x06, 0x00,
|
||||||
|
0x01, 0x80, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00,
|
||||||
|
0x0C, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00,
|
||||||
|
0xC0, 0x00, 0x18, 0x00, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x06,
|
||||||
|
0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x80, 0x00, 0x60,
|
||||||
|
0x00, 0x1C, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x18, 0x00, 0x07, 0x00,
|
||||||
|
0x00, 0xC0, 0x00, 0x30, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00,
|
||||||
|
0x0C, 0xFF, 0xFC, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30,
|
||||||
|
0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C,
|
||||||
|
0x18, 0x30, 0x60, 0xC1, 0x83, 0xFF, 0xFC, 0x00, 0x40, 0x00, 0x30, 0x00,
|
||||||
|
0x1E, 0x00, 0x0E, 0xC0, 0x07, 0x38, 0x01, 0x87, 0x00, 0xC0, 0xC0, 0x60,
|
||||||
|
0x18, 0x38, 0x03, 0x1C, 0x00, 0xE6, 0x00, 0x1F, 0x00, 0x03, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xE0, 0x70, 0x3C, 0x0E, 0x07, 0x03,
|
||||||
|
0x01, 0xFC, 0x00, 0x7F, 0xFC, 0x01, 0xC0, 0x3C, 0x00, 0x00, 0x30, 0x00,
|
||||||
|
0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00,
|
||||||
|
0x60, 0x0F, 0xF9, 0x81, 0xFF, 0xFE, 0x0F, 0x80, 0x38, 0x70, 0x00, 0x63,
|
||||||
|
0x80, 0x01, 0x8C, 0x00, 0x06, 0x30, 0x00, 0x18, 0xC0, 0x00, 0xE3, 0x00,
|
||||||
|
0x07, 0x86, 0x00, 0x76, 0x1E, 0x07, 0x9F, 0x3F, 0xF8, 0x7C, 0x3F, 0x80,
|
||||||
|
0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00,
|
||||||
|
0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x1F, 0x80,
|
||||||
|
0x18, 0xFF, 0xC0, 0x33, 0x81, 0xC0, 0x6E, 0x01, 0xC0, 0xF0, 0x00, 0xC1,
|
||||||
|
0xE0, 0x01, 0xC3, 0x80, 0x01, 0x87, 0x00, 0x03, 0x8C, 0x00, 0x03, 0x18,
|
||||||
|
0x00, 0x06, 0x30, 0x00, 0x0C, 0x60, 0x00, 0x18, 0xC0, 0x00, 0x31, 0x80,
|
||||||
|
0x00, 0x63, 0x80, 0x01, 0x87, 0x00, 0x03, 0x0F, 0x00, 0x0E, 0x1F, 0x00,
|
||||||
|
0x38, 0x37, 0x00, 0xE3, 0xE7, 0x03, 0x87, 0xC7, 0xFE, 0x00, 0x03, 0xF0,
|
||||||
|
0x00, 0x01, 0xFC, 0x00, 0x3F, 0xF9, 0x83, 0xC0, 0xFC, 0x38, 0x01, 0xE3,
|
||||||
|
0x00, 0x07, 0x38, 0x00, 0x19, 0x80, 0x00, 0xDC, 0x00, 0x06, 0xC0, 0x00,
|
||||||
|
0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x60,
|
||||||
|
0x00, 0x03, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x00, 0x01, 0x80, 0x00,
|
||||||
|
0xC7, 0x00, 0x1E, 0x1E, 0x03, 0xC0, 0x7F, 0xFC, 0x00, 0xFF, 0x00, 0x00,
|
||||||
|
0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00,
|
||||||
|
0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x01, 0xF8, 0x18, 0x07,
|
||||||
|
0xFE, 0x18, 0x0F, 0x07, 0x98, 0x1C, 0x01, 0xD8, 0x38, 0x00, 0xF8, 0x70,
|
||||||
|
0x00, 0x78, 0x60, 0x00, 0x38, 0xE0, 0x00, 0x38, 0xC0, 0x00, 0x18, 0xC0,
|
||||||
|
0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0,
|
||||||
|
0x00, 0x18, 0x60, 0x00, 0x38, 0x60, 0x00, 0x38, 0x70, 0x00, 0x78, 0x38,
|
||||||
|
0x00, 0xD8, 0x1C, 0x01, 0xD8, 0x0F, 0x07, 0x9F, 0x07, 0xFE, 0x1F, 0x01,
|
||||||
|
0xF8, 0x00, 0x01, 0xFC, 0x00, 0x3F, 0xF8, 0x07, 0x80, 0xF0, 0x70, 0x01,
|
||||||
|
0xC3, 0x00, 0x07, 0x30, 0x00, 0x19, 0x80, 0x00, 0x78, 0x00, 0x03, 0xC0,
|
||||||
|
0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x0C, 0x00, 0x00,
|
||||||
|
0x60, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x01, 0xC0,
|
||||||
|
0x00, 0xC7, 0x00, 0x0E, 0x1E, 0x03, 0xE0, 0x3F, 0xFC, 0x00, 0x7F, 0x00,
|
||||||
|
0x00, 0x7F, 0xC0, 0x3F, 0xFC, 0x0E, 0x00, 0x03, 0x80, 0x00, 0x60, 0x00,
|
||||||
|
0x0C, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0xFF, 0xFF, 0x9F, 0xFF, 0xF0,
|
||||||
|
0x18, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00,
|
||||||
|
0x30, 0x00, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00,
|
||||||
|
0x60, 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00,
|
||||||
|
0xC0, 0x03, 0xFF, 0xFC, 0x7F, 0xFF, 0x80, 0x01, 0xF8, 0x00, 0x0F, 0xFC,
|
||||||
|
0x7C, 0x38, 0x1C, 0xF8, 0xE0, 0x0D, 0x83, 0x00, 0x0F, 0x0E, 0x00, 0x1E,
|
||||||
|
0x18, 0x00, 0x1C, 0x70, 0x00, 0x38, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x63,
|
||||||
|
0x00, 0x00, 0xC6, 0x00, 0x01, 0x8C, 0x00, 0x03, 0x18, 0x00, 0x06, 0x18,
|
||||||
|
0x00, 0x1C, 0x30, 0x00, 0x38, 0x30, 0x00, 0xF0, 0x70, 0x03, 0x60, 0x78,
|
||||||
|
0x1C, 0xC0, 0x3F, 0xF1, 0x80, 0x1F, 0x83, 0x00, 0x00, 0x06, 0x00, 0x00,
|
||||||
|
0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03,
|
||||||
|
0x80, 0x00, 0x0E, 0x00, 0x3F, 0xF8, 0x00, 0x7F, 0xC0, 0x00, 0xF8, 0x00,
|
||||||
|
0x01, 0xF0, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00,
|
||||||
|
0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x3F, 0x00, 0x18, 0xFF, 0x80,
|
||||||
|
0x37, 0x03, 0x80, 0x7C, 0x03, 0x80, 0xF0, 0x03, 0x81, 0xC0, 0x03, 0x03,
|
||||||
|
0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, 0x30, 0x30,
|
||||||
|
0x00, 0x60, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, 0x03, 0x03, 0x00,
|
||||||
|
0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, 0x30, 0x30, 0x00,
|
||||||
|
0x63, 0xFC, 0x07, 0xFF, 0xF8, 0x0F, 0xF0, 0x01, 0xC0, 0x00, 0x70, 0x00,
|
||||||
|
0x1C, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x0F, 0xF0, 0x03, 0xFC, 0x00, 0x03, 0x00, 0x00, 0xC0,
|
||||||
|
0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00,
|
||||||
|
0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03,
|
||||||
|
0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x03, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xC0, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xC0, 0x03, 0x00, 0x0C,
|
||||||
|
0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03,
|
||||||
|
0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00,
|
||||||
|
0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00,
|
||||||
|
0x70, 0x03, 0x80, 0x1C, 0xFF, 0xE3, 0xFF, 0x00, 0xF8, 0x00, 0x03, 0xE0,
|
||||||
|
0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00,
|
||||||
|
0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x1F, 0xE0, 0x60, 0x7F, 0x81,
|
||||||
|
0x80, 0x60, 0x06, 0x07, 0x00, 0x18, 0x38, 0x00, 0x61, 0xC0, 0x01, 0x8E,
|
||||||
|
0x00, 0x06, 0x70, 0x00, 0x1B, 0x80, 0x00, 0x7F, 0x00, 0x01, 0xCE, 0x00,
|
||||||
|
0x06, 0x1C, 0x00, 0x18, 0x38, 0x00, 0x60, 0x70, 0x01, 0x80, 0xE0, 0x06,
|
||||||
|
0x01, 0xC0, 0x18, 0x03, 0x80, 0x60, 0x07, 0x0F, 0x80, 0x7F, 0xFE, 0x01,
|
||||||
|
0xFF, 0x3F, 0xC0, 0x0F, 0xF0, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0,
|
||||||
|
0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00,
|
||||||
|
0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03,
|
||||||
|
0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0,
|
||||||
|
0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x0F,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xF0, 0x3C, 0x0F, 0x9F, 0x87, 0xE0, 0xFB,
|
||||||
|
0x1C, 0xC7, 0x01, 0xE0, 0xD8, 0x38, 0x1C, 0x07, 0x01, 0x81, 0x80, 0x60,
|
||||||
|
0x18, 0x18, 0x06, 0x01, 0x81, 0x80, 0x60, 0x18, 0x18, 0x06, 0x01, 0x81,
|
||||||
|
0x80, 0x60, 0x18, 0x18, 0x06, 0x01, 0x81, 0x80, 0x60, 0x18, 0x18, 0x06,
|
||||||
|
0x01, 0x81, 0x80, 0x60, 0x18, 0x18, 0x06, 0x01, 0x81, 0x80, 0x60, 0x18,
|
||||||
|
0x18, 0x06, 0x01, 0x81, 0x80, 0x60, 0x18, 0x18, 0x06, 0x01, 0x8F, 0xE0,
|
||||||
|
0x7C, 0x1F, 0xFE, 0x07, 0xC1, 0xF0, 0x00, 0x1F, 0x00, 0xF8, 0xFF, 0x81,
|
||||||
|
0xF3, 0x83, 0x80, 0x6C, 0x03, 0x80, 0xF0, 0x03, 0x81, 0xC0, 0x03, 0x03,
|
||||||
|
0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, 0x30, 0x30,
|
||||||
|
0x00, 0x60, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, 0x03, 0x03, 0x00,
|
||||||
|
0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, 0x30, 0x30, 0x00,
|
||||||
|
0x67, 0xFC, 0x03, 0xFF, 0xF8, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0xFE,
|
||||||
|
0x00, 0xF0, 0x3C, 0x07, 0x00, 0x38, 0x38, 0x00, 0x71, 0xC0, 0x00, 0xE6,
|
||||||
|
0x00, 0x01, 0x98, 0x00, 0x06, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00,
|
||||||
|
0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x36, 0x00, 0x01,
|
||||||
|
0x98, 0x00, 0x06, 0x70, 0x00, 0x38, 0xE0, 0x01, 0xC1, 0xC0, 0x0E, 0x03,
|
||||||
|
0xC0, 0xF0, 0x07, 0xFF, 0x80, 0x03, 0xF0, 0x00, 0x00, 0x3F, 0x01, 0xF1,
|
||||||
|
0xFF, 0x83, 0xE7, 0x03, 0x80, 0xD8, 0x01, 0x81, 0xE0, 0x01, 0x83, 0xC0,
|
||||||
|
0x03, 0x87, 0x00, 0x03, 0x0E, 0x00, 0x07, 0x18, 0x00, 0x06, 0x30, 0x00,
|
||||||
|
0x0C, 0x60, 0x00, 0x18, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x63, 0x00, 0x00,
|
||||||
|
0xC7, 0x00, 0x03, 0x0E, 0x00, 0x06, 0x1E, 0x00, 0x18, 0x36, 0x00, 0x70,
|
||||||
|
0x67, 0x03, 0xC0, 0xC7, 0xFE, 0x01, 0x83, 0xF0, 0x03, 0x00, 0x00, 0x06,
|
||||||
|
0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60,
|
||||||
|
0x00, 0x00, 0xC0, 0x00, 0x0F, 0xFC, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x01,
|
||||||
|
0xF8, 0x00, 0x07, 0xFF, 0x1F, 0x0F, 0x07, 0x9F, 0x1C, 0x01, 0xD8, 0x38,
|
||||||
|
0x00, 0x78, 0x70, 0x00, 0x78, 0x60, 0x00, 0x38, 0xE0, 0x00, 0x38, 0xC0,
|
||||||
|
0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0,
|
||||||
|
0x00, 0x18, 0xC0, 0x00, 0x18, 0x60, 0x00, 0x38, 0x70, 0x00, 0x78, 0x30,
|
||||||
|
0x00, 0x78, 0x1C, 0x01, 0xD8, 0x0F, 0x07, 0x98, 0x07, 0xFF, 0x18, 0x01,
|
||||||
|
0xFC, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00,
|
||||||
|
0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00,
|
||||||
|
0x03, 0xFF, 0x00, 0x03, 0xFF, 0x7E, 0x03, 0xC3, 0xF0, 0x7F, 0x81, 0x8F,
|
||||||
|
0x0E, 0x0C, 0xE0, 0x00, 0x7E, 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x00,
|
||||||
|
0xC0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00,
|
||||||
|
0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, 0x06,
|
||||||
|
0x00, 0x00, 0x30, 0x00, 0x3F, 0xFF, 0xC1, 0xFF, 0xFE, 0x00, 0x07, 0xF0,
|
||||||
|
0x07, 0xFF, 0x63, 0xC0, 0xF9, 0xC0, 0x0E, 0x60, 0x01, 0x98, 0x00, 0x66,
|
||||||
|
0x00, 0x19, 0xC0, 0x00, 0x38, 0x00, 0x07, 0xC0, 0x00, 0x7F, 0xC0, 0x00,
|
||||||
|
0x7C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00,
|
||||||
|
0xF8, 0x00, 0x7F, 0x00, 0x3B, 0xF0, 0x3C, 0xDF, 0xFE, 0x00, 0xFE, 0x00,
|
||||||
|
0x0C, 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0,
|
||||||
|
0x00, 0x06, 0x00, 0x03, 0xFF, 0xFE, 0x1F, 0xFF, 0xF0, 0x0C, 0x00, 0x00,
|
||||||
|
0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, 0x06, 0x00,
|
||||||
|
0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x60, 0x00, 0x03,
|
||||||
|
0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00,
|
||||||
|
0x00, 0xC0, 0x07, 0x07, 0x01, 0xF0, 0x1F, 0xFF, 0x00, 0x3F, 0x80, 0xF8,
|
||||||
|
0x03, 0xF1, 0xF0, 0x07, 0xE0, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80,
|
||||||
|
0x03, 0x03, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00,
|
||||||
|
0x30, 0x30, 0x00, 0x60, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, 0x03,
|
||||||
|
0x03, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x38, 0x18, 0x00, 0xF0,
|
||||||
|
0x18, 0x03, 0x60, 0x38, 0x3C, 0xF8, 0x3F, 0xF1, 0xF0, 0x1F, 0x00, 0x00,
|
||||||
|
0x7F, 0xC0, 0xFF, 0xDF, 0xF0, 0x3F, 0xF0, 0xC0, 0x00, 0xC0, 0x30, 0x00,
|
||||||
|
0x30, 0x06, 0x00, 0x1C, 0x01, 0x80, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C,
|
||||||
|
0x00, 0xC0, 0x03, 0x80, 0x30, 0x00, 0x60, 0x18, 0x00, 0x18, 0x06, 0x00,
|
||||||
|
0x03, 0x03, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x18, 0x30, 0x00, 0x06, 0x18,
|
||||||
|
0x00, 0x00, 0xC6, 0x00, 0x00, 0x33, 0x00, 0x00, 0x0E, 0xC0, 0x00, 0x01,
|
||||||
|
0xE0, 0x00, 0x00, 0x78, 0x00, 0x7F, 0x00, 0x3F, 0xDF, 0xC0, 0x0F, 0xF1,
|
||||||
|
0x80, 0x00, 0x20, 0x60, 0x00, 0x18, 0x18, 0x00, 0x06, 0x06, 0x03, 0x01,
|
||||||
|
0x80, 0x81, 0xE0, 0x60, 0x30, 0x78, 0x10, 0x0C, 0x1E, 0x0C, 0x03, 0x0C,
|
||||||
|
0xC3, 0x00, 0xC3, 0x30, 0xC0, 0x10, 0xCC, 0x30, 0x06, 0x61, 0x98, 0x01,
|
||||||
|
0x98, 0x66, 0x00, 0x66, 0x19, 0x80, 0x0B, 0x03, 0x60, 0x03, 0xC0, 0xD0,
|
||||||
|
0x00, 0xF0, 0x1C, 0x00, 0x38, 0x07, 0x00, 0x0E, 0x01, 0xC0, 0x3F, 0x81,
|
||||||
|
0xFE, 0x3F, 0x81, 0xFE, 0x0C, 0x00, 0x38, 0x06, 0x00, 0x70, 0x03, 0x00,
|
||||||
|
0xE0, 0x01, 0x81, 0xC0, 0x00, 0xC3, 0x80, 0x00, 0x67, 0x00, 0x00, 0x3C,
|
||||||
|
0x00, 0x00, 0x18, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x67, 0x00, 0x00, 0xC3,
|
||||||
|
0x80, 0x01, 0x81, 0xC0, 0x03, 0x00, 0xE0, 0x06, 0x00, 0x70, 0x0C, 0x00,
|
||||||
|
0x38, 0x18, 0x00, 0x1C, 0x7F, 0x81, 0xFF, 0x7F, 0x81, 0xFF, 0x7F, 0x00,
|
||||||
|
0xFF, 0x7F, 0x00, 0xFF, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x18, 0x0C, 0x00,
|
||||||
|
0x18, 0x0C, 0x00, 0x30, 0x06, 0x00, 0x30, 0x06, 0x00, 0x60, 0x03, 0x00,
|
||||||
|
0x60, 0x03, 0x00, 0xC0, 0x01, 0x80, 0xC0, 0x01, 0x81, 0x80, 0x00, 0xC1,
|
||||||
|
0x80, 0x00, 0xC3, 0x00, 0x00, 0x63, 0x00, 0x00, 0x66, 0x00, 0x00, 0x36,
|
||||||
|
0x00, 0x00, 0x34, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18,
|
||||||
|
0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60,
|
||||||
|
0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFC,
|
||||||
|
0x00, 0xFF, 0xFF, 0x7F, 0xFF, 0xB0, 0x01, 0x98, 0x01, 0xCC, 0x01, 0xC0,
|
||||||
|
0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xE0,
|
||||||
|
0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x03, 0x70,
|
||||||
|
0x01, 0xB0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0xE0, 0x7C, 0x0C,
|
||||||
|
0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03,
|
||||||
|
0x00, 0x60, 0x0C, 0x03, 0x00, 0xE0, 0xF0, 0x1E, 0x00, 0x70, 0x06, 0x00,
|
||||||
|
0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60,
|
||||||
|
0x0C, 0x01, 0x80, 0x18, 0x03, 0xE0, 0x1C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xF0, 0xE0, 0x1F, 0x00, 0x60, 0x06, 0x00, 0xC0, 0x18,
|
||||||
|
0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x01,
|
||||||
|
0x80, 0x38, 0x01, 0xE0, 0x3C, 0x1C, 0x03, 0x00, 0xC0, 0x18, 0x03, 0x00,
|
||||||
|
0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0xC0,
|
||||||
|
0xF8, 0x1C, 0x00, 0x0F, 0x00, 0x03, 0xFC, 0x03, 0x70, 0xE0, 0x76, 0x07,
|
||||||
|
0x8E, 0xC0, 0x1F, 0xC0, 0x00, 0xF0};
|
||||||
|
|
||||||
|
const GFXglyph FreeMono24pt7bGlyphs[] PROGMEM = {
|
||||||
|
{0, 0, 0, 28, 0, 1}, // 0x20 ' '
|
||||||
|
{0, 5, 30, 28, 11, -28}, // 0x21 '!'
|
||||||
|
{19, 16, 14, 28, 6, -28}, // 0x22 '"'
|
||||||
|
{47, 19, 32, 28, 4, -29}, // 0x23 '#'
|
||||||
|
{123, 18, 33, 28, 5, -29}, // 0x24 '$'
|
||||||
|
{198, 20, 29, 28, 4, -27}, // 0x25 '%'
|
||||||
|
{271, 18, 25, 28, 5, -23}, // 0x26 '&'
|
||||||
|
{328, 7, 14, 28, 11, -28}, // 0x27 '''
|
||||||
|
{341, 7, 34, 28, 14, -27}, // 0x28 '('
|
||||||
|
{371, 7, 34, 28, 8, -27}, // 0x29 ')'
|
||||||
|
{401, 18, 16, 28, 5, -27}, // 0x2A '*'
|
||||||
|
{437, 20, 22, 28, 4, -23}, // 0x2B '+'
|
||||||
|
{492, 9, 14, 28, 6, -6}, // 0x2C ','
|
||||||
|
{508, 22, 2, 28, 3, -13}, // 0x2D '-'
|
||||||
|
{514, 7, 6, 28, 11, -4}, // 0x2E '.'
|
||||||
|
{520, 18, 35, 28, 5, -30}, // 0x2F '/'
|
||||||
|
{599, 18, 30, 28, 5, -28}, // 0x30 '0'
|
||||||
|
{667, 16, 29, 28, 6, -28}, // 0x31 '1'
|
||||||
|
{725, 18, 29, 28, 5, -28}, // 0x32 '2'
|
||||||
|
{791, 19, 30, 28, 5, -28}, // 0x33 '3'
|
||||||
|
{863, 16, 28, 28, 6, -27}, // 0x34 '4'
|
||||||
|
{919, 19, 29, 28, 5, -27}, // 0x35 '5'
|
||||||
|
{988, 18, 30, 28, 6, -28}, // 0x36 '6'
|
||||||
|
{1056, 18, 28, 28, 5, -27}, // 0x37 '7'
|
||||||
|
{1119, 18, 30, 28, 5, -28}, // 0x38 '8'
|
||||||
|
{1187, 18, 30, 28, 6, -28}, // 0x39 '9'
|
||||||
|
{1255, 7, 21, 28, 11, -19}, // 0x3A ':'
|
||||||
|
{1274, 10, 27, 28, 7, -19}, // 0x3B ';'
|
||||||
|
{1308, 22, 22, 28, 3, -23}, // 0x3C '<'
|
||||||
|
{1369, 24, 9, 28, 2, -17}, // 0x3D '='
|
||||||
|
{1396, 21, 22, 28, 4, -23}, // 0x3E '>'
|
||||||
|
{1454, 17, 28, 28, 6, -26}, // 0x3F '?'
|
||||||
|
{1514, 18, 32, 28, 5, -28}, // 0x40 '@'
|
||||||
|
{1586, 28, 26, 28, 0, -25}, // 0x41 'A'
|
||||||
|
{1677, 22, 26, 28, 3, -25}, // 0x42 'B'
|
||||||
|
{1749, 22, 28, 28, 3, -26}, // 0x43 'C'
|
||||||
|
{1826, 22, 26, 28, 3, -25}, // 0x44 'D'
|
||||||
|
{1898, 22, 26, 28, 3, -25}, // 0x45 'E'
|
||||||
|
{1970, 22, 26, 28, 3, -25}, // 0x46 'F'
|
||||||
|
{2042, 23, 28, 28, 3, -26}, // 0x47 'G'
|
||||||
|
{2123, 23, 26, 28, 3, -25}, // 0x48 'H'
|
||||||
|
{2198, 16, 26, 28, 6, -25}, // 0x49 'I'
|
||||||
|
{2250, 23, 27, 28, 4, -25}, // 0x4A 'J'
|
||||||
|
{2328, 24, 26, 28, 3, -25}, // 0x4B 'K'
|
||||||
|
{2406, 21, 26, 28, 4, -25}, // 0x4C 'L'
|
||||||
|
{2475, 26, 26, 28, 1, -25}, // 0x4D 'M'
|
||||||
|
{2560, 24, 26, 28, 2, -25}, // 0x4E 'N'
|
||||||
|
{2638, 24, 28, 28, 2, -26}, // 0x4F 'O'
|
||||||
|
{2722, 21, 26, 28, 3, -25}, // 0x50 'P'
|
||||||
|
{2791, 24, 32, 28, 2, -26}, // 0x51 'Q'
|
||||||
|
{2887, 24, 26, 28, 3, -25}, // 0x52 'R'
|
||||||
|
{2965, 20, 28, 28, 4, -26}, // 0x53 'S'
|
||||||
|
{3035, 22, 26, 28, 3, -25}, // 0x54 'T'
|
||||||
|
{3107, 23, 27, 28, 3, -25}, // 0x55 'U'
|
||||||
|
{3185, 28, 26, 28, 0, -25}, // 0x56 'V'
|
||||||
|
{3276, 26, 26, 28, 1, -25}, // 0x57 'W'
|
||||||
|
{3361, 24, 26, 28, 2, -25}, // 0x58 'X'
|
||||||
|
{3439, 24, 26, 28, 2, -25}, // 0x59 'Y'
|
||||||
|
{3517, 18, 26, 28, 5, -25}, // 0x5A 'Z'
|
||||||
|
{3576, 7, 34, 28, 13, -27}, // 0x5B '['
|
||||||
|
{3606, 18, 35, 28, 5, -30}, // 0x5C '\'
|
||||||
|
{3685, 7, 34, 28, 8, -27}, // 0x5D ']'
|
||||||
|
{3715, 18, 12, 28, 5, -28}, // 0x5E '^'
|
||||||
|
{3742, 28, 2, 28, 0, 5}, // 0x5F '_'
|
||||||
|
{3749, 8, 7, 28, 7, -29}, // 0x60 '`'
|
||||||
|
{3756, 22, 22, 28, 3, -20}, // 0x61 'a'
|
||||||
|
{3817, 23, 29, 28, 2, -27}, // 0x62 'b'
|
||||||
|
{3901, 21, 22, 28, 4, -20}, // 0x63 'c'
|
||||||
|
{3959, 24, 29, 28, 3, -27}, // 0x64 'd'
|
||||||
|
{4046, 21, 22, 28, 3, -20}, // 0x65 'e'
|
||||||
|
{4104, 19, 28, 28, 6, -27}, // 0x66 'f'
|
||||||
|
{4171, 23, 30, 28, 3, -20}, // 0x67 'g'
|
||||||
|
{4258, 23, 28, 28, 3, -27}, // 0x68 'h'
|
||||||
|
{4339, 18, 29, 28, 5, -28}, // 0x69 'i'
|
||||||
|
{4405, 14, 38, 28, 6, -28}, // 0x6A 'j'
|
||||||
|
{4472, 22, 28, 28, 4, -27}, // 0x6B 'k'
|
||||||
|
{4549, 18, 28, 28, 5, -27}, // 0x6C 'l'
|
||||||
|
{4612, 28, 21, 28, 0, -20}, // 0x6D 'm'
|
||||||
|
{4686, 23, 21, 28, 2, -20}, // 0x6E 'n'
|
||||||
|
{4747, 22, 22, 28, 3, -20}, // 0x6F 'o'
|
||||||
|
{4808, 23, 30, 28, 2, -20}, // 0x70 'p'
|
||||||
|
{4895, 24, 30, 28, 3, -20}, // 0x71 'q'
|
||||||
|
{4985, 21, 20, 28, 5, -19}, // 0x72 'r'
|
||||||
|
{5038, 18, 22, 28, 5, -20}, // 0x73 's'
|
||||||
|
{5088, 21, 27, 28, 3, -25}, // 0x74 't'
|
||||||
|
{5159, 23, 21, 28, 3, -19}, // 0x75 'u'
|
||||||
|
{5220, 26, 20, 28, 1, -19}, // 0x76 'v'
|
||||||
|
{5285, 26, 20, 28, 1, -19}, // 0x77 'w'
|
||||||
|
{5350, 24, 20, 28, 2, -19}, // 0x78 'x'
|
||||||
|
{5410, 24, 29, 28, 2, -19}, // 0x79 'y'
|
||||||
|
{5497, 17, 20, 28, 6, -19}, // 0x7A 'z'
|
||||||
|
{5540, 11, 34, 28, 8, -27}, // 0x7B '{'
|
||||||
|
{5587, 2, 34, 28, 13, -27}, // 0x7C '|'
|
||||||
|
{5596, 11, 34, 28, 9, -27}, // 0x7D '}'
|
||||||
|
{5643, 20, 6, 28, 4, -15}}; // 0x7E '~'
|
||||||
|
|
||||||
|
const GFXfont FreeMono24pt7b PROGMEM = {(uint8_t *)FreeMono24pt7bBitmaps,
|
||||||
|
(GFXglyph *)FreeMono24pt7bGlyphs, 0x20,
|
||||||
|
0x7E, 47};
|
||||||
|
|
||||||
|
// Approx. 6330 bytes
|
||||||
178
libraries/Adafruit_GFX_Library/Fonts/FreeMono9pt7b.h
Normal file
178
libraries/Adafruit_GFX_Library/Fonts/FreeMono9pt7b.h
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
|
||||||
|
const uint8_t FreeMono9pt7bBitmaps[] PROGMEM = {
|
||||||
|
0xAA, 0xA8, 0x0C, 0xED, 0x24, 0x92, 0x48, 0x24, 0x48, 0x91, 0x2F, 0xE4,
|
||||||
|
0x89, 0x7F, 0x28, 0x51, 0x22, 0x40, 0x08, 0x3E, 0x62, 0x40, 0x30, 0x0E,
|
||||||
|
0x01, 0x81, 0xC3, 0xBE, 0x08, 0x08, 0x71, 0x12, 0x23, 0x80, 0x23, 0xB8,
|
||||||
|
0x0E, 0x22, 0x44, 0x70, 0x38, 0x81, 0x02, 0x06, 0x1A, 0x65, 0x46, 0xC8,
|
||||||
|
0xEC, 0xE9, 0x24, 0x5A, 0xAA, 0xA9, 0x40, 0xA9, 0x55, 0x5A, 0x80, 0x10,
|
||||||
|
0x22, 0x4B, 0xE3, 0x05, 0x11, 0x00, 0x10, 0x20, 0x47, 0xF1, 0x02, 0x04,
|
||||||
|
0x00, 0x6B, 0x48, 0xFF, 0x00, 0xF0, 0x02, 0x08, 0x10, 0x60, 0x81, 0x04,
|
||||||
|
0x08, 0x20, 0x41, 0x02, 0x08, 0x00, 0x38, 0x8A, 0x0C, 0x18, 0x30, 0x60,
|
||||||
|
0xC1, 0x82, 0x88, 0xE0, 0x27, 0x28, 0x42, 0x10, 0x84, 0x21, 0x3E, 0x38,
|
||||||
|
0x8A, 0x08, 0x10, 0x20, 0x82, 0x08, 0x61, 0x03, 0xF8, 0x7C, 0x06, 0x02,
|
||||||
|
0x02, 0x1C, 0x06, 0x01, 0x01, 0x01, 0x42, 0x3C, 0x18, 0xA2, 0x92, 0x8A,
|
||||||
|
0x28, 0xBF, 0x08, 0x21, 0xC0, 0x7C, 0x81, 0x03, 0xE4, 0x40, 0x40, 0x81,
|
||||||
|
0x03, 0x88, 0xE0, 0x1E, 0x41, 0x04, 0x0B, 0x98, 0xB0, 0xC1, 0xC2, 0x88,
|
||||||
|
0xE0, 0xFE, 0x04, 0x08, 0x20, 0x40, 0x82, 0x04, 0x08, 0x20, 0x40, 0x38,
|
||||||
|
0x8A, 0x0C, 0x14, 0x47, 0x11, 0x41, 0x83, 0x8C, 0xE0, 0x38, 0x8A, 0x1C,
|
||||||
|
0x18, 0x68, 0xCE, 0x81, 0x04, 0x13, 0xC0, 0xF0, 0x0F, 0x6C, 0x00, 0xD2,
|
||||||
|
0xD2, 0x00, 0x03, 0x04, 0x18, 0x60, 0x60, 0x18, 0x04, 0x03, 0xFF, 0x80,
|
||||||
|
0x00, 0x1F, 0xF0, 0x40, 0x18, 0x03, 0x00, 0x60, 0x20, 0x60, 0xC0, 0x80,
|
||||||
|
0x3D, 0x84, 0x08, 0x30, 0xC2, 0x00, 0x00, 0x00, 0x30, 0x3C, 0x46, 0x82,
|
||||||
|
0x8E, 0xB2, 0xA2, 0xA2, 0x9F, 0x80, 0x80, 0x40, 0x3C, 0x3C, 0x01, 0x40,
|
||||||
|
0x28, 0x09, 0x01, 0x10, 0x42, 0x0F, 0xC1, 0x04, 0x40, 0x9E, 0x3C, 0xFE,
|
||||||
|
0x21, 0x90, 0x48, 0x67, 0xE2, 0x09, 0x02, 0x81, 0x41, 0xFF, 0x80, 0x3E,
|
||||||
|
0xB0, 0xF0, 0x30, 0x08, 0x04, 0x02, 0x00, 0x80, 0x60, 0x8F, 0x80, 0xFE,
|
||||||
|
0x21, 0x90, 0x68, 0x14, 0x0A, 0x05, 0x02, 0x83, 0x43, 0x7F, 0x00, 0xFF,
|
||||||
|
0x20, 0x90, 0x08, 0x87, 0xC2, 0x21, 0x00, 0x81, 0x40, 0xFF, 0xC0, 0xFF,
|
||||||
|
0xA0, 0x50, 0x08, 0x87, 0xC2, 0x21, 0x00, 0x80, 0x40, 0x78, 0x00, 0x1E,
|
||||||
|
0x98, 0x6C, 0x0A, 0x00, 0x80, 0x20, 0xF8, 0x0B, 0x02, 0x60, 0x87, 0xC0,
|
||||||
|
0xE3, 0xA0, 0x90, 0x48, 0x27, 0xF2, 0x09, 0x04, 0x82, 0x41, 0x71, 0xC0,
|
||||||
|
0xF9, 0x08, 0x42, 0x10, 0x84, 0x27, 0xC0, 0x1F, 0x02, 0x02, 0x02, 0x02,
|
||||||
|
0x02, 0x82, 0x82, 0xC6, 0x78, 0xE3, 0xA1, 0x11, 0x09, 0x05, 0x83, 0x21,
|
||||||
|
0x08, 0x84, 0x41, 0x70, 0xC0, 0xE0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41,
|
||||||
|
0x41, 0x41, 0xFF, 0xE0, 0xEC, 0x19, 0x45, 0x28, 0xA4, 0xA4, 0x94, 0x91,
|
||||||
|
0x12, 0x02, 0x40, 0x5C, 0x1C, 0xC3, 0xB0, 0x94, 0x4A, 0x24, 0x92, 0x49,
|
||||||
|
0x14, 0x8A, 0x43, 0x70, 0x80, 0x1E, 0x31, 0x90, 0x50, 0x18, 0x0C, 0x06,
|
||||||
|
0x02, 0x82, 0x63, 0x0F, 0x00, 0xFE, 0x43, 0x41, 0x41, 0x42, 0x7C, 0x40,
|
||||||
|
0x40, 0x40, 0xF0, 0x1C, 0x31, 0x90, 0x50, 0x18, 0x0C, 0x06, 0x02, 0x82,
|
||||||
|
0x63, 0x1F, 0x04, 0x07, 0x92, 0x30, 0xFE, 0x21, 0x90, 0x48, 0x24, 0x23,
|
||||||
|
0xE1, 0x10, 0x84, 0x41, 0x70, 0xC0, 0x3A, 0xCD, 0x0A, 0x03, 0x01, 0x80,
|
||||||
|
0xC1, 0xC7, 0x78, 0xFF, 0xC4, 0x62, 0x21, 0x00, 0x80, 0x40, 0x20, 0x10,
|
||||||
|
0x08, 0x1F, 0x00, 0xE3, 0xA0, 0x90, 0x48, 0x24, 0x12, 0x09, 0x04, 0x82,
|
||||||
|
0x22, 0x0E, 0x00, 0xF1, 0xE8, 0x10, 0x82, 0x10, 0x42, 0x10, 0x22, 0x04,
|
||||||
|
0x80, 0x50, 0x0C, 0x00, 0x80, 0xF1, 0xE8, 0x09, 0x11, 0x25, 0x44, 0xA8,
|
||||||
|
0x55, 0x0C, 0xA1, 0x8C, 0x31, 0x84, 0x30, 0xE3, 0xA0, 0x88, 0x82, 0x80,
|
||||||
|
0x80, 0xC0, 0x90, 0x44, 0x41, 0x71, 0xC0, 0xE3, 0xA0, 0x88, 0x82, 0x81,
|
||||||
|
0x40, 0x40, 0x20, 0x10, 0x08, 0x1F, 0x00, 0xFD, 0x0A, 0x20, 0x81, 0x04,
|
||||||
|
0x10, 0x21, 0x83, 0xFC, 0xEA, 0xAA, 0xAA, 0xC0, 0x80, 0x81, 0x03, 0x02,
|
||||||
|
0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0xD5, 0x55, 0x55, 0xC0,
|
||||||
|
0x10, 0x51, 0x22, 0x28, 0x20, 0xFF, 0xE0, 0x88, 0x80, 0x7E, 0x00, 0x80,
|
||||||
|
0x47, 0xEC, 0x14, 0x0A, 0x0C, 0xFB, 0xC0, 0x20, 0x10, 0x0B, 0xC6, 0x12,
|
||||||
|
0x05, 0x02, 0x81, 0x40, 0xB0, 0xB7, 0x80, 0x3A, 0x8E, 0x0C, 0x08, 0x10,
|
||||||
|
0x10, 0x9E, 0x03, 0x00, 0x80, 0x47, 0xA4, 0x34, 0x0A, 0x05, 0x02, 0x81,
|
||||||
|
0x21, 0x8F, 0x60, 0x3C, 0x43, 0x81, 0xFF, 0x80, 0x80, 0x61, 0x3E, 0x3D,
|
||||||
|
0x04, 0x3E, 0x41, 0x04, 0x10, 0x41, 0x0F, 0x80, 0x3D, 0xA1, 0xA0, 0x50,
|
||||||
|
0x28, 0x14, 0x09, 0x0C, 0x7A, 0x01, 0x01, 0x87, 0x80, 0xC0, 0x20, 0x10,
|
||||||
|
0x0B, 0xC6, 0x32, 0x09, 0x04, 0x82, 0x41, 0x20, 0xB8, 0xE0, 0x10, 0x01,
|
||||||
|
0xC0, 0x81, 0x02, 0x04, 0x08, 0x11, 0xFC, 0x10, 0x3E, 0x10, 0x84, 0x21,
|
||||||
|
0x08, 0x42, 0x3F, 0x00, 0xC0, 0x40, 0x40, 0x4F, 0x44, 0x58, 0x70, 0x48,
|
||||||
|
0x44, 0x42, 0xC7, 0x70, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, 0x23,
|
||||||
|
0xF8, 0xB7, 0x64, 0x62, 0x31, 0x18, 0x8C, 0x46, 0x23, 0x91, 0x5E, 0x31,
|
||||||
|
0x90, 0x48, 0x24, 0x12, 0x09, 0x05, 0xC7, 0x3E, 0x31, 0xA0, 0x30, 0x18,
|
||||||
|
0x0C, 0x05, 0x8C, 0x7C, 0xDE, 0x30, 0x90, 0x28, 0x14, 0x0A, 0x05, 0x84,
|
||||||
|
0xBC, 0x40, 0x20, 0x38, 0x00, 0x3D, 0xA1, 0xA0, 0x50, 0x28, 0x14, 0x09,
|
||||||
|
0x0C, 0x7A, 0x01, 0x00, 0x80, 0xE0, 0xCE, 0xA1, 0x82, 0x04, 0x08, 0x10,
|
||||||
|
0x7C, 0x3A, 0x8D, 0x0B, 0x80, 0xF0, 0x70, 0xDE, 0x40, 0x40, 0xFC, 0x40,
|
||||||
|
0x40, 0x40, 0x40, 0x40, 0x41, 0x3E, 0xC3, 0x41, 0x41, 0x41, 0x41, 0x41,
|
||||||
|
0x43, 0x3D, 0xE3, 0xA0, 0x90, 0x84, 0x42, 0x20, 0xA0, 0x50, 0x10, 0xE3,
|
||||||
|
0xC0, 0x92, 0x4B, 0x25, 0x92, 0xA9, 0x98, 0x44, 0xE3, 0x31, 0x05, 0x01,
|
||||||
|
0x01, 0x41, 0x11, 0x05, 0xC7, 0xE3, 0xA0, 0x90, 0x84, 0x42, 0x40, 0xA0,
|
||||||
|
0x60, 0x10, 0x10, 0x08, 0x3E, 0x00, 0xFD, 0x08, 0x20, 0x82, 0x08, 0x10,
|
||||||
|
0xBF, 0x29, 0x24, 0xA2, 0x49, 0x26, 0xFF, 0xF8, 0x89, 0x24, 0x8A, 0x49,
|
||||||
|
0x2C, 0x61, 0x24, 0x30};
|
||||||
|
|
||||||
|
const GFXglyph FreeMono9pt7bGlyphs[] PROGMEM = {
|
||||||
|
{0, 0, 0, 11, 0, 1}, // 0x20 ' '
|
||||||
|
{0, 2, 11, 11, 4, -10}, // 0x21 '!'
|
||||||
|
{3, 6, 5, 11, 2, -10}, // 0x22 '"'
|
||||||
|
{7, 7, 12, 11, 2, -10}, // 0x23 '#'
|
||||||
|
{18, 8, 12, 11, 1, -10}, // 0x24 '$'
|
||||||
|
{30, 7, 11, 11, 2, -10}, // 0x25 '%'
|
||||||
|
{40, 7, 10, 11, 2, -9}, // 0x26 '&'
|
||||||
|
{49, 3, 5, 11, 4, -10}, // 0x27 '''
|
||||||
|
{51, 2, 13, 11, 5, -10}, // 0x28 '('
|
||||||
|
{55, 2, 13, 11, 4, -10}, // 0x29 ')'
|
||||||
|
{59, 7, 7, 11, 2, -10}, // 0x2A '*'
|
||||||
|
{66, 7, 7, 11, 2, -8}, // 0x2B '+'
|
||||||
|
{73, 3, 5, 11, 2, -1}, // 0x2C ','
|
||||||
|
{75, 9, 1, 11, 1, -5}, // 0x2D '-'
|
||||||
|
{77, 2, 2, 11, 4, -1}, // 0x2E '.'
|
||||||
|
{78, 7, 13, 11, 2, -11}, // 0x2F '/'
|
||||||
|
{90, 7, 11, 11, 2, -10}, // 0x30 '0'
|
||||||
|
{100, 5, 11, 11, 3, -10}, // 0x31 '1'
|
||||||
|
{107, 7, 11, 11, 2, -10}, // 0x32 '2'
|
||||||
|
{117, 8, 11, 11, 1, -10}, // 0x33 '3'
|
||||||
|
{128, 6, 11, 11, 3, -10}, // 0x34 '4'
|
||||||
|
{137, 7, 11, 11, 2, -10}, // 0x35 '5'
|
||||||
|
{147, 7, 11, 11, 2, -10}, // 0x36 '6'
|
||||||
|
{157, 7, 11, 11, 2, -10}, // 0x37 '7'
|
||||||
|
{167, 7, 11, 11, 2, -10}, // 0x38 '8'
|
||||||
|
{177, 7, 11, 11, 2, -10}, // 0x39 '9'
|
||||||
|
{187, 2, 8, 11, 4, -7}, // 0x3A ':'
|
||||||
|
{189, 3, 11, 11, 3, -7}, // 0x3B ';'
|
||||||
|
{194, 8, 8, 11, 1, -8}, // 0x3C '<'
|
||||||
|
{202, 9, 4, 11, 1, -6}, // 0x3D '='
|
||||||
|
{207, 9, 8, 11, 1, -8}, // 0x3E '>'
|
||||||
|
{216, 7, 10, 11, 2, -9}, // 0x3F '?'
|
||||||
|
{225, 8, 12, 11, 2, -10}, // 0x40 '@'
|
||||||
|
{237, 11, 10, 11, 0, -9}, // 0x41 'A'
|
||||||
|
{251, 9, 10, 11, 1, -9}, // 0x42 'B'
|
||||||
|
{263, 9, 10, 11, 1, -9}, // 0x43 'C'
|
||||||
|
{275, 9, 10, 11, 1, -9}, // 0x44 'D'
|
||||||
|
{287, 9, 10, 11, 1, -9}, // 0x45 'E'
|
||||||
|
{299, 9, 10, 11, 1, -9}, // 0x46 'F'
|
||||||
|
{311, 10, 10, 11, 1, -9}, // 0x47 'G'
|
||||||
|
{324, 9, 10, 11, 1, -9}, // 0x48 'H'
|
||||||
|
{336, 5, 10, 11, 3, -9}, // 0x49 'I'
|
||||||
|
{343, 8, 10, 11, 2, -9}, // 0x4A 'J'
|
||||||
|
{353, 9, 10, 11, 1, -9}, // 0x4B 'K'
|
||||||
|
{365, 8, 10, 11, 2, -9}, // 0x4C 'L'
|
||||||
|
{375, 11, 10, 11, 0, -9}, // 0x4D 'M'
|
||||||
|
{389, 9, 10, 11, 1, -9}, // 0x4E 'N'
|
||||||
|
{401, 9, 10, 11, 1, -9}, // 0x4F 'O'
|
||||||
|
{413, 8, 10, 11, 1, -9}, // 0x50 'P'
|
||||||
|
{423, 9, 13, 11, 1, -9}, // 0x51 'Q'
|
||||||
|
{438, 9, 10, 11, 1, -9}, // 0x52 'R'
|
||||||
|
{450, 7, 10, 11, 2, -9}, // 0x53 'S'
|
||||||
|
{459, 9, 10, 11, 1, -9}, // 0x54 'T'
|
||||||
|
{471, 9, 10, 11, 1, -9}, // 0x55 'U'
|
||||||
|
{483, 11, 10, 11, 0, -9}, // 0x56 'V'
|
||||||
|
{497, 11, 10, 11, 0, -9}, // 0x57 'W'
|
||||||
|
{511, 9, 10, 11, 1, -9}, // 0x58 'X'
|
||||||
|
{523, 9, 10, 11, 1, -9}, // 0x59 'Y'
|
||||||
|
{535, 7, 10, 11, 2, -9}, // 0x5A 'Z'
|
||||||
|
{544, 2, 13, 11, 5, -10}, // 0x5B '['
|
||||||
|
{548, 7, 13, 11, 2, -11}, // 0x5C '\'
|
||||||
|
{560, 2, 13, 11, 4, -10}, // 0x5D ']'
|
||||||
|
{564, 7, 5, 11, 2, -10}, // 0x5E '^'
|
||||||
|
{569, 11, 1, 11, 0, 2}, // 0x5F '_'
|
||||||
|
{571, 3, 3, 11, 3, -11}, // 0x60 '`'
|
||||||
|
{573, 9, 8, 11, 1, -7}, // 0x61 'a'
|
||||||
|
{582, 9, 11, 11, 1, -10}, // 0x62 'b'
|
||||||
|
{595, 7, 8, 11, 2, -7}, // 0x63 'c'
|
||||||
|
{602, 9, 11, 11, 1, -10}, // 0x64 'd'
|
||||||
|
{615, 8, 8, 11, 1, -7}, // 0x65 'e'
|
||||||
|
{623, 6, 11, 11, 3, -10}, // 0x66 'f'
|
||||||
|
{632, 9, 11, 11, 1, -7}, // 0x67 'g'
|
||||||
|
{645, 9, 11, 11, 1, -10}, // 0x68 'h'
|
||||||
|
{658, 7, 10, 11, 2, -9}, // 0x69 'i'
|
||||||
|
{667, 5, 13, 11, 3, -9}, // 0x6A 'j'
|
||||||
|
{676, 8, 11, 11, 2, -10}, // 0x6B 'k'
|
||||||
|
{687, 7, 11, 11, 2, -10}, // 0x6C 'l'
|
||||||
|
{697, 9, 8, 11, 1, -7}, // 0x6D 'm'
|
||||||
|
{706, 9, 8, 11, 1, -7}, // 0x6E 'n'
|
||||||
|
{715, 9, 8, 11, 1, -7}, // 0x6F 'o'
|
||||||
|
{724, 9, 11, 11, 1, -7}, // 0x70 'p'
|
||||||
|
{737, 9, 11, 11, 1, -7}, // 0x71 'q'
|
||||||
|
{750, 7, 8, 11, 3, -7}, // 0x72 'r'
|
||||||
|
{757, 7, 8, 11, 2, -7}, // 0x73 's'
|
||||||
|
{764, 8, 10, 11, 2, -9}, // 0x74 't'
|
||||||
|
{774, 8, 8, 11, 1, -7}, // 0x75 'u'
|
||||||
|
{782, 9, 8, 11, 1, -7}, // 0x76 'v'
|
||||||
|
{791, 9, 8, 11, 1, -7}, // 0x77 'w'
|
||||||
|
{800, 9, 8, 11, 1, -7}, // 0x78 'x'
|
||||||
|
{809, 9, 11, 11, 1, -7}, // 0x79 'y'
|
||||||
|
{822, 7, 8, 11, 2, -7}, // 0x7A 'z'
|
||||||
|
{829, 3, 13, 11, 4, -10}, // 0x7B '{'
|
||||||
|
{834, 1, 13, 11, 5, -10}, // 0x7C '|'
|
||||||
|
{836, 3, 13, 11, 4, -10}, // 0x7D '}'
|
||||||
|
{841, 7, 3, 11, 2, -6}}; // 0x7E '~'
|
||||||
|
|
||||||
|
const GFXfont FreeMono9pt7b PROGMEM = {(uint8_t *)FreeMono9pt7bBitmaps,
|
||||||
|
(GFXglyph *)FreeMono9pt7bGlyphs, 0x20,
|
||||||
|
0x7E, 18};
|
||||||
|
|
||||||
|
// Approx. 1516 bytes
|
||||||
252
libraries/Adafruit_GFX_Library/Fonts/FreeMonoBold12pt7b.h
Normal file
252
libraries/Adafruit_GFX_Library/Fonts/FreeMonoBold12pt7b.h
Normal file
@@ -0,0 +1,252 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
|
||||||
|
const uint8_t FreeMonoBold12pt7bBitmaps[] PROGMEM = {
|
||||||
|
0xFF, 0xFF, 0xFF, 0xF6, 0x66, 0x60, 0x6F, 0x60, 0xE7, 0xE7, 0x62, 0x42,
|
||||||
|
0x42, 0x42, 0x42, 0x11, 0x87, 0x30, 0xC6, 0x18, 0xC3, 0x31, 0xFF, 0xFF,
|
||||||
|
0xF9, 0x98, 0x33, 0x06, 0x60, 0xCC, 0x7F, 0xEF, 0xFC, 0x66, 0x0C, 0xC3,
|
||||||
|
0x98, 0x63, 0x04, 0x40, 0x0C, 0x03, 0x00, 0xC0, 0xFE, 0x7F, 0x9C, 0x66,
|
||||||
|
0x09, 0x80, 0x78, 0x0F, 0xE0, 0x7F, 0x03, 0xE0, 0xF8, 0x7F, 0xFB, 0xFC,
|
||||||
|
0x0C, 0x03, 0x00, 0xC0, 0x30, 0x38, 0x1F, 0x0C, 0x42, 0x10, 0xC4, 0x1F,
|
||||||
|
0x03, 0x9C, 0x3C, 0x7F, 0x33, 0xE0, 0x8C, 0x21, 0x08, 0xC3, 0xE0, 0x70,
|
||||||
|
0x3E, 0x1F, 0xC6, 0x61, 0x80, 0x70, 0x0C, 0x07, 0x83, 0xEE, 0xDF, 0xB3,
|
||||||
|
0xCC, 0x73, 0xFE, 0x7F, 0x80, 0xFD, 0x24, 0x90, 0x39, 0xDC, 0xE6, 0x73,
|
||||||
|
0x18, 0xC6, 0x31, 0x8C, 0x31, 0x8E, 0x31, 0xC4, 0xE7, 0x1C, 0xE3, 0x1C,
|
||||||
|
0x63, 0x18, 0xC6, 0x31, 0x98, 0xCE, 0x67, 0x10, 0x0C, 0x03, 0x00, 0xC3,
|
||||||
|
0xB7, 0xFF, 0xDF, 0xE1, 0xE0, 0xFC, 0x33, 0x0C, 0xC0, 0x06, 0x00, 0x60,
|
||||||
|
0x06, 0x00, 0x60, 0x06, 0x0F, 0xFF, 0xFF, 0xF0, 0x60, 0x06, 0x00, 0x60,
|
||||||
|
0x06, 0x00, 0x60, 0x06, 0x00, 0x3B, 0x9C, 0xCE, 0x62, 0x00, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0x80, 0x00, 0x40, 0x30, 0x1C, 0x07, 0x03, 0x80, 0xE0, 0x30,
|
||||||
|
0x1C, 0x06, 0x03, 0x80, 0xC0, 0x70, 0x18, 0x0E, 0x03, 0x01, 0xC0, 0x60,
|
||||||
|
0x38, 0x0E, 0x01, 0x00, 0x1E, 0x0F, 0xC6, 0x1B, 0x87, 0xC0, 0xF0, 0x3C,
|
||||||
|
0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x87, 0x61, 0x8F, 0xC1, 0xE0, 0x1C,
|
||||||
|
0x0F, 0x0F, 0xC3, 0xB0, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00,
|
||||||
|
0xC0, 0x30, 0x0C, 0x3F, 0xFF, 0xFC, 0x1F, 0x1F, 0xEE, 0x1F, 0x83, 0xC0,
|
||||||
|
0xC0, 0x70, 0x38, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE3, 0xF0, 0xFF, 0xFF,
|
||||||
|
0xFC, 0x3F, 0x0F, 0xF1, 0x87, 0x00, 0x60, 0x0C, 0x03, 0x83, 0xE0, 0x7C,
|
||||||
|
0x01, 0xC0, 0x0C, 0x01, 0x80, 0x3C, 0x0F, 0xFF, 0x9F, 0xC0, 0x07, 0x07,
|
||||||
|
0x83, 0xC3, 0xE1, 0xB1, 0xD8, 0xCC, 0xC6, 0xE3, 0x7F, 0xFF, 0xE0, 0x61,
|
||||||
|
0xF8, 0xFC, 0x7F, 0x9F, 0xE6, 0x01, 0x80, 0x60, 0x1F, 0x87, 0xF9, 0x86,
|
||||||
|
0x00, 0xC0, 0x30, 0x0C, 0x03, 0xC1, 0xBF, 0xE7, 0xE0, 0x07, 0xC7, 0xF3,
|
||||||
|
0xC1, 0xC0, 0x60, 0x38, 0x0E, 0xF3, 0xFE, 0xF1, 0xF8, 0x3E, 0x0F, 0x83,
|
||||||
|
0x71, 0xCF, 0xE1, 0xF0, 0xFF, 0xFF, 0xFC, 0x1F, 0x07, 0x01, 0x80, 0x60,
|
||||||
|
0x38, 0x0C, 0x03, 0x01, 0xC0, 0x60, 0x18, 0x0E, 0x03, 0x00, 0xC0, 0x1E,
|
||||||
|
0x1F, 0xEE, 0x1F, 0x03, 0xC0, 0xF0, 0x36, 0x19, 0xFE, 0x7F, 0xB8, 0x7C,
|
||||||
|
0x0F, 0x03, 0xE1, 0xDF, 0xE3, 0xF0, 0x3E, 0x1F, 0xCE, 0x3B, 0x07, 0xC1,
|
||||||
|
0xF0, 0x7E, 0x3D, 0xFF, 0x3D, 0xC0, 0x70, 0x18, 0x0E, 0x0F, 0x3F, 0x8F,
|
||||||
|
0x80, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x77, 0x70, 0x00, 0x00, 0x76, 0x6C,
|
||||||
|
0xC8, 0x80, 0x00, 0x30, 0x0F, 0x03, 0xE0, 0xF8, 0x3E, 0x0F, 0x80, 0x3E,
|
||||||
|
0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0x60, 0x0F, 0x80, 0x3E, 0x00, 0xF8,
|
||||||
|
0x03, 0xE0, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x0F, 0x00, 0x40, 0x00, 0x7C,
|
||||||
|
0x7F, 0xB0, 0xF8, 0x30, 0x18, 0x1C, 0x3C, 0x3C, 0x18, 0x08, 0x00, 0x07,
|
||||||
|
0x03, 0x81, 0xC0, 0x1E, 0x07, 0xF1, 0xC7, 0x30, 0x6C, 0x0D, 0x87, 0xB3,
|
||||||
|
0xF6, 0xE6, 0xD8, 0xDB, 0x1B, 0x73, 0x67, 0xFC, 0x7F, 0x80, 0x30, 0x03,
|
||||||
|
0x00, 0x71, 0xC7, 0xF8, 0x7C, 0x00, 0x3F, 0x80, 0x7F, 0x80, 0x1F, 0x00,
|
||||||
|
0x76, 0x00, 0xEE, 0x01, 0x8C, 0x07, 0x18, 0x0E, 0x38, 0x1F, 0xF0, 0x7F,
|
||||||
|
0xF0, 0xC0, 0x61, 0x80, 0xCF, 0xC7, 0xFF, 0x8F, 0xC0, 0xFF, 0xC7, 0xFF,
|
||||||
|
0x0C, 0x1C, 0x60, 0x63, 0x03, 0x18, 0x38, 0xFF, 0x87, 0xFE, 0x30, 0x39,
|
||||||
|
0x80, 0xCC, 0x06, 0x60, 0x7F, 0xFF, 0x7F, 0xF0, 0x0F, 0xF3, 0xFF, 0x70,
|
||||||
|
0x76, 0x03, 0xC0, 0x3C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0x60,
|
||||||
|
0x37, 0x07, 0x3F, 0xF0, 0xFC, 0xFF, 0x0F, 0xFC, 0x60, 0xE6, 0x06, 0x60,
|
||||||
|
0x36, 0x03, 0x60, 0x36, 0x03, 0x60, 0x36, 0x03, 0x60, 0x76, 0x0E, 0xFF,
|
||||||
|
0xCF, 0xF8, 0xFF, 0xF7, 0xFF, 0x8C, 0x0C, 0x60, 0x63, 0x1B, 0x18, 0xC0,
|
||||||
|
0xFE, 0x07, 0xF0, 0x31, 0x81, 0x8C, 0xCC, 0x06, 0x60, 0x3F, 0xFF, 0xFF,
|
||||||
|
0xFC, 0xFF, 0xFF, 0xFF, 0xCC, 0x06, 0x60, 0x33, 0x19, 0x98, 0xC0, 0xFE,
|
||||||
|
0x07, 0xF0, 0x31, 0x81, 0x8C, 0x0C, 0x00, 0x60, 0x0F, 0xF0, 0x7F, 0x80,
|
||||||
|
0x0F, 0xF1, 0xFF, 0x9C, 0x1C, 0xC0, 0x6C, 0x03, 0x60, 0x03, 0x00, 0x18,
|
||||||
|
0x7F, 0xC3, 0xFE, 0x01, 0xB8, 0x0C, 0xE0, 0xE3, 0xFF, 0x07, 0xE0, 0x7C,
|
||||||
|
0xF9, 0xF3, 0xE3, 0x03, 0x0C, 0x0C, 0x30, 0x30, 0xC0, 0xC3, 0xFF, 0x0F,
|
||||||
|
0xFC, 0x30, 0x30, 0xC0, 0xC3, 0x03, 0x0C, 0x0C, 0xFC, 0xFF, 0xF3, 0xF0,
|
||||||
|
0xFF, 0xFF, 0xF0, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03,
|
||||||
|
0x00, 0xC0, 0x30, 0xFF, 0xFF, 0xF0, 0x0F, 0xF8, 0x7F, 0xC0, 0x30, 0x01,
|
||||||
|
0x80, 0x0C, 0x00, 0x60, 0x03, 0x18, 0x18, 0xC0, 0xC6, 0x06, 0x30, 0x31,
|
||||||
|
0xC3, 0x0F, 0xF8, 0x1F, 0x00, 0xFC, 0xFB, 0xF3, 0xE3, 0x0E, 0x0C, 0x70,
|
||||||
|
0x33, 0x80, 0xFC, 0x03, 0xF0, 0x0F, 0xE0, 0x39, 0xC0, 0xC3, 0x03, 0x0E,
|
||||||
|
0x0C, 0x18, 0xFC, 0x7F, 0xF0, 0xF0, 0xFF, 0x0F, 0xF0, 0x18, 0x01, 0x80,
|
||||||
|
0x18, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x31, 0x83, 0x18, 0x31, 0x83,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xF0, 0x3F, 0xC0, 0xF7, 0x87, 0x9E, 0x1E, 0x7C, 0xF9,
|
||||||
|
0xB3, 0xE6, 0xFD, 0x99, 0xF6, 0x67, 0x99, 0x8E, 0x66, 0x31, 0x98, 0x06,
|
||||||
|
0xFC, 0xFF, 0xF3, 0xF0, 0xF1, 0xFF, 0xCF, 0xCF, 0x0C, 0x78, 0x63, 0xE3,
|
||||||
|
0x1B, 0x18, 0xDC, 0xC6, 0x76, 0x31, 0xB1, 0x8F, 0x8C, 0x3C, 0x61, 0xE7,
|
||||||
|
0xE7, 0x3F, 0x18, 0x0F, 0x03, 0xFC, 0x70, 0xE6, 0x06, 0xE0, 0x7C, 0x03,
|
||||||
|
0xC0, 0x3C, 0x03, 0xC0, 0x3E, 0x07, 0x60, 0x67, 0x0E, 0x3F, 0xC0, 0xF0,
|
||||||
|
0xFF, 0x8F, 0xFE, 0x30, 0x73, 0x03, 0x30, 0x33, 0x03, 0x30, 0x73, 0xFE,
|
||||||
|
0x3F, 0x83, 0x00, 0x30, 0x03, 0x00, 0xFF, 0x0F, 0xF0, 0x0F, 0x03, 0xFC,
|
||||||
|
0x70, 0xE6, 0x06, 0xE0, 0x7C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3E, 0x07,
|
||||||
|
0x60, 0x67, 0x0E, 0x3F, 0xC1, 0xF0, 0x18, 0x33, 0xFF, 0x3F, 0xE0, 0xFF,
|
||||||
|
0x83, 0xFF, 0x83, 0x07, 0x0C, 0x0C, 0x30, 0x30, 0xC1, 0xC3, 0xFE, 0x0F,
|
||||||
|
0xF0, 0x31, 0xE0, 0xC3, 0x83, 0x07, 0x0C, 0x0C, 0xFE, 0x3F, 0xF8, 0x70,
|
||||||
|
0x3F, 0xDF, 0xFE, 0x1F, 0x03, 0xC0, 0xF8, 0x07, 0xE0, 0x7E, 0x01, 0xF0,
|
||||||
|
0x3C, 0x0F, 0x87, 0xFF, 0xBF, 0xC0, 0xFF, 0xFF, 0xFF, 0xC6, 0x3C, 0x63,
|
||||||
|
0xC6, 0x3C, 0x63, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60,
|
||||||
|
0x3F, 0xC3, 0xFC, 0xFF, 0xFF, 0xFF, 0x60, 0x66, 0x06, 0x60, 0x66, 0x06,
|
||||||
|
0x60, 0x66, 0x06, 0x60, 0x66, 0x06, 0x60, 0x63, 0x9C, 0x1F, 0xC0, 0xF0,
|
||||||
|
0xFC, 0x3F, 0xFC, 0x3F, 0x30, 0x0C, 0x38, 0x1C, 0x18, 0x18, 0x1C, 0x38,
|
||||||
|
0x1C, 0x38, 0x0E, 0x70, 0x0E, 0x70, 0x0F, 0x60, 0x07, 0xE0, 0x07, 0xE0,
|
||||||
|
0x03, 0xC0, 0x03, 0xC0, 0xFC, 0xFF, 0xF3, 0xF6, 0x01, 0xDC, 0xC6, 0x77,
|
||||||
|
0x99, 0xDE, 0x67, 0x79, 0x8D, 0xFE, 0x3F, 0xF8, 0xF3, 0xE3, 0xCF, 0x8F,
|
||||||
|
0x3C, 0x38, 0x70, 0xE1, 0xC0, 0xF8, 0xFB, 0xE3, 0xE3, 0x86, 0x0F, 0x38,
|
||||||
|
0x1F, 0xC0, 0x3E, 0x00, 0x70, 0x03, 0xE0, 0x0F, 0x80, 0x77, 0x03, 0x8E,
|
||||||
|
0x1E, 0x1C, 0xFC, 0xFF, 0xF3, 0xF0, 0xF9, 0xFF, 0x9F, 0x30, 0xC3, 0x9C,
|
||||||
|
0x19, 0x81, 0xF8, 0x0F, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60,
|
||||||
|
0x3F, 0xC3, 0xFC, 0xFF, 0xBF, 0xEC, 0x3B, 0x0C, 0xC6, 0x33, 0x80, 0xC0,
|
||||||
|
0x60, 0x38, 0xCC, 0x36, 0x0F, 0x03, 0xFF, 0xFF, 0xF0, 0xFF, 0xF1, 0x8C,
|
||||||
|
0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC7, 0xFE, 0x40, 0x30, 0x0E,
|
||||||
|
0x01, 0x80, 0x70, 0x0C, 0x03, 0x80, 0x60, 0x1C, 0x03, 0x00, 0xE0, 0x18,
|
||||||
|
0x07, 0x00, 0xC0, 0x38, 0x0E, 0x01, 0xC0, 0x70, 0x0C, 0x01, 0xFF, 0xC6,
|
||||||
|
0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x1F, 0xFE, 0x04, 0x03,
|
||||||
|
0x01, 0xE0, 0xFC, 0x7B, 0x9C, 0x7E, 0x1F, 0x03, 0xFF, 0xFF, 0xFF, 0xF0,
|
||||||
|
0xCE, 0x73, 0x3F, 0x07, 0xF8, 0x00, 0xC0, 0x0C, 0x1F, 0xC7, 0xFC, 0x60,
|
||||||
|
0xCC, 0x0C, 0xC1, 0xCF, 0xFF, 0x3F, 0xF0, 0xF0, 0x07, 0x80, 0x0C, 0x00,
|
||||||
|
0x60, 0x03, 0x7C, 0x1F, 0xF8, 0xF1, 0xC7, 0x07, 0x30, 0x19, 0x80, 0xCC,
|
||||||
|
0x06, 0x60, 0x73, 0xC7, 0x7F, 0xFB, 0xDF, 0x00, 0x1F, 0xB3, 0xFF, 0x70,
|
||||||
|
0xFE, 0x07, 0xC0, 0x3C, 0x00, 0xC0, 0x0C, 0x00, 0x70, 0x77, 0xFF, 0x1F,
|
||||||
|
0xC0, 0x01, 0xE0, 0x0F, 0x00, 0x18, 0x00, 0xC1, 0xF6, 0x3F, 0xF1, 0xC7,
|
||||||
|
0x9C, 0x1C, 0xC0, 0x66, 0x03, 0x30, 0x19, 0x81, 0xC7, 0x1E, 0x3F, 0xFC,
|
||||||
|
0x7D, 0xE0, 0x1F, 0x83, 0xFC, 0x70, 0xEE, 0x07, 0xFF, 0xFF, 0xFF, 0xE0,
|
||||||
|
0x0E, 0x00, 0x70, 0x73, 0xFF, 0x1F, 0xC0, 0x07, 0xC3, 0xFC, 0x60, 0x0C,
|
||||||
|
0x0F, 0xFD, 0xFF, 0x86, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01,
|
||||||
|
0x81, 0xFF, 0xBF, 0xF0, 0x1F, 0x79, 0xFF, 0xDC, 0x79, 0x81, 0xCC, 0x06,
|
||||||
|
0x60, 0x33, 0x01, 0x9C, 0x1C, 0x71, 0xE1, 0xFF, 0x07, 0xD8, 0x00, 0xC0,
|
||||||
|
0x06, 0x00, 0x70, 0x7F, 0x03, 0xF0, 0xF0, 0x03, 0xC0, 0x03, 0x00, 0x0C,
|
||||||
|
0x00, 0x37, 0xC0, 0xFF, 0x83, 0xC7, 0x0C, 0x0C, 0x30, 0x30, 0xC0, 0xC3,
|
||||||
|
0x03, 0x0C, 0x0C, 0x30, 0x33, 0xF3, 0xFF, 0xCF, 0xC0, 0x06, 0x00, 0xC0,
|
||||||
|
0x00, 0x3F, 0x07, 0xE0, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18,
|
||||||
|
0x03, 0x0F, 0xFF, 0xFF, 0xC0, 0x06, 0x06, 0x00, 0xFF, 0xFF, 0x03, 0x03,
|
||||||
|
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07, 0xFE, 0xFC,
|
||||||
|
0xF0, 0x07, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x3F, 0x19, 0xF8, 0xDE, 0x07,
|
||||||
|
0xE0, 0x3E, 0x01, 0xF0, 0x0F, 0xC0, 0x6F, 0x03, 0x1C, 0x78, 0xFF, 0xC7,
|
||||||
|
0xE0, 0x7E, 0x0F, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30,
|
||||||
|
0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x61, 0xFF, 0xFF, 0xF8, 0xFE, 0xF1,
|
||||||
|
0xFF, 0xF1, 0xCE, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31,
|
||||||
|
0x8C, 0x63, 0x19, 0xF7, 0xBF, 0xEF, 0x78, 0x77, 0xC1, 0xFF, 0x83, 0xC7,
|
||||||
|
0x0C, 0x0C, 0x30, 0x30, 0xC0, 0xC3, 0x03, 0x0C, 0x0C, 0x30, 0x33, 0xF1,
|
||||||
|
0xFF, 0xC7, 0xC0, 0x1F, 0x83, 0xFC, 0x70, 0xEE, 0x07, 0xC0, 0x3C, 0x03,
|
||||||
|
0xC0, 0x3E, 0x07, 0x70, 0xE3, 0xFC, 0x1F, 0x80, 0xF7, 0xE3, 0xFF, 0xC3,
|
||||||
|
0xC3, 0x8E, 0x07, 0x30, 0x0C, 0xC0, 0x33, 0x00, 0xCE, 0x07, 0x3C, 0x38,
|
||||||
|
0xFF, 0xC3, 0x7E, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x0F, 0xE0, 0x3F, 0x80,
|
||||||
|
0x1F, 0xBC, 0xFF, 0xF7, 0x0F, 0x38, 0x1C, 0xC0, 0x33, 0x00, 0xCC, 0x03,
|
||||||
|
0x38, 0x1C, 0x70, 0xF0, 0xFF, 0xC1, 0xFB, 0x00, 0x0C, 0x00, 0x30, 0x00,
|
||||||
|
0xC0, 0x1F, 0xC0, 0x7F, 0x79, 0xE7, 0xFF, 0x1F, 0x31, 0xC0, 0x18, 0x01,
|
||||||
|
0x80, 0x18, 0x01, 0x80, 0x18, 0x0F, 0xFC, 0xFF, 0xC0, 0x3F, 0x9F, 0xFE,
|
||||||
|
0x1F, 0x82, 0xFE, 0x1F, 0xE0, 0xFF, 0x03, 0xE0, 0xFF, 0xFF, 0xF0, 0x30,
|
||||||
|
0x06, 0x00, 0xC0, 0x7F, 0xEF, 0xFC, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06,
|
||||||
|
0x00, 0xC0, 0x18, 0x71, 0xFE, 0x1F, 0x00, 0xF1, 0xF7, 0x8F, 0x8C, 0x0C,
|
||||||
|
0x60, 0x63, 0x03, 0x18, 0x18, 0xC0, 0xC6, 0x06, 0x38, 0xF0, 0xFF, 0xC3,
|
||||||
|
0xEE, 0xFC, 0xFF, 0xF3, 0xF3, 0x87, 0x0E, 0x1C, 0x1C, 0x60, 0x73, 0x80,
|
||||||
|
0xEC, 0x03, 0xF0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x00, 0xF8, 0x7F, 0xE1,
|
||||||
|
0xF7, 0x39, 0x8C, 0xE6, 0x37, 0xB0, 0xFF, 0xC3, 0xFF, 0x07, 0xBC, 0x1C,
|
||||||
|
0xF0, 0x73, 0x81, 0x86, 0x00, 0x7C, 0xF9, 0xF3, 0xE3, 0xCF, 0x07, 0xF8,
|
||||||
|
0x0F, 0xC0, 0x1E, 0x00, 0xFC, 0x07, 0x38, 0x38, 0x73, 0xF3, 0xFF, 0xCF,
|
||||||
|
0xC0, 0xF9, 0xFF, 0x9F, 0x70, 0xE3, 0x0C, 0x39, 0xC1, 0x98, 0x19, 0x81,
|
||||||
|
0xF8, 0x0F, 0x00, 0xF0, 0x06, 0x00, 0x60, 0x0E, 0x00, 0xC0, 0xFF, 0x0F,
|
||||||
|
0xF0, 0x7F, 0xCF, 0xF9, 0x8E, 0x33, 0x80, 0x70, 0x1C, 0x07, 0x01, 0xC6,
|
||||||
|
0x70, 0xFF, 0xFF, 0xFF, 0x80, 0x0E, 0x3C, 0x60, 0xC1, 0x83, 0x06, 0x0C,
|
||||||
|
0x39, 0xE3, 0xC0, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x3C, 0x38, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xF0, 0xE1, 0xC0, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x3C,
|
||||||
|
0x79, 0x83, 0x06, 0x0C, 0x18, 0x31, 0xE3, 0x80, 0x3C, 0x37, 0xE7, 0x67,
|
||||||
|
0xE6, 0x1C};
|
||||||
|
|
||||||
|
const GFXglyph FreeMonoBold12pt7bGlyphs[] PROGMEM = {
|
||||||
|
{0, 0, 0, 14, 0, 1}, // 0x20 ' '
|
||||||
|
{0, 4, 15, 14, 5, -14}, // 0x21 '!'
|
||||||
|
{8, 8, 7, 14, 3, -13}, // 0x22 '"'
|
||||||
|
{15, 11, 18, 14, 2, -15}, // 0x23 '#'
|
||||||
|
{40, 10, 20, 14, 2, -16}, // 0x24 '$'
|
||||||
|
{65, 10, 15, 14, 2, -14}, // 0x25 '%'
|
||||||
|
{84, 10, 13, 14, 2, -12}, // 0x26 '&'
|
||||||
|
{101, 3, 7, 14, 5, -13}, // 0x27 '''
|
||||||
|
{104, 5, 19, 14, 6, -14}, // 0x28 '('
|
||||||
|
{116, 5, 19, 14, 3, -14}, // 0x29 ')'
|
||||||
|
{128, 10, 10, 14, 2, -14}, // 0x2A '*'
|
||||||
|
{141, 12, 13, 14, 1, -12}, // 0x2B '+'
|
||||||
|
{161, 5, 7, 14, 4, -2}, // 0x2C ','
|
||||||
|
{166, 12, 2, 14, 1, -7}, // 0x2D '-'
|
||||||
|
{169, 3, 3, 14, 5, -2}, // 0x2E '.'
|
||||||
|
{171, 10, 20, 14, 2, -16}, // 0x2F '/'
|
||||||
|
{196, 10, 15, 14, 2, -14}, // 0x30 '0'
|
||||||
|
{215, 10, 15, 14, 2, -14}, // 0x31 '1'
|
||||||
|
{234, 10, 15, 14, 2, -14}, // 0x32 '2'
|
||||||
|
{253, 11, 15, 14, 1, -14}, // 0x33 '3'
|
||||||
|
{274, 9, 14, 14, 2, -13}, // 0x34 '4'
|
||||||
|
{290, 10, 15, 14, 2, -14}, // 0x35 '5'
|
||||||
|
{309, 10, 15, 14, 2, -14}, // 0x36 '6'
|
||||||
|
{328, 10, 15, 14, 2, -14}, // 0x37 '7'
|
||||||
|
{347, 10, 15, 14, 2, -14}, // 0x38 '8'
|
||||||
|
{366, 10, 15, 14, 3, -14}, // 0x39 '9'
|
||||||
|
{385, 3, 11, 14, 5, -10}, // 0x3A ':'
|
||||||
|
{390, 4, 15, 14, 4, -10}, // 0x3B ';'
|
||||||
|
{398, 12, 11, 14, 1, -11}, // 0x3C '<'
|
||||||
|
{415, 12, 7, 14, 1, -9}, // 0x3D '='
|
||||||
|
{426, 12, 11, 14, 1, -11}, // 0x3E '>'
|
||||||
|
{443, 9, 14, 14, 3, -13}, // 0x3F '?'
|
||||||
|
{459, 11, 19, 14, 2, -14}, // 0x40 '@'
|
||||||
|
{486, 15, 14, 14, -1, -13}, // 0x41 'A'
|
||||||
|
{513, 13, 14, 14, 0, -13}, // 0x42 'B'
|
||||||
|
{536, 12, 14, 14, 1, -13}, // 0x43 'C'
|
||||||
|
{557, 12, 14, 14, 1, -13}, // 0x44 'D'
|
||||||
|
{578, 13, 14, 14, 0, -13}, // 0x45 'E'
|
||||||
|
{601, 13, 14, 14, 0, -13}, // 0x46 'F'
|
||||||
|
{624, 13, 14, 14, 1, -13}, // 0x47 'G'
|
||||||
|
{647, 14, 14, 14, 0, -13}, // 0x48 'H'
|
||||||
|
{672, 10, 14, 14, 2, -13}, // 0x49 'I'
|
||||||
|
{690, 13, 14, 14, 1, -13}, // 0x4A 'J'
|
||||||
|
{713, 14, 14, 14, 0, -13}, // 0x4B 'K'
|
||||||
|
{738, 12, 14, 14, 1, -13}, // 0x4C 'L'
|
||||||
|
{759, 14, 14, 14, 0, -13}, // 0x4D 'M'
|
||||||
|
{784, 13, 14, 14, 0, -13}, // 0x4E 'N'
|
||||||
|
{807, 12, 14, 14, 1, -13}, // 0x4F 'O'
|
||||||
|
{828, 12, 14, 14, 0, -13}, // 0x50 'P'
|
||||||
|
{849, 12, 17, 14, 1, -13}, // 0x51 'Q'
|
||||||
|
{875, 14, 14, 14, 0, -13}, // 0x52 'R'
|
||||||
|
{900, 10, 14, 14, 2, -13}, // 0x53 'S'
|
||||||
|
{918, 12, 14, 14, 1, -13}, // 0x54 'T'
|
||||||
|
{939, 12, 14, 14, 1, -13}, // 0x55 'U'
|
||||||
|
{960, 16, 14, 14, -1, -13}, // 0x56 'V'
|
||||||
|
{988, 14, 14, 14, 0, -13}, // 0x57 'W'
|
||||||
|
{1013, 14, 14, 14, 0, -13}, // 0x58 'X'
|
||||||
|
{1038, 12, 14, 14, 1, -13}, // 0x59 'Y'
|
||||||
|
{1059, 10, 14, 14, 2, -13}, // 0x5A 'Z'
|
||||||
|
{1077, 5, 19, 14, 6, -14}, // 0x5B '['
|
||||||
|
{1089, 10, 20, 14, 2, -16}, // 0x5C '\'
|
||||||
|
{1114, 5, 19, 14, 3, -14}, // 0x5D ']'
|
||||||
|
{1126, 10, 8, 14, 2, -15}, // 0x5E '^'
|
||||||
|
{1136, 14, 2, 14, 0, 4}, // 0x5F '_'
|
||||||
|
{1140, 4, 4, 14, 4, -15}, // 0x60 '`'
|
||||||
|
{1142, 12, 11, 14, 1, -10}, // 0x61 'a'
|
||||||
|
{1159, 13, 15, 14, 0, -14}, // 0x62 'b'
|
||||||
|
{1184, 12, 11, 14, 1, -10}, // 0x63 'c'
|
||||||
|
{1201, 13, 15, 14, 1, -14}, // 0x64 'd'
|
||||||
|
{1226, 12, 11, 14, 1, -10}, // 0x65 'e'
|
||||||
|
{1243, 11, 15, 14, 2, -14}, // 0x66 'f'
|
||||||
|
{1264, 13, 16, 14, 1, -10}, // 0x67 'g'
|
||||||
|
{1290, 14, 15, 14, 0, -14}, // 0x68 'h'
|
||||||
|
{1317, 11, 14, 14, 1, -13}, // 0x69 'i'
|
||||||
|
{1337, 8, 19, 15, 3, -13}, // 0x6A 'j'
|
||||||
|
{1356, 13, 15, 14, 1, -14}, // 0x6B 'k'
|
||||||
|
{1381, 11, 15, 14, 1, -14}, // 0x6C 'l'
|
||||||
|
{1402, 15, 11, 14, 0, -10}, // 0x6D 'm'
|
||||||
|
{1423, 14, 11, 14, 0, -10}, // 0x6E 'n'
|
||||||
|
{1443, 12, 11, 14, 1, -10}, // 0x6F 'o'
|
||||||
|
{1460, 14, 16, 14, 0, -10}, // 0x70 'p'
|
||||||
|
{1488, 14, 16, 14, 0, -10}, // 0x71 'q'
|
||||||
|
{1516, 12, 11, 14, 1, -10}, // 0x72 'r'
|
||||||
|
{1533, 10, 11, 14, 2, -10}, // 0x73 's'
|
||||||
|
{1547, 11, 14, 14, 1, -13}, // 0x74 't'
|
||||||
|
{1567, 13, 11, 14, 0, -10}, // 0x75 'u'
|
||||||
|
{1585, 14, 11, 14, 0, -10}, // 0x76 'v'
|
||||||
|
{1605, 14, 11, 14, 0, -10}, // 0x77 'w'
|
||||||
|
{1625, 14, 11, 14, 0, -10}, // 0x78 'x'
|
||||||
|
{1645, 12, 16, 14, 1, -10}, // 0x79 'y'
|
||||||
|
{1669, 11, 11, 14, 1, -10}, // 0x7A 'z'
|
||||||
|
{1685, 7, 19, 14, 3, -14}, // 0x7B '{'
|
||||||
|
{1702, 2, 19, 14, 6, -14}, // 0x7C '|'
|
||||||
|
{1707, 7, 19, 14, 4, -14}, // 0x7D '}'
|
||||||
|
{1724, 12, 4, 14, 1, -7}}; // 0x7E '~'
|
||||||
|
|
||||||
|
const GFXfont FreeMonoBold12pt7b PROGMEM = {
|
||||||
|
(uint8_t *)FreeMonoBold12pt7bBitmaps, (GFXglyph *)FreeMonoBold12pt7bGlyphs,
|
||||||
|
0x20, 0x7E, 24};
|
||||||
|
|
||||||
|
// Approx. 2402 bytes
|
||||||
425
libraries/Adafruit_GFX_Library/Fonts/FreeMonoBold18pt7b.h
Normal file
425
libraries/Adafruit_GFX_Library/Fonts/FreeMonoBold18pt7b.h
Normal file
@@ -0,0 +1,425 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
|
||||||
|
const uint8_t FreeMonoBold18pt7bBitmaps[] PROGMEM = {
|
||||||
|
0x77, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x9C, 0xE7, 0x39, 0xC4, 0x03, 0xBF,
|
||||||
|
0xFF, 0xB8, 0xF1, 0xFE, 0x3F, 0xC7, 0xF8, 0xFF, 0x1E, 0xC1, 0x98, 0x33,
|
||||||
|
0x06, 0x60, 0xCC, 0x18, 0x0E, 0x1C, 0x0F, 0x3C, 0x1F, 0x3C, 0x1E, 0x3C,
|
||||||
|
0x1E, 0x3C, 0x1E, 0x78, 0x1E, 0x78, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFE, 0x1E, 0x78, 0x1E, 0x78, 0x1E, 0x78, 0x7F, 0xFE, 0x7F, 0xFE,
|
||||||
|
0x7F, 0xFE, 0x7F, 0xFE, 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0xF0,
|
||||||
|
0x3C, 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, 0x03, 0x00, 0x1E, 0x00, 0x78, 0x01,
|
||||||
|
0xE0, 0x1F, 0xF1, 0xFF, 0xE7, 0xFF, 0xBE, 0x1E, 0xF0, 0x3B, 0xC0, 0xCF,
|
||||||
|
0xE0, 0x3F, 0xF8, 0x7F, 0xF0, 0x7F, 0xE0, 0x1F, 0xF0, 0x0F, 0xE0, 0x3F,
|
||||||
|
0x80, 0xFF, 0x87, 0xFF, 0xFE, 0xFF, 0xF3, 0x7F, 0x80, 0x78, 0x01, 0xE0,
|
||||||
|
0x07, 0x80, 0x1E, 0x00, 0x78, 0x00, 0xC0, 0x1E, 0x00, 0xFF, 0x03, 0x86,
|
||||||
|
0x06, 0x06, 0x0C, 0x0C, 0x18, 0x18, 0x38, 0x70, 0x3F, 0xC2, 0x1E, 0x3E,
|
||||||
|
0x03, 0xF8, 0x3F, 0x83, 0xF8, 0x0F, 0x8F, 0x18, 0x7F, 0x01, 0xC7, 0x03,
|
||||||
|
0x06, 0x06, 0x0C, 0x0C, 0x18, 0x1C, 0x70, 0x1F, 0xC0, 0x0F, 0x00, 0x03,
|
||||||
|
0xD0, 0x1F, 0xF0, 0x7F, 0xE1, 0xFF, 0xC3, 0xE6, 0x07, 0x80, 0x0F, 0x00,
|
||||||
|
0x0F, 0x00, 0x1F, 0x00, 0x3E, 0x00, 0xFE, 0x03, 0xFE, 0xFF, 0xBD, 0xFE,
|
||||||
|
0x3F, 0xFC, 0x3F, 0x7C, 0x7C, 0xFF, 0xFE, 0xFF, 0xFC, 0xFF, 0xF8, 0x7E,
|
||||||
|
0xF0, 0xFF, 0xFF, 0xF6, 0x66, 0x66, 0x07, 0x0F, 0x1F, 0x1E, 0x3E, 0x3C,
|
||||||
|
0x78, 0x78, 0x78, 0x70, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
|
||||||
|
0x78, 0x78, 0x78, 0x3C, 0x3C, 0x1E, 0x1F, 0x0F, 0x07, 0xE0, 0xF0, 0xF8,
|
||||||
|
0x78, 0x7C, 0x3C, 0x3E, 0x1E, 0x1E, 0x1E, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
|
||||||
|
0x0F, 0x0F, 0x0E, 0x1E, 0x1E, 0x1E, 0x3C, 0x3C, 0x78, 0xF8, 0xF0, 0xE0,
|
||||||
|
0x01, 0x80, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0x7F, 0xFE, 0x1F, 0xF8, 0x07, 0xE0, 0x0F, 0xF0, 0x1F, 0xF8,
|
||||||
|
0x1E, 0x78, 0x1C, 0x38, 0x18, 0x18, 0x01, 0xC0, 0x03, 0xC0, 0x03, 0xC0,
|
||||||
|
0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0,
|
||||||
|
0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x01, 0x80, 0x3E, 0x78, 0xF3, 0xC7,
|
||||||
|
0x8E, 0x1C, 0x70, 0xE1, 0x80, 0x7F, 0xFF, 0xDF, 0xFF, 0xF9, 0xFF, 0xFF,
|
||||||
|
0x3F, 0xFF, 0xE0, 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x0E, 0x00, 0x3C, 0x00,
|
||||||
|
0x78, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x1E, 0x00, 0x38, 0x00, 0xF0,
|
||||||
|
0x01, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x3C, 0x00, 0x78, 0x01, 0xE0, 0x03,
|
||||||
|
0xC0, 0x0F, 0x00, 0x1E, 0x00, 0x78, 0x00, 0xF0, 0x03, 0xC0, 0x07, 0x80,
|
||||||
|
0x1E, 0x00, 0x3C, 0x00, 0x70, 0x01, 0xE0, 0x03, 0x80, 0x03, 0x00, 0x00,
|
||||||
|
0x07, 0xE0, 0x1F, 0xF8, 0x3F, 0xFC, 0x3F, 0xFC, 0x7C, 0x3E, 0x78, 0x1E,
|
||||||
|
0xF8, 0x1F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F,
|
||||||
|
0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF8, 0x1F, 0x78, 0x1E,
|
||||||
|
0x7C, 0x3E, 0x3F, 0xFC, 0x3F, 0xFC, 0x1F, 0xF8, 0x07, 0xE0, 0x07, 0xC0,
|
||||||
|
0x1F, 0x80, 0xFF, 0x03, 0xFE, 0x0F, 0xBC, 0x0C, 0x78, 0x00, 0xF0, 0x01,
|
||||||
|
0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78,
|
||||||
|
0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x81, 0xFF, 0xFB, 0xFF, 0xF7,
|
||||||
|
0xFF, 0xE7, 0xFF, 0x80, 0x0F, 0xC0, 0x7F, 0xE1, 0xFF, 0xE3, 0xFF, 0xEF,
|
||||||
|
0x87, 0xDE, 0x07, 0xF8, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x7C, 0x01,
|
||||||
|
0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00,
|
||||||
|
0x78, 0x03, 0xE0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80,
|
||||||
|
0x0F, 0xC0, 0x7F, 0xF0, 0xFF, 0xF8, 0xFF, 0xFC, 0x70, 0x3E, 0x00, 0x1E,
|
||||||
|
0x00, 0x1E, 0x00, 0x1E, 0x00, 0x3C, 0x03, 0xFC, 0x03, 0xF0, 0x03, 0xF0,
|
||||||
|
0x03, 0xFC, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F,
|
||||||
|
0xE0, 0x3F, 0xFF, 0xFE, 0xFF, 0xFC, 0x7F, 0xF8, 0x1F, 0xE0, 0x00, 0xF8,
|
||||||
|
0x03, 0xF0, 0x07, 0xE0, 0x1F, 0xC0, 0x77, 0x80, 0xEF, 0x03, 0x9E, 0x0F,
|
||||||
|
0x3C, 0x1C, 0x78, 0x70, 0xF1, 0xE1, 0xE3, 0x83, 0xCF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x78, 0x07, 0xFC, 0x0F, 0xF8, 0x1F, 0xF0,
|
||||||
|
0x1F, 0xC0, 0x3F, 0xFC, 0x1F, 0xFE, 0x0F, 0xFF, 0x07, 0xFF, 0x83, 0xC0,
|
||||||
|
0x01, 0xE0, 0x00, 0xF0, 0x00, 0x7B, 0xE0, 0x3F, 0xFC, 0x1F, 0xFF, 0x0F,
|
||||||
|
0xFF, 0xC3, 0x83, 0xE0, 0x00, 0xF8, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F,
|
||||||
|
0x00, 0x0F, 0xB8, 0x0F, 0xBF, 0xFF, 0xCF, 0xFF, 0xC3, 0xFF, 0xC0, 0x7F,
|
||||||
|
0x80, 0x00, 0xFC, 0x07, 0xFC, 0x3F, 0xF8, 0xFF, 0xF1, 0xF8, 0x07, 0xC0,
|
||||||
|
0x1F, 0x00, 0x3C, 0x00, 0xF0, 0x01, 0xE7, 0xC3, 0xDF, 0xC7, 0x7F, 0xCF,
|
||||||
|
0xFF, 0xDF, 0x8F, 0xFC, 0x07, 0xF0, 0x0F, 0xF0, 0x1F, 0xE0, 0x3D, 0xE0,
|
||||||
|
0xFB, 0xFF, 0xE3, 0xFF, 0xC3, 0xFF, 0x01, 0xF8, 0x00, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x01, 0xE0, 0x03, 0x80, 0x0F, 0x00, 0x1E,
|
||||||
|
0x00, 0x38, 0x00, 0xF0, 0x01, 0xE0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00,
|
||||||
|
0x78, 0x00, 0xF0, 0x01, 0xE0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x38,
|
||||||
|
0x00, 0x70, 0x00, 0x07, 0xC0, 0x3F, 0xE0, 0xFF, 0xE3, 0xFF, 0xEF, 0x83,
|
||||||
|
0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x0F, 0xF0, 0x1E, 0xF0, 0x78, 0xFF, 0xE0,
|
||||||
|
0xFF, 0x81, 0xFF, 0x0F, 0xFF, 0x9E, 0x0F, 0x78, 0x0F, 0xF0, 0x1F, 0xE0,
|
||||||
|
0x3F, 0xE0, 0xFB, 0xFF, 0xE7, 0xFF, 0xC7, 0xFF, 0x03, 0xF8, 0x00, 0x0F,
|
||||||
|
0xC0, 0x3F, 0xE0, 0xFF, 0xE3, 0xFF, 0xEF, 0xC3, 0xDF, 0x03, 0xBC, 0x07,
|
||||||
|
0xF8, 0x0F, 0xF0, 0x1F, 0xF0, 0x3D, 0xF1, 0xFB, 0xFF, 0xF3, 0xFE, 0xE3,
|
||||||
|
0xFB, 0xC3, 0xE7, 0x80, 0x1E, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xE7, 0xFF,
|
||||||
|
0x8F, 0xFE, 0x1F, 0xF0, 0x1F, 0x80, 0x00, 0x77, 0xFF, 0xF7, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xEF, 0xFF, 0xEE, 0x1C, 0x7C, 0xF9, 0xF1, 0xC0, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xF3, 0xC7, 0x8E, 0x3C, 0x70, 0xE1, 0x87, 0x0C, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x80, 0x00, 0xF0, 0x00, 0xFC, 0x00, 0xFE, 0x00, 0xFE,
|
||||||
|
0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00,
|
||||||
|
0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7C, 0x00,
|
||||||
|
0x07, 0x7F, 0xFF, 0xDF, 0xFF, 0xF9, 0xFF, 0xFF, 0x3F, 0xFF, 0xE0, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x1F, 0xFF, 0xF7, 0xFF, 0xFE, 0x7F, 0xFF, 0xCF, 0xFF,
|
||||||
|
0xF8, 0x00, 0x00, 0x3C, 0x00, 0x0F, 0xC0, 0x01, 0xFC, 0x00, 0x1F, 0xC0,
|
||||||
|
0x01, 0xFC, 0x00, 0x1F, 0xC0, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x3F, 0x80,
|
||||||
|
0x3F, 0x80, 0x3F, 0x80, 0x3F, 0x80, 0x3F, 0x80, 0x0F, 0x80, 0x03, 0x80,
|
||||||
|
0x00, 0x1F, 0xC0, 0xFF, 0xE3, 0xFF, 0xF7, 0xFF, 0xEF, 0x07, 0xFE, 0x03,
|
||||||
|
0xDC, 0x07, 0x80, 0x0F, 0x00, 0x7C, 0x03, 0xF8, 0x1F, 0xC0, 0x1E, 0x00,
|
||||||
|
0x30, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x00, 0x3E,
|
||||||
|
0x00, 0x7C, 0x00, 0x70, 0x00, 0x07, 0xE0, 0x1F, 0xE0, 0x7F, 0xE1, 0xE1,
|
||||||
|
0xC7, 0x83, 0xCE, 0x03, 0xBC, 0x07, 0x70, 0x0E, 0xE0, 0x7D, 0xC3, 0xFB,
|
||||||
|
0x8F, 0xF7, 0x3C, 0xEE, 0x71, 0xDC, 0xE3, 0xB9, 0xC7, 0x73, 0xCE, 0xE3,
|
||||||
|
0xFF, 0xC3, 0xFF, 0x83, 0xFF, 0x00, 0x07, 0x00, 0x0E, 0x00, 0x1E, 0x02,
|
||||||
|
0x1E, 0x1E, 0x3F, 0xFC, 0x1F, 0xF0, 0x1F, 0x80, 0x0F, 0xF8, 0x00, 0x7F,
|
||||||
|
0xF0, 0x01, 0xFF, 0xC0, 0x03, 0xFF, 0x00, 0x01, 0xFE, 0x00, 0x07, 0xF8,
|
||||||
|
0x00, 0x1C, 0xF0, 0x00, 0xF3, 0xC0, 0x03, 0xCF, 0x00, 0x1E, 0x1E, 0x00,
|
||||||
|
0x78, 0x78, 0x03, 0xC0, 0xF0, 0x0F, 0xFF, 0xC0, 0x3F, 0xFF, 0x01, 0xFF,
|
||||||
|
0xFE, 0x07, 0xFF, 0xF8, 0x3C, 0x00, 0xF3, 0xFC, 0x1F, 0xEF, 0xF8, 0x7F,
|
||||||
|
0xFF, 0xE1, 0xFF, 0x7F, 0x03, 0xF8, 0x7F, 0xFC, 0x0F, 0xFF, 0xF0, 0xFF,
|
||||||
|
0xFF, 0x8F, 0xFF, 0xF8, 0x3C, 0x07, 0xC3, 0xC0, 0x3C, 0x3C, 0x03, 0xC3,
|
||||||
|
0xC0, 0x7C, 0x3F, 0xFF, 0x83, 0xFF, 0xF0, 0x3F, 0xFF, 0x83, 0xFF, 0xFE,
|
||||||
|
0x3C, 0x03, 0xE3, 0xC0, 0x1F, 0x3C, 0x00, 0xF3, 0xC0, 0x0F, 0x3C, 0x01,
|
||||||
|
0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xEF, 0xFF, 0xFC, 0x7F, 0xFF, 0x00, 0x01,
|
||||||
|
0xF8, 0xC1, 0xFF, 0xFC, 0x7F, 0xFF, 0x9F, 0xFF, 0xF7, 0xE0, 0x7E, 0xF8,
|
||||||
|
0x07, 0xFE, 0x00, 0x7F, 0x80, 0x0E, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0,
|
||||||
|
0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0,
|
||||||
|
0x07, 0x7F, 0x03, 0xE7, 0xFF, 0xFC, 0x7F, 0xFF, 0x03, 0xFF, 0xC0, 0x1F,
|
||||||
|
0xE0, 0xFF, 0xF0, 0x3F, 0xFF, 0x0F, 0xFF, 0xE3, 0xFF, 0xFC, 0x78, 0x1F,
|
||||||
|
0x9E, 0x03, 0xE7, 0x80, 0x79, 0xE0, 0x0F, 0x78, 0x03, 0xDE, 0x00, 0xF7,
|
||||||
|
0x80, 0x3D, 0xE0, 0x0F, 0x78, 0x03, 0xDE, 0x00, 0xF7, 0x80, 0x7D, 0xE0,
|
||||||
|
0x1E, 0x78, 0x1F, 0xBF, 0xFF, 0xCF, 0xFF, 0xF3, 0xFF, 0xF0, 0x7F, 0xF0,
|
||||||
|
0x00, 0x7F, 0xFF, 0xDF, 0xFF, 0xFB, 0xFF, 0xFF, 0x7F, 0xFF, 0xE3, 0xC0,
|
||||||
|
0x3C, 0x78, 0x07, 0x8F, 0x1C, 0xF1, 0xE3, 0xCC, 0x3F, 0xF8, 0x07, 0xFF,
|
||||||
|
0x00, 0xFF, 0xE0, 0x1F, 0xFC, 0x03, 0xC7, 0x80, 0x78, 0xF1, 0x8F, 0x0C,
|
||||||
|
0x79, 0xE0, 0x0F, 0x3C, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xF7, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xF3, 0xC0, 0x1E, 0x78, 0x63, 0xCF, 0x1E, 0x79, 0xE3, 0xC6, 0x3F, 0xF8,
|
||||||
|
0x07, 0xFF, 0x00, 0xFF, 0xE0, 0x1F, 0xFC, 0x03, 0xC7, 0x80, 0x78, 0xE0,
|
||||||
|
0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x1F, 0xFC, 0x03, 0xFF, 0x80,
|
||||||
|
0x7F, 0xF0, 0x07, 0xFC, 0x00, 0x01, 0xFC, 0xE0, 0x7F, 0xFE, 0x1F, 0xFF,
|
||||||
|
0xE3, 0xFF, 0xFE, 0x7F, 0x03, 0xE7, 0xC0, 0x1E, 0xF8, 0x00, 0xEF, 0x00,
|
||||||
|
0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x03, 0xFE, 0xF0,
|
||||||
|
0x3F, 0xFF, 0x03, 0xFF, 0xF8, 0x3F, 0xF7, 0x80, 0x1E, 0x7E, 0x01, 0xE3,
|
||||||
|
0xFF, 0xFE, 0x1F, 0xFF, 0xE0, 0xFF, 0xF8, 0x01, 0xFE, 0x00, 0x7F, 0x0F,
|
||||||
|
0xE3, 0xFC, 0x7F, 0x9F, 0xE3, 0xFC, 0x7F, 0x1F, 0xC1, 0xE0, 0x3C, 0x0F,
|
||||||
|
0x01, 0xE0, 0x78, 0x0F, 0x03, 0xC0, 0x78, 0x1E, 0x03, 0xC0, 0xFF, 0xFE,
|
||||||
|
0x07, 0xFF, 0xF0, 0x3F, 0xFF, 0x81, 0xFF, 0xFC, 0x0F, 0x01, 0xE0, 0x78,
|
||||||
|
0x0F, 0x03, 0xC0, 0x78, 0x1E, 0x03, 0xC3, 0xFC, 0x7F, 0xBF, 0xE3, 0xFF,
|
||||||
|
0xFF, 0x1F, 0xF7, 0xF0, 0x7F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00,
|
||||||
|
0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x83,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xF8, 0x01, 0xFF, 0xE0, 0x3F, 0xFC,
|
||||||
|
0x07, 0xFF, 0x80, 0xFF, 0xF0, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0,
|
||||||
|
0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x38, 0x07, 0x8F,
|
||||||
|
0x00, 0xF1, 0xE0, 0x1E, 0x3C, 0x03, 0xC7, 0x80, 0xF8, 0xF8, 0x3F, 0x1F,
|
||||||
|
0xFF, 0xC3, 0xFF, 0xF0, 0x1F, 0xFC, 0x00, 0x7E, 0x00, 0xFF, 0x0F, 0xCF,
|
||||||
|
0xF9, 0xFE, 0xFF, 0x9F, 0xEF, 0xF8, 0xFC, 0x3C, 0x1F, 0x03, 0xC3, 0xE0,
|
||||||
|
0x3C, 0x7C, 0x03, 0xCF, 0x80, 0x3D, 0xF0, 0x03, 0xFE, 0x00, 0x3F, 0xF8,
|
||||||
|
0x03, 0xFF, 0x80, 0x3E, 0x7C, 0x03, 0xC3, 0xE0, 0x3C, 0x1E, 0x03, 0xC0,
|
||||||
|
0xF0, 0x3C, 0x0F, 0x0F, 0xF8, 0x7E, 0xFF, 0x87, 0xFF, 0xF8, 0x7F, 0x7F,
|
||||||
|
0x03, 0xE0, 0xFF, 0xC0, 0x3F, 0xF0, 0x0F, 0xFC, 0x03, 0xFF, 0x00, 0x1E,
|
||||||
|
0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80,
|
||||||
|
0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x01, 0x87, 0x80, 0xF1, 0xE0, 0x3C,
|
||||||
|
0x78, 0x0F, 0x1E, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F,
|
||||||
|
0xFF, 0xC0, 0x3E, 0x00, 0xF8, 0xFC, 0x01, 0xF9, 0xFC, 0x07, 0xF3, 0xF8,
|
||||||
|
0x0F, 0xE3, 0xF8, 0x3F, 0x87, 0xF0, 0x7F, 0x0F, 0xF1, 0xFE, 0x1F, 0xE3,
|
||||||
|
0xFC, 0x3D, 0xE7, 0x78, 0x7B, 0xDE, 0xF0, 0xF7, 0xBD, 0xE1, 0xE7, 0xF3,
|
||||||
|
0xC3, 0xCF, 0xE7, 0x87, 0x8F, 0x8F, 0x0F, 0x1F, 0x1E, 0x1E, 0x1E, 0x3C,
|
||||||
|
0x3C, 0x00, 0x79, 0xFF, 0x07, 0xFF, 0xFE, 0x0F, 0xFF, 0xFC, 0x1F, 0xF7,
|
||||||
|
0xF0, 0x1F, 0xC0, 0xFC, 0x1F, 0xEF, 0xE1, 0xFF, 0xFE, 0x1F, 0xFF, 0xF1,
|
||||||
|
0xFF, 0x3F, 0x83, 0xC3, 0xF8, 0x3C, 0x3F, 0xC3, 0xC3, 0xFC, 0x3C, 0x3D,
|
||||||
|
0xE3, 0xC3, 0xDE, 0x3C, 0x3C, 0xF3, 0xC3, 0xC7, 0xBC, 0x3C, 0x7B, 0xC3,
|
||||||
|
0xC3, 0xFC, 0x3C, 0x3F, 0xC3, 0xC1, 0xFC, 0x3C, 0x1F, 0xCF, 0xF8, 0xFC,
|
||||||
|
0xFF, 0x87, 0xCF, 0xF8, 0x7C, 0x7F, 0x03, 0xC0, 0x01, 0xF8, 0x00, 0x7F,
|
||||||
|
0xE0, 0x0F, 0xFF, 0x81, 0xFF, 0xFC, 0x3F, 0x0F, 0xC7, 0xC0, 0x3E, 0x78,
|
||||||
|
0x01, 0xEF, 0x80, 0x1F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF,
|
||||||
|
0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x80, 0x1F, 0x78, 0x01, 0xE7, 0xC0, 0x3E,
|
||||||
|
0x3F, 0x0F, 0xC1, 0xFF, 0xF8, 0x1F, 0xFF, 0x00, 0x7F, 0xE0, 0x01, 0xF8,
|
||||||
|
0x00, 0x7F, 0xF8, 0x3F, 0xFF, 0x8F, 0xFF, 0xF3, 0xFF, 0xFE, 0x3C, 0x0F,
|
||||||
|
0xCF, 0x00, 0xF3, 0xC0, 0x3C, 0xF0, 0x0F, 0x3C, 0x03, 0xCF, 0x03, 0xF3,
|
||||||
|
0xFF, 0xF8, 0xFF, 0xFC, 0x3F, 0xFE, 0x0F, 0xFE, 0x03, 0xC0, 0x00, 0xF0,
|
||||||
|
0x00, 0x3C, 0x00, 0x3F, 0xF8, 0x0F, 0xFE, 0x03, 0xFF, 0x80, 0x7F, 0xC0,
|
||||||
|
0x00, 0x01, 0xF8, 0x00, 0x7F, 0xE0, 0x0F, 0xFF, 0x01, 0xFF, 0xF8, 0x3F,
|
||||||
|
0x0F, 0xC7, 0xC0, 0x3E, 0x78, 0x01, 0xEF, 0x80, 0x1F, 0xF0, 0x00, 0xFF,
|
||||||
|
0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x80, 0x1F,
|
||||||
|
0x78, 0x01, 0xE7, 0xC0, 0x3E, 0x3F, 0x0F, 0xC1, 0xFF, 0xF8, 0x0F, 0xFF,
|
||||||
|
0x00, 0x7F, 0xE0, 0x03, 0xF8, 0x00, 0x3F, 0x8E, 0x07, 0xFF, 0xF0, 0xFF,
|
||||||
|
0xFF, 0x0F, 0xFF, 0xE0, 0x60, 0x78, 0x7F, 0xF8, 0x07, 0xFF, 0xF0, 0x3F,
|
||||||
|
0xFF, 0xE0, 0xFF, 0xFF, 0x01, 0xE0, 0x7C, 0x0F, 0x01, 0xE0, 0x78, 0x0F,
|
||||||
|
0x03, 0xC0, 0x78, 0x1E, 0x0F, 0xC0, 0xFF, 0xFC, 0x07, 0xFF, 0xC0, 0x3F,
|
||||||
|
0xF8, 0x01, 0xFF, 0xE0, 0x0F, 0x0F, 0x80, 0x78, 0x3C, 0x03, 0xC0, 0xF0,
|
||||||
|
0x1E, 0x07, 0xC3, 0xFE, 0x1F, 0xBF, 0xF0, 0x7F, 0xFF, 0x83, 0xF7, 0xF8,
|
||||||
|
0x0F, 0x00, 0x07, 0xE7, 0x07, 0xFF, 0x8F, 0xFF, 0xC7, 0xFF, 0xE7, 0xC1,
|
||||||
|
0xF3, 0xC0, 0x79, 0xE0, 0x3C, 0xF8, 0x00, 0x7F, 0x80, 0x1F, 0xFC, 0x07,
|
||||||
|
0xFF, 0x81, 0xFF, 0xE0, 0x0F, 0xFB, 0x00, 0x7F, 0xC0, 0x1F, 0xE0, 0x0F,
|
||||||
|
0xFC, 0x1F, 0xFF, 0xFF, 0xBF, 0xFF, 0x8D, 0xFF, 0x80, 0x3F, 0x00, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x1F, 0xE1,
|
||||||
|
0xE3, 0xFC, 0x3C, 0x7F, 0x87, 0x8F, 0x60, 0xF0, 0xC0, 0x1E, 0x00, 0x03,
|
||||||
|
0xC0, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07,
|
||||||
|
0x80, 0x00, 0xF0, 0x01, 0xFF, 0xE0, 0x3F, 0xFC, 0x07, 0xFF, 0x80, 0x7F,
|
||||||
|
0xE0, 0xFF, 0x0F, 0xF7, 0xFC, 0x7F, 0xFF, 0xE3, 0xFE, 0xFF, 0x1F, 0xF3,
|
||||||
|
0xC0, 0x1E, 0x1E, 0x00, 0xF0, 0xF0, 0x07, 0x87, 0x80, 0x3C, 0x3C, 0x01,
|
||||||
|
0xE1, 0xE0, 0x0F, 0x0F, 0x00, 0x78, 0x78, 0x03, 0xC3, 0xC0, 0x1E, 0x1E,
|
||||||
|
0x00, 0xF0, 0xF0, 0x07, 0x87, 0xC0, 0x7C, 0x1F, 0x07, 0xC0, 0xFF, 0xFE,
|
||||||
|
0x03, 0xFF, 0xE0, 0x0F, 0xFE, 0x00, 0x1F, 0xC0, 0x00, 0xFF, 0x03, 0xFD,
|
||||||
|
0xFF, 0x07, 0xFF, 0xFE, 0x0F, 0xFB, 0xF8, 0x1F, 0xE1, 0xC0, 0x07, 0x03,
|
||||||
|
0xC0, 0x1E, 0x07, 0x80, 0x3C, 0x07, 0x80, 0xF0, 0x0F, 0x01, 0xE0, 0x0F,
|
||||||
|
0x03, 0x80, 0x1E, 0x0F, 0x00, 0x3E, 0x1E, 0x00, 0x3C, 0x78, 0x00, 0x78,
|
||||||
|
0xF0, 0x00, 0x7B, 0xC0, 0x00, 0xF7, 0x80, 0x01, 0xFF, 0x00, 0x01, 0xFC,
|
||||||
|
0x00, 0x03, 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0xFF, 0x0F,
|
||||||
|
0xF7, 0xFC, 0x7F, 0xFF, 0xE3, 0xFF, 0xFE, 0x0F, 0xF7, 0x80, 0x0F, 0x3C,
|
||||||
|
0x38, 0x78, 0xE3, 0xE3, 0x87, 0x1F, 0x1C, 0x38, 0xF8, 0xE1, 0xEF, 0xE7,
|
||||||
|
0x0F, 0x7F, 0x78, 0x7B, 0xBB, 0xC3, 0xFD, 0xFE, 0x0F, 0xEF, 0xF0, 0x7E,
|
||||||
|
0x3F, 0x03, 0xF1, 0xF8, 0x1F, 0x8F, 0xC0, 0xFC, 0x3E, 0x07, 0xC1, 0xF0,
|
||||||
|
0x3E, 0x0F, 0x81, 0xF0, 0x7C, 0x00, 0x7E, 0x0F, 0xDF, 0xE3, 0xFF, 0xFC,
|
||||||
|
0x7F, 0xBF, 0x07, 0xE1, 0xE0, 0xF8, 0x3E, 0x3E, 0x03, 0xEF, 0x80, 0x3D,
|
||||||
|
0xE0, 0x03, 0xF8, 0x00, 0x3E, 0x00, 0x03, 0xC0, 0x00, 0xF8, 0x00, 0x3F,
|
||||||
|
0x80, 0x0F, 0x78, 0x03, 0xC7, 0x80, 0xF8, 0x78, 0x3E, 0x0F, 0x8F, 0xE3,
|
||||||
|
0xFF, 0xFC, 0x7F, 0xFF, 0x8F, 0xF7, 0xE0, 0xFC, 0x7E, 0x07, 0xEF, 0xF0,
|
||||||
|
0xFF, 0xFF, 0x0F, 0xF7, 0xE0, 0x7E, 0x1E, 0x07, 0x81, 0xF0, 0xF8, 0x0F,
|
||||||
|
0x0F, 0x00, 0x79, 0xE0, 0x07, 0xFE, 0x00, 0x3F, 0xC0, 0x01, 0xF8, 0x00,
|
||||||
|
0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00,
|
||||||
|
0x00, 0xF0, 0x00, 0xFF, 0xE0, 0x0F, 0xFF, 0x00, 0xFF, 0xF0, 0x07, 0xFE,
|
||||||
|
0x00, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xF0, 0x3C, 0xF0,
|
||||||
|
0x78, 0xF0, 0xF0, 0x70, 0xE0, 0x01, 0xE0, 0x03, 0xC0, 0x03, 0x80, 0x07,
|
||||||
|
0x00, 0x0F, 0x00, 0x1E, 0x0E, 0x1C, 0x0F, 0x38, 0x0F, 0x78, 0x0F, 0x7F,
|
||||||
|
0xFF, 0x7F, 0xFF, 0x7F, 0xFF, 0x7F, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xF0,
|
||||||
|
0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
|
||||||
|
0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFE, 0xFF, 0xFF, 0xFE, 0xE0, 0x01,
|
||||||
|
0xE0, 0x03, 0xC0, 0x03, 0xC0, 0x07, 0x80, 0x07, 0x00, 0x0F, 0x00, 0x0E,
|
||||||
|
0x00, 0x1E, 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x78, 0x00, 0x78, 0x00, 0xF0,
|
||||||
|
0x00, 0xF0, 0x01, 0xE0, 0x01, 0xE0, 0x03, 0xC0, 0x03, 0xC0, 0x07, 0x80,
|
||||||
|
0x07, 0x80, 0x0F, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x3C, 0x00,
|
||||||
|
0x38, 0x00, 0x70, 0x7F, 0xFF, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
|
||||||
|
0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
|
||||||
|
0x0F, 0x0F, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x07, 0x00, 0x1F, 0x00,
|
||||||
|
0x7F, 0x00, 0xFE, 0x03, 0xDE, 0x0F, 0x1E, 0x3E, 0x3E, 0xF8, 0x3F, 0xE0,
|
||||||
|
0x3F, 0x80, 0x38, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xF0, 0xC3, 0x87, 0x0E, 0x1C, 0x30, 0x01, 0xFC, 0x01, 0xFF, 0xC0,
|
||||||
|
0x3F, 0xFC, 0x07, 0xFF, 0xC0, 0x00, 0x78, 0x0F, 0xFF, 0x07, 0xFF, 0xE1,
|
||||||
|
0xFF, 0xFC, 0x7F, 0xFF, 0x9F, 0x80, 0xF3, 0xC0, 0x1E, 0x78, 0x0F, 0xCF,
|
||||||
|
0xFF, 0xFE, 0xFF, 0xFF, 0xCF, 0xFF, 0xF8, 0x7F, 0x3E, 0x7C, 0x00, 0x1F,
|
||||||
|
0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F,
|
||||||
|
0x3F, 0x01, 0xFF, 0xF8, 0x3F, 0xFF, 0x87, 0xFF, 0xF0, 0xFC, 0x1F, 0x1F,
|
||||||
|
0x01, 0xF3, 0xC0, 0x1E, 0x78, 0x03, 0xCF, 0x00, 0x79, 0xE0, 0x0F, 0x3E,
|
||||||
|
0x03, 0xE7, 0xE0, 0xFB, 0xFF, 0xFF, 0x7F, 0xFF, 0xCF, 0xFF, 0xF0, 0xF9,
|
||||||
|
0xF8, 0x00, 0x03, 0xF3, 0x87, 0xFF, 0xCF, 0xFF, 0xEF, 0xFF, 0xF7, 0xE0,
|
||||||
|
0xFF, 0xC0, 0x3F, 0xC0, 0x0F, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3E,
|
||||||
|
0x00, 0x4F, 0x80, 0xF7, 0xFF, 0xF9, 0xFF, 0xF8, 0x7F, 0xF8, 0x0F, 0xF0,
|
||||||
|
0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x03,
|
||||||
|
0xC0, 0x00, 0x3C, 0x03, 0xF3, 0xC0, 0xFF, 0xBC, 0x1F, 0xFF, 0xC3, 0xFF,
|
||||||
|
0xFC, 0x7E, 0x0F, 0xC7, 0x80, 0x7C, 0xF0, 0x03, 0xCF, 0x00, 0x3C, 0xF0,
|
||||||
|
0x03, 0xCF, 0x00, 0x3C, 0xF8, 0x07, 0xC7, 0xE0, 0xFC, 0x7F, 0xFF, 0xF3,
|
||||||
|
0xFF, 0xFF, 0x0F, 0xFF, 0xF0, 0x3F, 0x3E, 0x03, 0xF0, 0x03, 0xFF, 0x01,
|
||||||
|
0xFF, 0xE0, 0xFF, 0xFC, 0x7E, 0x0F, 0x9E, 0x01, 0xEF, 0x00, 0x3F, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xE0, 0x00, 0x7F, 0xFF,
|
||||||
|
0xCF, 0xFF, 0xF1, 0xFF, 0xF8, 0x0F, 0xF0, 0x03, 0xFC, 0x07, 0xFF, 0x0F,
|
||||||
|
0xFF, 0x1F, 0xFF, 0x1E, 0x00, 0x1E, 0x00, 0xFF, 0xF8, 0xFF, 0xFC, 0xFF,
|
||||||
|
0xFC, 0xFF, 0xF8, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E,
|
||||||
|
0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0xFF, 0xF8, 0xFF, 0xF8, 0xFF,
|
||||||
|
0xF8, 0xFF, 0xF8, 0x07, 0xE7, 0xC3, 0xFF, 0xFC, 0xFF, 0xFF, 0xBF, 0xFF,
|
||||||
|
0xF7, 0xC1, 0xF9, 0xF0, 0x1F, 0x3C, 0x01, 0xE7, 0x80, 0x3C, 0xF0, 0x07,
|
||||||
|
0x9E, 0x00, 0xF3, 0xE0, 0x3E, 0x3E, 0x0F, 0xC7, 0xFF, 0xF8, 0x7F, 0xFF,
|
||||||
|
0x07, 0xFD, 0xE0, 0x3F, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x3E,
|
||||||
|
0x03, 0xFF, 0x80, 0x7F, 0xF0, 0x0F, 0xFC, 0x00, 0xFE, 0x00, 0x3E, 0x00,
|
||||||
|
0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x01, 0xE0, 0x00, 0x0F,
|
||||||
|
0x00, 0x00, 0x78, 0xF8, 0x03, 0xDF, 0xE0, 0x1F, 0xFF, 0x80, 0xFF, 0xFE,
|
||||||
|
0x07, 0xE1, 0xF0, 0x3E, 0x07, 0x81, 0xE0, 0x3C, 0x0F, 0x01, 0xE0, 0x78,
|
||||||
|
0x0F, 0x03, 0xC0, 0x78, 0x1E, 0x03, 0xC0, 0xF0, 0x1E, 0x1F, 0xC1, 0xFD,
|
||||||
|
0xFE, 0x0F, 0xFF, 0xF0, 0x7F, 0xBF, 0x01, 0xF8, 0x03, 0xC0, 0x03, 0xC0,
|
||||||
|
0x03, 0xC0, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x3F, 0xC0,
|
||||||
|
0x3F, 0xC0, 0x3F, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0,
|
||||||
|
0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xFF, 0xFE, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0x7F, 0xFE, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x00, 0x00,
|
||||||
|
0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0x00, 0xF0, 0x0F, 0x00, 0xF0,
|
||||||
|
0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0,
|
||||||
|
0x0F, 0x00, 0xF0, 0x0F, 0x01, 0xFF, 0xFE, 0xFF, 0xEF, 0xFC, 0x7F, 0x00,
|
||||||
|
0x7C, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0x3C, 0x00, 0x0F,
|
||||||
|
0x00, 0x03, 0xC7, 0xF0, 0xF3, 0xFC, 0x3C, 0xFF, 0x0F, 0x3F, 0x83, 0xDF,
|
||||||
|
0x00, 0xFF, 0x80, 0x3F, 0xC0, 0x0F, 0xE0, 0x03, 0xFC, 0x00, 0xF7, 0x80,
|
||||||
|
0x3C, 0xF0, 0x0F, 0x1F, 0x0F, 0xC3, 0xFB, 0xF1, 0xFF, 0xFC, 0x7F, 0xDF,
|
||||||
|
0x0F, 0xE0, 0x3F, 0xC0, 0x3F, 0xC0, 0x3F, 0xC0, 0x3F, 0xC0, 0x03, 0xC0,
|
||||||
|
0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0,
|
||||||
|
0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0,
|
||||||
|
0x03, 0xC0, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFE, 0x3D, 0xE3,
|
||||||
|
0xC1, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0x1F, 0xFF, 0xFE, 0x3E, 0x3C, 0x78,
|
||||||
|
0xF0, 0xF1, 0xE3, 0xC3, 0xC7, 0x8F, 0x0F, 0x1E, 0x3C, 0x3C, 0x78, 0xF0,
|
||||||
|
0xF1, 0xE3, 0xC3, 0xC7, 0x8F, 0x0F, 0x1E, 0xFE, 0x3E, 0x7F, 0xF8, 0xF9,
|
||||||
|
0xFF, 0xE3, 0xE7, 0xDF, 0x0F, 0x1E, 0x1E, 0x7C, 0x03, 0xEF, 0xF0, 0x3F,
|
||||||
|
0xFF, 0x83, 0xFF, 0xFC, 0x1F, 0x87, 0xC1, 0xE0, 0x3C, 0x1E, 0x03, 0xC1,
|
||||||
|
0xE0, 0x3C, 0x1E, 0x03, 0xC1, 0xE0, 0x3C, 0x1E, 0x03, 0xC1, 0xE0, 0x3C,
|
||||||
|
0x7F, 0x0F, 0xFF, 0xF0, 0xFF, 0xFF, 0x0F, 0xF7, 0xE0, 0x7E, 0x03, 0xF8,
|
||||||
|
0x01, 0xFF, 0xC0, 0x7F, 0xFC, 0x1F, 0xFF, 0xC7, 0xE0, 0xFD, 0xF0, 0x07,
|
||||||
|
0xFC, 0x00, 0x7F, 0x80, 0x0F, 0xF0, 0x01, 0xFE, 0x00, 0x3F, 0xE0, 0x0F,
|
||||||
|
0xBF, 0x07, 0xE3, 0xFF, 0xF8, 0x3F, 0xFE, 0x03, 0xFF, 0x80, 0x1F, 0xC0,
|
||||||
|
0x3E, 0x7E, 0x03, 0xF7, 0xFC, 0x1F, 0xFF, 0xF0, 0xFF, 0xFF, 0xC1, 0xF8,
|
||||||
|
0x3F, 0x0F, 0x80, 0x7C, 0x78, 0x01, 0xE3, 0xC0, 0x0F, 0x1E, 0x00, 0x78,
|
||||||
|
0xF0, 0x03, 0xC7, 0xC0, 0x3E, 0x3F, 0x07, 0xE1, 0xFF, 0xFE, 0x0F, 0xFF,
|
||||||
|
0xE0, 0x7B, 0xFE, 0x03, 0xCF, 0xC0, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07,
|
||||||
|
0x80, 0x00, 0xFF, 0x80, 0x0F, 0xFC, 0x00, 0x7F, 0xE0, 0x01, 0xFE, 0x00,
|
||||||
|
0x00, 0x03, 0xF3, 0xE0, 0x7F, 0xDF, 0x87, 0xFF, 0xFC, 0x7F, 0xFF, 0xE7,
|
||||||
|
0xE0, 0xFC, 0x7C, 0x03, 0xE3, 0xC0, 0x0F, 0x1E, 0x00, 0x78, 0xF0, 0x03,
|
||||||
|
0xC7, 0x80, 0x1E, 0x3E, 0x01, 0xF0, 0xFC, 0x1F, 0x83, 0xFF, 0xFC, 0x1F,
|
||||||
|
0xFF, 0xE0, 0x3F, 0xEF, 0x00, 0x7E, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E,
|
||||||
|
0x00, 0x00, 0xF0, 0x00, 0x3F, 0xE0, 0x01, 0xFF, 0x80, 0x0F, 0xFC, 0x00,
|
||||||
|
0x3F, 0xC0, 0x7E, 0x1E, 0x7F, 0x3F, 0xFF, 0xBF, 0xFF, 0xFF, 0xF1, 0xFE,
|
||||||
|
0x00, 0xFC, 0x00, 0x7C, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07,
|
||||||
|
0x80, 0x03, 0xC0, 0x0F, 0xFF, 0x87, 0xFF, 0xC3, 0xFF, 0xE1, 0xFF, 0xE0,
|
||||||
|
0x07, 0xE6, 0x1F, 0xFE, 0x7F, 0xFE, 0x7F, 0xFE, 0x78, 0x1E, 0x78, 0x0E,
|
||||||
|
0x7F, 0xE0, 0x3F, 0xFC, 0x03, 0xFE, 0x60, 0x1F, 0xE0, 0x0F, 0xF8, 0x1F,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0xFC, 0x07, 0xE0, 0x0C, 0x00, 0x0F, 0x00,
|
||||||
|
0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x07, 0xFF, 0xF3, 0xFF, 0xF9, 0xFF,
|
||||||
|
0xFC, 0xFF, 0xFC, 0x0F, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00,
|
||||||
|
0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x07, 0x8F, 0xFF, 0xC3, 0xFF,
|
||||||
|
0xC1, 0xFF, 0xC0, 0x3F, 0x80, 0xFC, 0x1F, 0xBF, 0x0F, 0xEF, 0xC3, 0xFB,
|
||||||
|
0xF0, 0xFE, 0x3C, 0x07, 0x8F, 0x01, 0xE3, 0xC0, 0x78, 0xF0, 0x1E, 0x3C,
|
||||||
|
0x07, 0x8F, 0x01, 0xE3, 0xC0, 0x78, 0xF8, 0x7E, 0x3F, 0xFF, 0xC7, 0xFF,
|
||||||
|
0xF0, 0xFF, 0x7C, 0x0F, 0x9E, 0x7F, 0x07, 0xF7, 0xFC, 0x7F, 0xFF, 0xE3,
|
||||||
|
0xFE, 0xFE, 0x0F, 0xE1, 0xE0, 0x3C, 0x0F, 0x01, 0xE0, 0x3C, 0x1E, 0x01,
|
||||||
|
0xE0, 0xF0, 0x07, 0x8F, 0x00, 0x3E, 0x78, 0x00, 0xF7, 0x80, 0x07, 0xFC,
|
||||||
|
0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x7E,
|
||||||
|
0x03, 0xF7, 0xF8, 0x3F, 0xFF, 0xC1, 0xFE, 0xFC, 0x07, 0xF3, 0xC7, 0x0F,
|
||||||
|
0x1E, 0x7C, 0xF0, 0x73, 0xE7, 0x83, 0x9F, 0x7C, 0x1F, 0xFF, 0xC0, 0xFF,
|
||||||
|
0xFE, 0x03, 0xF7, 0xF0, 0x1F, 0xBF, 0x80, 0xFC, 0xF8, 0x07, 0xC7, 0xC0,
|
||||||
|
0x1E, 0x3E, 0x00, 0xE0, 0xE0, 0x7E, 0x0F, 0xDF, 0xE3, 0xFF, 0xFC, 0x7F,
|
||||||
|
0xBF, 0x07, 0xE1, 0xF1, 0xF0, 0x1F, 0xFC, 0x01, 0xFF, 0x00, 0x1F, 0xC0,
|
||||||
|
0x07, 0xF8, 0x01, 0xFF, 0xC0, 0x7E, 0xFC, 0x1F, 0x8F, 0xC7, 0xE0, 0xFD,
|
||||||
|
0xFE, 0x3F, 0xFF, 0xC7, 0xFF, 0xF0, 0x7F, 0x7E, 0x0F, 0xDF, 0xE3, 0xFF,
|
||||||
|
0xFC, 0x7F, 0xBF, 0x07, 0xE3, 0xC0, 0x78, 0x3C, 0x0E, 0x07, 0x83, 0xC0,
|
||||||
|
0x78, 0x70, 0x0F, 0x1E, 0x00, 0xE3, 0x80, 0x1E, 0xF0, 0x01, 0xDC, 0x00,
|
||||||
|
0x3F, 0x80, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0x00, 0x01, 0xE0, 0x00,
|
||||||
|
0x38, 0x00, 0x0F, 0x00, 0x3F, 0xF0, 0x0F, 0xFF, 0x01, 0xFF, 0xE0, 0x1F,
|
||||||
|
0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF9, 0xC7,
|
||||||
|
0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x78, 0x03, 0xC0, 0x1E, 0x07, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x81, 0xF0, 0xFC, 0x7E, 0x1F,
|
||||||
|
0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0xF8, 0xFC, 0x3E, 0x0F,
|
||||||
|
0x83, 0xF0, 0x3E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xF0, 0x7E,
|
||||||
|
0x0F, 0xC3, 0xF0, 0x38, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x70, 0x3E, 0x0F, 0xC1, 0xF8, 0x3E,
|
||||||
|
0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x7C, 0x0F, 0xC1, 0xF0,
|
||||||
|
0x7C, 0x3F, 0x1F, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x83, 0xE1, 0xF8,
|
||||||
|
0xFC, 0x3F, 0x07, 0x00, 0x1E, 0x00, 0x1F, 0xC0, 0x1F, 0xF0, 0xDF, 0xFC,
|
||||||
|
0xFF, 0x3F, 0xFB, 0x0F, 0xF8, 0x03, 0xF8, 0x00, 0x78};
|
||||||
|
|
||||||
|
const GFXglyph FreeMonoBold18pt7bGlyphs[] PROGMEM = {
|
||||||
|
{0, 0, 0, 21, 0, 1}, // 0x20 ' '
|
||||||
|
{0, 5, 22, 21, 8, -21}, // 0x21 '!'
|
||||||
|
{14, 11, 10, 21, 5, -20}, // 0x22 '"'
|
||||||
|
{28, 16, 25, 21, 3, -22}, // 0x23 '#'
|
||||||
|
{78, 14, 28, 21, 4, -23}, // 0x24 '$'
|
||||||
|
{127, 15, 21, 21, 3, -20}, // 0x25 '%'
|
||||||
|
{167, 15, 20, 21, 3, -19}, // 0x26 '&'
|
||||||
|
{205, 4, 10, 21, 8, -20}, // 0x27 '''
|
||||||
|
{210, 8, 27, 21, 9, -21}, // 0x28 '('
|
||||||
|
{237, 8, 27, 21, 4, -21}, // 0x29 ')'
|
||||||
|
{264, 16, 15, 21, 3, -21}, // 0x2A '*'
|
||||||
|
{294, 16, 19, 21, 3, -18}, // 0x2B '+'
|
||||||
|
{332, 7, 10, 21, 5, -3}, // 0x2C ','
|
||||||
|
{341, 19, 4, 21, 1, -11}, // 0x2D '-'
|
||||||
|
{351, 5, 5, 21, 8, -4}, // 0x2E '.'
|
||||||
|
{355, 15, 28, 21, 3, -23}, // 0x2F '/'
|
||||||
|
{408, 16, 23, 21, 3, -22}, // 0x30 '0'
|
||||||
|
{454, 15, 22, 21, 3, -21}, // 0x31 '1'
|
||||||
|
{496, 15, 23, 21, 3, -22}, // 0x32 '2'
|
||||||
|
{540, 16, 23, 21, 3, -22}, // 0x33 '3'
|
||||||
|
{586, 15, 21, 21, 3, -20}, // 0x34 '4'
|
||||||
|
{626, 17, 22, 21, 2, -21}, // 0x35 '5'
|
||||||
|
{673, 15, 23, 21, 4, -22}, // 0x36 '6'
|
||||||
|
{717, 15, 22, 21, 3, -21}, // 0x37 '7'
|
||||||
|
{759, 15, 23, 21, 3, -22}, // 0x38 '8'
|
||||||
|
{803, 15, 23, 21, 4, -22}, // 0x39 '9'
|
||||||
|
{847, 5, 16, 21, 8, -15}, // 0x3A ':'
|
||||||
|
{857, 7, 22, 21, 5, -15}, // 0x3B ';'
|
||||||
|
{877, 18, 16, 21, 1, -17}, // 0x3C '<'
|
||||||
|
{913, 19, 10, 21, 1, -14}, // 0x3D '='
|
||||||
|
{937, 18, 16, 21, 2, -17}, // 0x3E '>'
|
||||||
|
{973, 15, 21, 21, 4, -20}, // 0x3F '?'
|
||||||
|
{1013, 15, 27, 21, 3, -21}, // 0x40 '@'
|
||||||
|
{1064, 22, 21, 21, -1, -20}, // 0x41 'A'
|
||||||
|
{1122, 20, 21, 21, 1, -20}, // 0x42 'B'
|
||||||
|
{1175, 19, 21, 21, 1, -20}, // 0x43 'C'
|
||||||
|
{1225, 18, 21, 21, 2, -20}, // 0x44 'D'
|
||||||
|
{1273, 19, 21, 21, 1, -20}, // 0x45 'E'
|
||||||
|
{1323, 19, 21, 21, 1, -20}, // 0x46 'F'
|
||||||
|
{1373, 20, 21, 21, 1, -20}, // 0x47 'G'
|
||||||
|
{1426, 21, 21, 21, 0, -20}, // 0x48 'H'
|
||||||
|
{1482, 14, 21, 21, 4, -20}, // 0x49 'I'
|
||||||
|
{1519, 19, 21, 21, 2, -20}, // 0x4A 'J'
|
||||||
|
{1569, 20, 21, 21, 1, -20}, // 0x4B 'K'
|
||||||
|
{1622, 18, 21, 21, 2, -20}, // 0x4C 'L'
|
||||||
|
{1670, 23, 21, 21, -1, -20}, // 0x4D 'M'
|
||||||
|
{1731, 20, 21, 21, 1, -20}, // 0x4E 'N'
|
||||||
|
{1784, 20, 21, 21, 1, -20}, // 0x4F 'O'
|
||||||
|
{1837, 18, 21, 21, 1, -20}, // 0x50 'P'
|
||||||
|
{1885, 20, 26, 21, 1, -20}, // 0x51 'Q'
|
||||||
|
{1950, 21, 21, 21, 0, -20}, // 0x52 'R'
|
||||||
|
{2006, 17, 21, 21, 2, -20}, // 0x53 'S'
|
||||||
|
{2051, 19, 21, 21, 1, -20}, // 0x54 'T'
|
||||||
|
{2101, 21, 21, 21, 0, -20}, // 0x55 'U'
|
||||||
|
{2157, 23, 21, 21, -1, -20}, // 0x56 'V'
|
||||||
|
{2218, 21, 21, 21, 0, -20}, // 0x57 'W'
|
||||||
|
{2274, 19, 21, 21, 1, -20}, // 0x58 'X'
|
||||||
|
{2324, 20, 21, 21, 1, -20}, // 0x59 'Y'
|
||||||
|
{2377, 16, 21, 21, 3, -20}, // 0x5A 'Z'
|
||||||
|
{2419, 8, 27, 21, 9, -21}, // 0x5B '['
|
||||||
|
{2446, 15, 28, 21, 3, -23}, // 0x5C '\'
|
||||||
|
{2499, 8, 27, 21, 4, -21}, // 0x5D ']'
|
||||||
|
{2526, 15, 11, 21, 3, -21}, // 0x5E '^'
|
||||||
|
{2547, 21, 4, 21, 0, 4}, // 0x5F '_'
|
||||||
|
{2558, 6, 6, 21, 6, -22}, // 0x60 '`'
|
||||||
|
{2563, 19, 16, 21, 1, -15}, // 0x61 'a'
|
||||||
|
{2601, 19, 22, 21, 1, -21}, // 0x62 'b'
|
||||||
|
{2654, 17, 16, 21, 2, -15}, // 0x63 'c'
|
||||||
|
{2688, 20, 22, 21, 1, -21}, // 0x64 'd'
|
||||||
|
{2743, 18, 16, 21, 1, -15}, // 0x65 'e'
|
||||||
|
{2779, 16, 22, 21, 4, -21}, // 0x66 'f'
|
||||||
|
{2823, 19, 23, 21, 1, -15}, // 0x67 'g'
|
||||||
|
{2878, 21, 22, 21, 0, -21}, // 0x68 'h'
|
||||||
|
{2936, 16, 22, 21, 3, -21}, // 0x69 'i'
|
||||||
|
{2980, 12, 29, 21, 5, -21}, // 0x6A 'j'
|
||||||
|
{3024, 18, 22, 21, 2, -21}, // 0x6B 'k'
|
||||||
|
{3074, 16, 22, 21, 3, -21}, // 0x6C 'l'
|
||||||
|
{3118, 22, 16, 21, -1, -15}, // 0x6D 'm'
|
||||||
|
{3162, 20, 16, 21, 0, -15}, // 0x6E 'n'
|
||||||
|
{3202, 19, 16, 21, 1, -15}, // 0x6F 'o'
|
||||||
|
{3240, 21, 23, 21, 0, -15}, // 0x70 'p'
|
||||||
|
{3301, 21, 23, 22, 1, -15}, // 0x71 'q'
|
||||||
|
{3362, 17, 16, 21, 3, -15}, // 0x72 'r'
|
||||||
|
{3396, 16, 16, 21, 3, -15}, // 0x73 's'
|
||||||
|
{3428, 17, 21, 21, 1, -20}, // 0x74 't'
|
||||||
|
{3473, 18, 16, 21, 1, -15}, // 0x75 'u'
|
||||||
|
{3509, 21, 16, 21, 0, -15}, // 0x76 'v'
|
||||||
|
{3551, 21, 16, 21, 0, -15}, // 0x77 'w'
|
||||||
|
{3593, 19, 16, 21, 1, -15}, // 0x78 'x'
|
||||||
|
{3631, 19, 23, 21, 1, -15}, // 0x79 'y'
|
||||||
|
{3686, 14, 16, 21, 3, -15}, // 0x7A 'z'
|
||||||
|
{3714, 10, 27, 21, 6, -21}, // 0x7B '{'
|
||||||
|
{3748, 4, 27, 21, 9, -21}, // 0x7C '|'
|
||||||
|
{3762, 10, 27, 21, 6, -21}, // 0x7D '}'
|
||||||
|
{3796, 17, 8, 21, 2, -13}}; // 0x7E '~'
|
||||||
|
|
||||||
|
const GFXfont FreeMonoBold18pt7b PROGMEM = {
|
||||||
|
(uint8_t *)FreeMonoBold18pt7bBitmaps, (GFXglyph *)FreeMonoBold18pt7bGlyphs,
|
||||||
|
0x20, 0x7E, 35};
|
||||||
|
|
||||||
|
// Approx. 4485 bytes
|
||||||
674
libraries/Adafruit_GFX_Library/Fonts/FreeMonoBold24pt7b.h
Normal file
674
libraries/Adafruit_GFX_Library/Fonts/FreeMonoBold24pt7b.h
Normal file
@@ -0,0 +1,674 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
|
||||||
|
const uint8_t FreeMonoBold24pt7bBitmaps[] PROGMEM = {
|
||||||
|
0x38, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xF3, 0xE7, 0xCF,
|
||||||
|
0x9F, 0x3E, 0x7C, 0xF9, 0xF3, 0xE3, 0x82, 0x00, 0x00, 0x00, 0x71, 0xF7,
|
||||||
|
0xFF, 0xEF, 0x9E, 0x00, 0xFC, 0x7E, 0xF8, 0x7D, 0xF0, 0xFB, 0xE1, 0xF7,
|
||||||
|
0xC3, 0xEF, 0x87, 0xDF, 0x0F, 0xBE, 0x1F, 0x38, 0x1C, 0x70, 0x38, 0xE0,
|
||||||
|
0x71, 0xC0, 0xE3, 0x81, 0xC7, 0x03, 0x80, 0x01, 0xC1, 0xC0, 0x0F, 0x8F,
|
||||||
|
0x80, 0x3E, 0x3E, 0x00, 0xF8, 0xF8, 0x03, 0xE3, 0xE0, 0x0F, 0x8F, 0x80,
|
||||||
|
0x7E, 0x3E, 0x01, 0xF0, 0xF8, 0x07, 0xC7, 0xC0, 0x1F, 0x1F, 0x03, 0xFF,
|
||||||
|
0xFF, 0x9F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFD, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF,
|
||||||
|
0x81, 0xF1, 0xF0, 0x07, 0xC7, 0xC0, 0x1F, 0x1F, 0x00, 0x7C, 0x7C, 0x1F,
|
||||||
|
0xFF, 0xFC, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0x9F, 0xFF,
|
||||||
|
0xFC, 0x0F, 0x8F, 0x80, 0x3E, 0x3E, 0x00, 0xF8, 0xF8, 0x03, 0xE3, 0xE0,
|
||||||
|
0x0F, 0x8F, 0x80, 0x3E, 0x3E, 0x00, 0xF8, 0xF8, 0x03, 0xE3, 0xE0, 0x0F,
|
||||||
|
0x8F, 0x80, 0x3C, 0x3C, 0x00, 0x00, 0xE0, 0x00, 0x3E, 0x00, 0x07, 0xC0,
|
||||||
|
0x00, 0xF8, 0x00, 0x1F, 0x00, 0x1F, 0xFF, 0x07, 0xFF, 0xF1, 0xFF, 0xFE,
|
||||||
|
0x7F, 0xFF, 0xDF, 0xC1, 0xFB, 0xF0, 0x1F, 0x7C, 0x01, 0xEF, 0x80, 0x39,
|
||||||
|
0xF8, 0x00, 0x3F, 0xF8, 0x03, 0xFF, 0xE0, 0x3F, 0xFF, 0x03, 0xFF, 0xF0,
|
||||||
|
0x0F, 0xFF, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0xC0, 0x07, 0xF8, 0x00, 0xFF,
|
||||||
|
0x80, 0x1F, 0xF8, 0x07, 0xFF, 0x81, 0xFB, 0xFF, 0xFF, 0x7F, 0xFF, 0xCF,
|
||||||
|
0xFF, 0xF1, 0xDF, 0xFC, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00,
|
||||||
|
0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x01, 0xC0, 0x00,
|
||||||
|
0x0F, 0x80, 0x00, 0xFF, 0x00, 0x1F, 0xFC, 0x00, 0xF0, 0xE0, 0x0F, 0x07,
|
||||||
|
0x80, 0x70, 0x1C, 0x03, 0x80, 0xE0, 0x1C, 0x07, 0x00, 0xF0, 0x78, 0x03,
|
||||||
|
0xC3, 0x80, 0x1F, 0xFC, 0x00, 0x7F, 0xC1, 0xF0, 0xF8, 0x7F, 0x00, 0x3F,
|
||||||
|
0xF0, 0x0F, 0xFC, 0x03, 0xFF, 0x00, 0xFF, 0xC0, 0x07, 0xE0, 0xF8, 0x38,
|
||||||
|
0x1F, 0xE0, 0x01, 0xFF, 0x80, 0x0F, 0x1E, 0x00, 0xF0, 0x78, 0x07, 0x01,
|
||||||
|
0xC0, 0x38, 0x0E, 0x01, 0xC0, 0x70, 0x0F, 0x07, 0x80, 0x38, 0x78, 0x01,
|
||||||
|
0xFF, 0xC0, 0x07, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x1F, 0xFC,
|
||||||
|
0x01, 0xFF, 0xE0, 0x1F, 0xFF, 0x00, 0xFF, 0xF8, 0x0F, 0xC7, 0x00, 0x7C,
|
||||||
|
0x10, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00,
|
||||||
|
0x1F, 0x80, 0x00, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0xFF, 0xC7, 0xCF, 0xFF,
|
||||||
|
0x3F, 0x7E, 0xFF, 0xFF, 0xE7, 0xFF, 0xBE, 0x1F, 0xF9, 0xF0, 0x7F, 0x8F,
|
||||||
|
0x83, 0xFC, 0x7C, 0x0F, 0xE3, 0xF0, 0x7F, 0xCF, 0xFF, 0xFF, 0x7F, 0xFF,
|
||||||
|
0xF9, 0xFF, 0xFF, 0xC7, 0xFF, 0xFC, 0x0F, 0xE0, 0x00, 0xFD, 0xF7, 0xDF,
|
||||||
|
0x7D, 0xF7, 0xDF, 0x38, 0xE3, 0x8E, 0x38, 0xE0, 0x01, 0x80, 0xF0, 0x7C,
|
||||||
|
0x3F, 0x0F, 0xC7, 0xE1, 0xF8, 0xFC, 0x3E, 0x0F, 0x87, 0xC1, 0xF0, 0x7C,
|
||||||
|
0x1F, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F,
|
||||||
|
0x81, 0xF0, 0x7C, 0x1F, 0x07, 0xC0, 0xF8, 0x3E, 0x0F, 0xC1, 0xF0, 0x7E,
|
||||||
|
0x0F, 0x83, 0xF0, 0x7C, 0x1F, 0x03, 0xC0, 0x60, 0x3C, 0x0F, 0x83, 0xF0,
|
||||||
|
0xFC, 0x1F, 0x83, 0xE0, 0xFC, 0x1F, 0x07, 0xC1, 0xF8, 0x3E, 0x0F, 0x83,
|
||||||
|
0xE0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C,
|
||||||
|
0x1E, 0x0F, 0x83, 0xE0, 0xF8, 0x7C, 0x1F, 0x0F, 0xC3, 0xE1, 0xF8, 0x7C,
|
||||||
|
0x3F, 0x0F, 0x83, 0xE0, 0xF0, 0x00, 0x00, 0x70, 0x00, 0x07, 0xC0, 0x00,
|
||||||
|
0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x10, 0x7C, 0x11, 0xF3, 0xE7,
|
||||||
|
0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0x87, 0xFF, 0xF0, 0x07,
|
||||||
|
0xFC, 0x00, 0x3F, 0xE0, 0x03, 0xFF, 0x80, 0x3F, 0x7E, 0x01, 0xFB, 0xF0,
|
||||||
|
0x1F, 0x8F, 0xC0, 0xF8, 0x3E, 0x03, 0x80, 0xE0, 0x00, 0x38, 0x00, 0x00,
|
||||||
|
0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F,
|
||||||
|
0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8,
|
||||||
|
0x01, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xDF, 0xFF, 0xFF, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00,
|
||||||
|
0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00,
|
||||||
|
0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x70, 0x00, 0x1F,
|
||||||
|
0x8F, 0x87, 0xC7, 0xC3, 0xE1, 0xE1, 0xF0, 0xF0, 0x78, 0x38, 0x3C, 0x1C,
|
||||||
|
0x0E, 0x06, 0x00, 0x7F, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFE, 0x7D, 0xFF, 0xFF, 0xFF, 0xEF, 0x80,
|
||||||
|
0x00, 0x00, 0x60, 0x00, 0x0F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01,
|
||||||
|
0xF0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00,
|
||||||
|
0xF8, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00,
|
||||||
|
0x3E, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x0F, 0xC0, 0x00, 0xF8, 0x00,
|
||||||
|
0x1F, 0x80, 0x01, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00,
|
||||||
|
0x07, 0xC0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x1F, 0x00,
|
||||||
|
0x01, 0xF0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0xC0,
|
||||||
|
0x00, 0xFC, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x00, 0x00, 0x01,
|
||||||
|
0xFC, 0x00, 0x3F, 0xF8, 0x03, 0xFF, 0xE0, 0x3F, 0xFF, 0x83, 0xFF, 0xFE,
|
||||||
|
0x1F, 0x83, 0xF1, 0xF8, 0x0F, 0xCF, 0x80, 0x3E, 0x7C, 0x01, 0xF7, 0xC0,
|
||||||
|
0x07, 0xFE, 0x00, 0x3F, 0xF0, 0x01, 0xFF, 0x80, 0x0F, 0xFC, 0x00, 0x7F,
|
||||||
|
0xE0, 0x03, 0xFF, 0x00, 0x1F, 0xF8, 0x00, 0xFF, 0xC0, 0x07, 0xFE, 0x00,
|
||||||
|
0x3F, 0xF0, 0x01, 0xFF, 0x80, 0x0F, 0xFC, 0x00, 0x7D, 0xF0, 0x07, 0xCF,
|
||||||
|
0x80, 0x3E, 0x7E, 0x03, 0xF1, 0xF8, 0x3F, 0x0F, 0xFF, 0xF8, 0x3F, 0xFF,
|
||||||
|
0x80, 0xFF, 0xF8, 0x03, 0xFF, 0x80, 0x07, 0xF0, 0x00, 0x01, 0xF8, 0x00,
|
||||||
|
0x3F, 0x80, 0x0F, 0xF8, 0x01, 0xFF, 0x80, 0x7F, 0xF8, 0x0F, 0xEF, 0x80,
|
||||||
|
0xFC, 0xF8, 0x07, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8,
|
||||||
|
0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F,
|
||||||
|
0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00,
|
||||||
|
0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x3F, 0xFF, 0xE7,
|
||||||
|
0xFF, 0xFF, 0x7F, 0xFF, 0xF7, 0xFF, 0xFF, 0x3F, 0xFF, 0xE0, 0x01, 0xFC,
|
||||||
|
0x00, 0x3F, 0xF8, 0x07, 0xFF, 0xF0, 0x7F, 0xFF, 0xC7, 0xFF, 0xFF, 0x3F,
|
||||||
|
0x03, 0xFB, 0xF0, 0x07, 0xFF, 0x00, 0x1F, 0xF8, 0x00, 0xFB, 0x80, 0x07,
|
||||||
|
0xC0, 0x00, 0x3E, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xF8, 0x00,
|
||||||
|
0x3F, 0x80, 0x03, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x3F, 0x00,
|
||||||
|
0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xE0,
|
||||||
|
0x0E, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x03, 0xF8, 0x00, 0xFF, 0xF8, 0x0F, 0xFF,
|
||||||
|
0xE0, 0xFF, 0xFF, 0x8F, 0xFF, 0xFE, 0x7E, 0x03, 0xF1, 0xC0, 0x0F, 0xC0,
|
||||||
|
0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00, 0x0F,
|
||||||
|
0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x07, 0xFC, 0x00, 0x3F, 0xF0, 0x00,
|
||||||
|
0xFF, 0xC0, 0x00, 0x7F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x0F,
|
||||||
|
0x80, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x01, 0xFF, 0xC0,
|
||||||
|
0x3F, 0xBF, 0xFF, 0xFD, 0xFF, 0xFF, 0xC7, 0xFF, 0xFC, 0x1F, 0xFF, 0xC0,
|
||||||
|
0x1F, 0xF0, 0x00, 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x7F, 0x80, 0x07,
|
||||||
|
0xF8, 0x00, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xEF, 0x80, 0x3E, 0xF8, 0x03,
|
||||||
|
0xCF, 0x80, 0x7C, 0xF8, 0x0F, 0x8F, 0x80, 0xF0, 0xF8, 0x1F, 0x0F, 0x81,
|
||||||
|
0xE0, 0xF8, 0x3E, 0x0F, 0x87, 0xC0, 0xF8, 0x78, 0x0F, 0x8F, 0xFF, 0xFE,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x0F,
|
||||||
|
0x80, 0x07, 0xFE, 0x00, 0xFF, 0xF0, 0x0F, 0xFF, 0x00, 0xFF, 0xF0, 0x07,
|
||||||
|
0xFE, 0x3F, 0xFF, 0xC1, 0xFF, 0xFF, 0x0F, 0xFF, 0xF8, 0x7F, 0xFF, 0xC3,
|
||||||
|
0xFF, 0xFC, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00,
|
||||||
|
0x01, 0xF0, 0x00, 0x0F, 0xBF, 0x00, 0x7F, 0xFF, 0x03, 0xFF, 0xFC, 0x1F,
|
||||||
|
0xFF, 0xF0, 0xFF, 0xFF, 0x83, 0xC0, 0xFE, 0x00, 0x01, 0xF0, 0x00, 0x0F,
|
||||||
|
0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00,
|
||||||
|
0x03, 0xE0, 0x00, 0x3F, 0xF0, 0x03, 0xF7, 0xE0, 0x3F, 0xBF, 0xFF, 0xF9,
|
||||||
|
0xFF, 0xFF, 0xC7, 0xFF, 0xFC, 0x1F, 0xFF, 0x80, 0x1F, 0xF0, 0x00, 0x00,
|
||||||
|
0x1F, 0xC0, 0x0F, 0xFF, 0x01, 0xFF, 0xF0, 0x7F, 0xFF, 0x0F, 0xFF, 0xE1,
|
||||||
|
0xFF, 0x00, 0x1F, 0xC0, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00,
|
||||||
|
0x7C, 0x00, 0x0F, 0x8F, 0xC0, 0xF9, 0xFF, 0x0F, 0xFF, 0xF8, 0xFF, 0xFF,
|
||||||
|
0xCF, 0xFF, 0xFC, 0xFF, 0x0F, 0xEF, 0xE0, 0x3E, 0xFC, 0x03, 0xFF, 0x80,
|
||||||
|
0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xF7, 0xC0, 0x3F, 0x7E,
|
||||||
|
0x03, 0xF3, 0xF0, 0x7E, 0x3F, 0xFF, 0xE1, 0xFF, 0xFC, 0x0F, 0xFF, 0x80,
|
||||||
|
0x7F, 0xF0, 0x01, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1F, 0xF0, 0x03, 0xE0, 0x00,
|
||||||
|
0x3E, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00,
|
||||||
|
0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x1F, 0x00,
|
||||||
|
0x01, 0xF0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x07, 0xC0,
|
||||||
|
0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8,
|
||||||
|
0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x06, 0x00, 0x01, 0xF8, 0x00, 0xFF,
|
||||||
|
0xF0, 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x7F, 0xFF, 0xE7, 0xE0, 0x7E, 0xFC,
|
||||||
|
0x03, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xF7,
|
||||||
|
0xC0, 0x3E, 0x7E, 0x07, 0xE3, 0xFF, 0xFC, 0x0F, 0xFF, 0x00, 0xFF, 0xF0,
|
||||||
|
0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x7F, 0x0F, 0xE7, 0xC0, 0x3E, 0xF8, 0x01,
|
||||||
|
0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xFC, 0x03, 0xF7, 0xE0,
|
||||||
|
0x7E, 0x7F, 0xFF, 0xE3, 0xFF, 0xFC, 0x1F, 0xFF, 0x80, 0xFF, 0xF0, 0x03,
|
||||||
|
0xFC, 0x00, 0x03, 0xF8, 0x00, 0xFF, 0xE0, 0x1F, 0xFF, 0x83, 0xFF, 0xF8,
|
||||||
|
0x7F, 0xFF, 0xC7, 0xE0, 0xFE, 0xFC, 0x03, 0xEF, 0x80, 0x3E, 0xF8, 0x01,
|
||||||
|
0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x3F, 0xFC, 0x07, 0xF7, 0xE0,
|
||||||
|
0xFF, 0x7F, 0xFF, 0xF3, 0xFF, 0xFF, 0x1F, 0xFF, 0xF0, 0xFF, 0x9F, 0x03,
|
||||||
|
0xF1, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xE0, 0x00, 0x7E, 0x00, 0x0F, 0xC0,
|
||||||
|
0x01, 0xFC, 0x00, 0x3F, 0x80, 0x0F, 0xF0, 0x7F, 0xFE, 0x0F, 0xFF, 0xC0,
|
||||||
|
0xFF, 0xF8, 0x0F, 0xFF, 0x00, 0x3F, 0x80, 0x00, 0x7D, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xEF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xEF, 0x80, 0x0F, 0x87, 0xF1, 0xFC, 0x7F, 0x1F, 0xC3, 0xE0,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F,
|
||||||
|
0x1F, 0x87, 0xE1, 0xF0, 0xFC, 0x3E, 0x0F, 0x03, 0xC1, 0xE0, 0x78, 0x1C,
|
||||||
|
0x07, 0x01, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x7F,
|
||||||
|
0x00, 0x01, 0xFE, 0x00, 0x07, 0xFC, 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0xC0,
|
||||||
|
0x01, 0xFF, 0x00, 0x07, 0xFE, 0x00, 0x1F, 0xF8, 0x00, 0x7F, 0xE0, 0x00,
|
||||||
|
0xFF, 0xE0, 0x00, 0x1F, 0xF8, 0x00, 0x07, 0xFE, 0x00, 0x01, 0xFF, 0x80,
|
||||||
|
0x00, 0x7F, 0xE0, 0x00, 0x1F, 0xF8, 0x00, 0x07, 0xFC, 0x00, 0x01, 0xFE,
|
||||||
|
0x00, 0x00, 0x7F, 0x00, 0x00, 0x1E, 0x7F, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFE, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFE,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFE,
|
||||||
|
0x00, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x07,
|
||||||
|
0xFC, 0x00, 0x03, 0xFE, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0x80, 0x00,
|
||||||
|
0x7F, 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x3F, 0xF0, 0x00, 0x3F, 0xF0, 0x01,
|
||||||
|
0xFF, 0x00, 0x0F, 0xF8, 0x00, 0x7F, 0xC0, 0x03, 0xFE, 0x00, 0x1F, 0xF0,
|
||||||
|
0x00, 0xFF, 0x80, 0x03, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x0F, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x03, 0xF8, 0x01, 0xFF, 0xF0, 0xFF, 0xFF, 0x8F,
|
||||||
|
0xFF, 0xFC, 0xFF, 0xFF, 0xEF, 0xC0, 0x7E, 0xF8, 0x03, 0xFF, 0x80, 0x1F,
|
||||||
|
0x70, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x3F,
|
||||||
|
0xE0, 0x0F, 0xFC, 0x01, 0xFF, 0x00, 0x0F, 0xC0, 0x00, 0xF0, 0x00, 0x0F,
|
||||||
|
0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x1F, 0x00, 0x03, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00,
|
||||||
|
0x3F, 0x80, 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0xFF, 0x80, 0x3F, 0xF8,
|
||||||
|
0x0F, 0xFF, 0x83, 0xE0, 0xF8, 0x78, 0x07, 0x1E, 0x00, 0xF3, 0x80, 0x0E,
|
||||||
|
0x70, 0x01, 0xDE, 0x00, 0x3B, 0x80, 0x3F, 0x70, 0x1F, 0xEE, 0x07, 0xFD,
|
||||||
|
0xC1, 0xFF, 0xB8, 0x7E, 0x77, 0x0F, 0x0E, 0xE3, 0xC1, 0xDC, 0x70, 0x3B,
|
||||||
|
0x8E, 0x07, 0x71, 0xC0, 0xEE, 0x3C, 0x1D, 0xC3, 0xC3, 0xB8, 0x7F, 0xF7,
|
||||||
|
0x07, 0xFF, 0xE0, 0x7F, 0xFC, 0x03, 0xFB, 0xC0, 0x00, 0x38, 0x00, 0x07,
|
||||||
|
0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x61, 0xF0, 0x3E, 0x1F, 0xFF, 0xC3,
|
||||||
|
0xFF, 0xF0, 0x1F, 0xFC, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x7F,
|
||||||
|
0xFE, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x7F, 0xFE,
|
||||||
|
0x00, 0x00, 0x1F, 0xF0, 0x00, 0x01, 0xF7, 0xC0, 0x00, 0x0F, 0xBE, 0x00,
|
||||||
|
0x00, 0x7D, 0xF8, 0x00, 0x07, 0xC7, 0xC0, 0x00, 0x3E, 0x3E, 0x00, 0x03,
|
||||||
|
0xE0, 0xF8, 0x00, 0x1F, 0x07, 0xC0, 0x00, 0xF0, 0x3F, 0x00, 0x0F, 0x80,
|
||||||
|
0xF8, 0x00, 0x7F, 0xFF, 0xC0, 0x07, 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0xF8,
|
||||||
|
0x03, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0x00, 0xF8, 0x00, 0xF8, 0x0F,
|
||||||
|
0x80, 0x03, 0xE1, 0xFF, 0x80, 0xFF, 0xDF, 0xFE, 0x0F, 0xFF, 0xFF, 0xF0,
|
||||||
|
0x7F, 0xFF, 0xFF, 0x83, 0xFF, 0xDF, 0xF8, 0x0F, 0xFC, 0x7F, 0xFF, 0xC0,
|
||||||
|
0x3F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xF8, 0x7F, 0xFF,
|
||||||
|
0xFE, 0x07, 0xC0, 0x1F, 0xC1, 0xF0, 0x01, 0xF0, 0x7C, 0x00, 0x7C, 0x1F,
|
||||||
|
0x00, 0x1F, 0x07, 0xC0, 0x0F, 0xC1, 0xF0, 0x07, 0xE0, 0x7F, 0xFF, 0xF0,
|
||||||
|
0x1F, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF,
|
||||||
|
0xFC, 0x1F, 0x00, 0x3F, 0x87, 0xC0, 0x03, 0xF1, 0xF0, 0x00, 0x7C, 0x7C,
|
||||||
|
0x00, 0x1F, 0x1F, 0x00, 0x07, 0xC7, 0xC0, 0x03, 0xF7, 0xFF, 0xFF, 0xFB,
|
||||||
|
0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x87, 0xFF, 0xFF,
|
||||||
|
0x00, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0xE7, 0x01, 0xFF, 0xFF, 0xC1, 0xFF,
|
||||||
|
0xFF, 0xE1, 0xFF, 0xFF, 0xF1, 0xFE, 0x07, 0xF8, 0xFC, 0x01, 0xFC, 0xFC,
|
||||||
|
0x00, 0x7E, 0x7C, 0x00, 0x1F, 0x7E, 0x00, 0x0F, 0xBE, 0x00, 0x03, 0x9F,
|
||||||
|
0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01,
|
||||||
|
0xF0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00,
|
||||||
|
0x1F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x39, 0xFC, 0x00,
|
||||||
|
0x7C, 0x7F, 0x80, 0xFF, 0x1F, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0x81, 0xFF,
|
||||||
|
0xFF, 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x7F,
|
||||||
|
0xFF, 0xF0, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xC1,
|
||||||
|
0xF0, 0x0F, 0xF0, 0xF8, 0x01, 0xF8, 0x7C, 0x00, 0x7E, 0x3E, 0x00, 0x1F,
|
||||||
|
0x1F, 0x00, 0x0F, 0xCF, 0x80, 0x03, 0xE7, 0xC0, 0x01, 0xF3, 0xE0, 0x00,
|
||||||
|
0xF9, 0xF0, 0x00, 0x7C, 0xF8, 0x00, 0x3E, 0x7C, 0x00, 0x1F, 0x3E, 0x00,
|
||||||
|
0x0F, 0x9F, 0x00, 0x07, 0xCF, 0x80, 0x07, 0xE7, 0xC0, 0x03, 0xE3, 0xE0,
|
||||||
|
0x03, 0xF1, 0xF0, 0x07, 0xF1, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF8, 0xFF,
|
||||||
|
0xFF, 0xF8, 0x7F, 0xFF, 0xF0, 0x1F, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0xFF,
|
||||||
|
0x7F, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF,
|
||||||
|
0xF0, 0xF8, 0x00, 0xF8, 0x7C, 0x00, 0x7C, 0x3E, 0x0E, 0x3E, 0x1F, 0x0F,
|
||||||
|
0x9F, 0x0F, 0x87, 0xC7, 0x07, 0xC3, 0xE0, 0x03, 0xFF, 0xF0, 0x01, 0xFF,
|
||||||
|
0xF8, 0x00, 0xFF, 0xFC, 0x00, 0x7F, 0xFE, 0x00, 0x3F, 0xFF, 0x00, 0x1F,
|
||||||
|
0x0F, 0x80, 0x0F, 0x87, 0xC3, 0x87, 0xC1, 0xC3, 0xE3, 0xE0, 0x01, 0xF1,
|
||||||
|
0xF0, 0x00, 0xF8, 0xF8, 0x00, 0x7D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF,
|
||||||
|
0xFF, 0xF8, 0xF8, 0x00, 0x7C, 0x7C, 0x00, 0x3E, 0x3E, 0x00, 0x1F, 0x1F,
|
||||||
|
0x07, 0x0F, 0x8F, 0x87, 0xC3, 0x87, 0xC3, 0xE0, 0x03, 0xFF, 0xF0, 0x01,
|
||||||
|
0xFF, 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0x7F, 0xFE, 0x00, 0x3F, 0xFF, 0x00,
|
||||||
|
0x1F, 0x0F, 0x80, 0x0F, 0x87, 0xC0, 0x07, 0xC3, 0xE0, 0x03, 0xE0, 0xE0,
|
||||||
|
0x01, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xFF, 0xF0, 0x01, 0xFF, 0xFC,
|
||||||
|
0x00, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00,
|
||||||
|
0x7F, 0x8E, 0x00, 0xFF, 0xF7, 0x81, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xE1,
|
||||||
|
0xFF, 0xFF, 0xF1, 0xFE, 0x03, 0xF8, 0xFC, 0x00, 0xFC, 0xFC, 0x00, 0x3E,
|
||||||
|
0x7C, 0x00, 0x1F, 0x7E, 0x00, 0x07, 0x3E, 0x00, 0x00, 0x1F, 0x00, 0x00,
|
||||||
|
0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xF0, 0x0F,
|
||||||
|
0xFE, 0xF8, 0x0F, 0xFF, 0xFC, 0x07, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0x00,
|
||||||
|
0xFF, 0xFF, 0xC0, 0x01, 0xF3, 0xF0, 0x00, 0xF9, 0xFC, 0x00, 0x7C, 0x7F,
|
||||||
|
0x80, 0xFE, 0x3F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0x80,
|
||||||
|
0x7F, 0xFF, 0x00, 0x07, 0xFC, 0x00, 0x3F, 0xE1, 0xFF, 0x1F, 0xFC, 0xFF,
|
||||||
|
0xE7, 0xFF, 0x3F, 0xF9, 0xFF, 0xCF, 0xFE, 0x3F, 0xE1, 0xFF, 0x07, 0xC0,
|
||||||
|
0x0F, 0x81, 0xF0, 0x03, 0xE0, 0x7C, 0x00, 0xF8, 0x1F, 0x00, 0x3E, 0x07,
|
||||||
|
0xC0, 0x0F, 0x81, 0xF0, 0x03, 0xE0, 0x7F, 0xFF, 0xF8, 0x1F, 0xFF, 0xFE,
|
||||||
|
0x07, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xF8, 0x1F, 0x00,
|
||||||
|
0x3E, 0x07, 0xC0, 0x0F, 0x81, 0xF0, 0x03, 0xE0, 0x7C, 0x00, 0xF8, 0x1F,
|
||||||
|
0x00, 0x3E, 0x07, 0xC0, 0x0F, 0x87, 0xFE, 0x1F, 0xFB, 0xFF, 0xCF, 0xFF,
|
||||||
|
0xFF, 0xF3, 0xFF, 0xFF, 0xFC, 0xFF, 0xF7, 0xFE, 0x1F, 0xF8, 0x7F, 0xFF,
|
||||||
|
0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFC, 0x03, 0xE0,
|
||||||
|
0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0,
|
||||||
|
0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80,
|
||||||
|
0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00,
|
||||||
|
0x03, 0xE0, 0x1F, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD,
|
||||||
|
0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF,
|
||||||
|
0xE0, 0x3F, 0xFF, 0xF0, 0x0F, 0xFF, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x07,
|
||||||
|
0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x00,
|
||||||
|
0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, 0x80, 0x00,
|
||||||
|
0x07, 0xC0, 0xE0, 0x03, 0xE0, 0xF8, 0x01, 0xF0, 0x7C, 0x00, 0xF8, 0x3E,
|
||||||
|
0x00, 0x7C, 0x1F, 0x00, 0x3E, 0x0F, 0x80, 0x1F, 0x07, 0xC0, 0x1F, 0x83,
|
||||||
|
0xF8, 0x3F, 0x81, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xC0,
|
||||||
|
0x07, 0xFF, 0xC0, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0xE0, 0xFF, 0x9F, 0xFE,
|
||||||
|
0x3F, 0xFB, 0xFF, 0xC7, 0xFF, 0x7F, 0xF8, 0xFF, 0xE7, 0xFE, 0x0F, 0xF8,
|
||||||
|
0x3E, 0x01, 0xF8, 0x07, 0xC0, 0xFE, 0x00, 0xF8, 0x3F, 0x80, 0x1F, 0x0F,
|
||||||
|
0xE0, 0x03, 0xE3, 0xF8, 0x00, 0x7D, 0xFC, 0x00, 0x0F, 0xFF, 0x00, 0x01,
|
||||||
|
0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF, 0xF0, 0x00, 0xFE, 0x7F,
|
||||||
|
0x00, 0x1F, 0x87, 0xF0, 0x03, 0xE0, 0x7E, 0x00, 0x7C, 0x07, 0xE0, 0x0F,
|
||||||
|
0x80, 0x7E, 0x01, 0xF0, 0x0F, 0xC0, 0x3E, 0x00, 0xF8, 0x1F, 0xF8, 0x1F,
|
||||||
|
0xF7, 0xFF, 0x81, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFE, 0x07, 0xFD, 0xFF,
|
||||||
|
0x80, 0x7F, 0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x3F, 0xFF, 0x80,
|
||||||
|
0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0xC0, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00,
|
||||||
|
0x00, 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xF0,
|
||||||
|
0x00, 0x00, 0xF8, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F,
|
||||||
|
0x00, 0x00, 0x0F, 0x80, 0x0E, 0x07, 0xC0, 0x0F, 0x83, 0xE0, 0x07, 0xC1,
|
||||||
|
0xF0, 0x03, 0xE0, 0xF8, 0x01, 0xF0, 0x7C, 0x00, 0xF8, 0x3E, 0x00, 0x7D,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xDF, 0xFF, 0xFF, 0xE0, 0x3F, 0x80, 0x03, 0xF8, 0xFF, 0x80, 0x0F, 0xF9,
|
||||||
|
0xFF, 0x00, 0x1F, 0xF3, 0xFF, 0x00, 0x7F, 0xE3, 0xFE, 0x00, 0xFF, 0x83,
|
||||||
|
0xFE, 0x03, 0xFE, 0x07, 0xFC, 0x07, 0xFC, 0x0F, 0xFC, 0x1F, 0xF8, 0x1F,
|
||||||
|
0xF8, 0x3F, 0xF0, 0x3F, 0xF0, 0x7F, 0xE0, 0x7D, 0xF1, 0xF7, 0xC0, 0xFB,
|
||||||
|
0xE3, 0xEF, 0x81, 0xF7, 0xEF, 0xDF, 0x03, 0xE7, 0xDF, 0x3E, 0x07, 0xCF,
|
||||||
|
0xFE, 0x7C, 0x0F, 0x8F, 0xF8, 0xF8, 0x1F, 0x1F, 0xF1, 0xF0, 0x3E, 0x1F,
|
||||||
|
0xE3, 0xE0, 0x7C, 0x3F, 0x87, 0xC0, 0xF8, 0x3F, 0x0F, 0x81, 0xF0, 0x00,
|
||||||
|
0x1F, 0x03, 0xE0, 0x00, 0x3E, 0x1F, 0xF8, 0x03, 0xFF, 0x7F, 0xF8, 0x0F,
|
||||||
|
0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xE0, 0x3F, 0xFD, 0xFF, 0x80, 0x3F,
|
||||||
|
0xF0, 0x7F, 0x00, 0x7F, 0xEF, 0xF8, 0x0F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF,
|
||||||
|
0xFC, 0x0F, 0xFF, 0x7F, 0xE0, 0x7F, 0xE1, 0xFF, 0x00, 0xF8, 0x1F, 0xF0,
|
||||||
|
0x0F, 0x81, 0xFF, 0x80, 0xF8, 0x1F, 0xFC, 0x0F, 0x81, 0xFF, 0xC0, 0xF8,
|
||||||
|
0x1F, 0x7E, 0x0F, 0x81, 0xF3, 0xF0, 0xF8, 0x1F, 0x3F, 0x0F, 0x81, 0xF1,
|
||||||
|
0xF8, 0xF8, 0x1F, 0x0F, 0xCF, 0x81, 0xF0, 0xFC, 0xF8, 0x1F, 0x07, 0xEF,
|
||||||
|
0x81, 0xF0, 0x3F, 0xF8, 0x1F, 0x03, 0xFF, 0x81, 0xF0, 0x1F, 0xF8, 0x1F,
|
||||||
|
0x00, 0xFF, 0x81, 0xF0, 0x0F, 0xF8, 0x7F, 0xE0, 0x7F, 0x8F, 0xFF, 0x03,
|
||||||
|
0xF8, 0xFF, 0xF0, 0x3F, 0x8F, 0xFF, 0x01, 0xF8, 0x7F, 0xE0, 0x0F, 0x80,
|
||||||
|
0x00, 0x3F, 0x80, 0x00, 0x3F, 0xFC, 0x00, 0x0F, 0xFF, 0xE0, 0x03, 0xFF,
|
||||||
|
0xFE, 0x00, 0xFF, 0xFF, 0xE0, 0x3F, 0xC1, 0xFE, 0x0F, 0xE0, 0x0F, 0xE1,
|
||||||
|
0xF8, 0x00, 0xFC, 0x7E, 0x00, 0x0F, 0xCF, 0x80, 0x00, 0xFB, 0xF0, 0x00,
|
||||||
|
0x1F, 0xFC, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x3F, 0xF0, 0x00, 0x07, 0xFE,
|
||||||
|
0x00, 0x00, 0xFF, 0xC0, 0x00, 0x1F, 0xF8, 0x00, 0x03, 0xFF, 0x00, 0x00,
|
||||||
|
0x7F, 0xF0, 0x00, 0x1F, 0xBE, 0x00, 0x03, 0xE7, 0xE0, 0x00, 0xFC, 0x7E,
|
||||||
|
0x00, 0x3F, 0x0F, 0xE0, 0x0F, 0xE0, 0xFF, 0x07, 0xF8, 0x0F, 0xFF, 0xFE,
|
||||||
|
0x00, 0xFF, 0xFF, 0x80, 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xF8, 0x00, 0x03,
|
||||||
|
0xF8, 0x00, 0x7F, 0xFF, 0x80, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xF8, 0xFF,
|
||||||
|
0xFF, 0xFC, 0x7F, 0xFF, 0xFE, 0x1F, 0x00, 0xFE, 0x1F, 0x00, 0x3F, 0x1F,
|
||||||
|
0x00, 0x1F, 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x1F, 0x1F,
|
||||||
|
0x00, 0x3F, 0x1F, 0x00, 0x7E, 0x1F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFC, 0x1F,
|
||||||
|
0xFF, 0xF8, 0x1F, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0x1F, 0x00, 0x00, 0x1F,
|
||||||
|
0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x7F, 0xFC, 0x00, 0xFF,
|
||||||
|
0xFE, 0x00, 0xFF, 0xFE, 0x00, 0xFF, 0xFE, 0x00, 0x7F, 0xFC, 0x00, 0x00,
|
||||||
|
0x3F, 0x80, 0x00, 0x3F, 0xFC, 0x00, 0x0F, 0xFF, 0xE0, 0x03, 0xFF, 0xFE,
|
||||||
|
0x00, 0xFF, 0xFF, 0xE0, 0x3F, 0xC1, 0xFE, 0x0F, 0xE0, 0x0F, 0xE1, 0xF8,
|
||||||
|
0x00, 0xFC, 0x7E, 0x00, 0x0F, 0xCF, 0x80, 0x00, 0xFB, 0xF0, 0x00, 0x1F,
|
||||||
|
0xFC, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x3F, 0xF0, 0x00, 0x07, 0xFE, 0x00,
|
||||||
|
0x00, 0xFF, 0xC0, 0x00, 0x1F, 0xF8, 0x00, 0x03, 0xFF, 0x80, 0x00, 0xFD,
|
||||||
|
0xF0, 0x00, 0x1F, 0x3F, 0x00, 0x07, 0xE7, 0xF0, 0x01, 0xF8, 0x7F, 0x00,
|
||||||
|
0x7F, 0x07, 0xF8, 0x3F, 0xC0, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFC, 0x00,
|
||||||
|
0x7F, 0xFF, 0x00, 0x07, 0xFF, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x0F, 0x00,
|
||||||
|
0x00, 0x03, 0xFF, 0x87, 0x80, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0x07,
|
||||||
|
0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xF0, 0x0F, 0x01, 0xF8, 0x00, 0x7F, 0xFF,
|
||||||
|
0x80, 0x0F, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xC0,
|
||||||
|
0x7F, 0xFF, 0xFE, 0x00, 0xF8, 0x07, 0xE0, 0x0F, 0x80, 0x3F, 0x00, 0xF8,
|
||||||
|
0x01, 0xF0, 0x0F, 0x80, 0x1F, 0x00, 0xF8, 0x01, 0xF0, 0x0F, 0x80, 0x3F,
|
||||||
|
0x00, 0xF8, 0x0F, 0xE0, 0x0F, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xC0, 0x0F,
|
||||||
|
0xFF, 0xF0, 0x00, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xF8, 0x3F,
|
||||||
|
0x80, 0x0F, 0x81, 0xFC, 0x00, 0xF8, 0x0F, 0xE0, 0x0F, 0x80, 0x7E, 0x00,
|
||||||
|
0xF8, 0x03, 0xF0, 0x7F, 0xF0, 0x1F, 0xEF, 0xFF, 0x81, 0xFF, 0xFF, 0xF8,
|
||||||
|
0x0F, 0xFF, 0xFF, 0x80, 0x7F, 0x7F, 0xF0, 0x07, 0xE0, 0x01, 0xFC, 0x70,
|
||||||
|
0x1F, 0xFD, 0xE0, 0xFF, 0xFF, 0x87, 0xFF, 0xFE, 0x3F, 0xFF, 0xF8, 0xFC,
|
||||||
|
0x0F, 0xE7, 0xE0, 0x1F, 0x9F, 0x00, 0x3E, 0x7C, 0x00, 0xF9, 0xF0, 0x01,
|
||||||
|
0xC7, 0xF0, 0x00, 0x0F, 0xF8, 0x00, 0x3F, 0xFF, 0x00, 0x7F, 0xFF, 0x00,
|
||||||
|
0xFF, 0xFF, 0x00, 0xFF, 0xFC, 0x00, 0x1F, 0xF8, 0x00, 0x07, 0xE0, 0x00,
|
||||||
|
0x0F, 0xDC, 0x00, 0x1F, 0xF8, 0x00, 0x7F, 0xE0, 0x01, 0xFF, 0xC0, 0x0F,
|
||||||
|
0xFF, 0xC0, 0xFE, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xCF, 0xFF, 0xFE, 0x1C,
|
||||||
|
0xFF, 0xF0, 0x00, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xF0, 0x7F,
|
||||||
|
0xE0, 0xF8, 0x3F, 0xF0, 0x7C, 0x1F, 0xF8, 0x3E, 0x0F, 0xFC, 0x1F, 0x07,
|
||||||
|
0xFE, 0x0F, 0x83, 0xEE, 0x07, 0xC0, 0xE0, 0x03, 0xE0, 0x00, 0x01, 0xF0,
|
||||||
|
0x00, 0x00, 0xF8, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F,
|
||||||
|
0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01,
|
||||||
|
0xF0, 0x00, 0x0F, 0xFF, 0x80, 0x0F, 0xFF, 0xE0, 0x07, 0xFF, 0xF0, 0x03,
|
||||||
|
0xFF, 0xF8, 0x00, 0xFF, 0xF8, 0x00, 0x7F, 0xE0, 0x7F, 0xEF, 0xFF, 0x0F,
|
||||||
|
0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0x7F, 0xE0, 0x7F, 0xE1,
|
||||||
|
0xF0, 0x00, 0xF8, 0x1F, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0xF8, 0x1F, 0x00,
|
||||||
|
0x0F, 0x81, 0xF0, 0x00, 0xF8, 0x1F, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0xF8,
|
||||||
|
0x1F, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0xF8, 0x1F, 0x00, 0x0F, 0x81, 0xF0,
|
||||||
|
0x00, 0xF8, 0x1F, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0xF8, 0x1F, 0x00, 0x0F,
|
||||||
|
0x81, 0xF0, 0x00, 0xF8, 0x1F, 0x80, 0x1F, 0x80, 0xF8, 0x01, 0xF0, 0x0F,
|
||||||
|
0xE0, 0x7F, 0x00, 0x7F, 0xFF, 0xE0, 0x03, 0xFF, 0xFE, 0x00, 0x1F, 0xFF,
|
||||||
|
0x80, 0x00, 0xFF, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x7F, 0xE0, 0x1F, 0xFB,
|
||||||
|
0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFC, 0x0F, 0xFF, 0x7F,
|
||||||
|
0xE0, 0x1F, 0xF8, 0x7C, 0x00, 0x0F, 0x80, 0xF8, 0x00, 0x7C, 0x03, 0xE0,
|
||||||
|
0x01, 0xF0, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0x7E, 0x00,
|
||||||
|
0xF8, 0x00, 0xF8, 0x07, 0xC0, 0x03, 0xF0, 0x1F, 0x00, 0x07, 0xC0, 0xF8,
|
||||||
|
0x00, 0x1F, 0x03, 0xE0, 0x00, 0x7E, 0x1F, 0x00, 0x00, 0xF8, 0x7C, 0x00,
|
||||||
|
0x03, 0xF3, 0xF0, 0x00, 0x07, 0xCF, 0x80, 0x00, 0x1F, 0xBE, 0x00, 0x00,
|
||||||
|
0x3F, 0xF0, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x07,
|
||||||
|
0xF8, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0xFC,
|
||||||
|
0x00, 0x00, 0x7F, 0xE0, 0x7F, 0xEF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF0, 0xFF,
|
||||||
|
0xFF, 0xFF, 0x0F, 0xFF, 0x7F, 0xE0, 0x7F, 0xE3, 0xE0, 0x00, 0x3C, 0x3E,
|
||||||
|
0x0F, 0x83, 0xC3, 0xE1, 0xF8, 0x3C, 0x3E, 0x1F, 0x87, 0xC3, 0xE1, 0xFC,
|
||||||
|
0x7C, 0x3E, 0x3F, 0xC7, 0xC1, 0xE3, 0xFC, 0x7C, 0x1F, 0x3F, 0xE7, 0xC1,
|
||||||
|
0xF7, 0xFE, 0x78, 0x1F, 0x7F, 0xE7, 0x81, 0xF7, 0x9F, 0xF8, 0x1F, 0xF9,
|
||||||
|
0xFF, 0x81, 0xFF, 0x9F, 0xF8, 0x0F, 0xF9, 0xFF, 0x80, 0xFF, 0x0F, 0xF8,
|
||||||
|
0x0F, 0xF0, 0xFF, 0x80, 0xFF, 0x0F, 0xF0, 0x0F, 0xE0, 0x7F, 0x00, 0xFE,
|
||||||
|
0x07, 0xF0, 0x0F, 0xE0, 0x7F, 0x00, 0xFC, 0x03, 0xF0, 0x07, 0xC0, 0x3F,
|
||||||
|
0x00, 0x7F, 0x80, 0xFF, 0x3F, 0xF0, 0x7F, 0xEF, 0xFC, 0x1F, 0xFB, 0xFF,
|
||||||
|
0x07, 0xFE, 0x7F, 0x80, 0xFF, 0x07, 0xE0, 0x3F, 0x00, 0xFC, 0x0F, 0x80,
|
||||||
|
0x1F, 0x87, 0xC0, 0x03, 0xF3, 0xE0, 0x00, 0xFF, 0xF8, 0x00, 0x1F, 0xFC,
|
||||||
|
0x00, 0x03, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x07,
|
||||||
|
0xF0, 0x00, 0x03, 0xFE, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0xFC, 0xF8, 0x00,
|
||||||
|
0x7E, 0x3F, 0x00, 0x3F, 0x07, 0xE0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x1F,
|
||||||
|
0x07, 0xFC, 0x0F, 0xFB, 0xFF, 0x87, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xF8,
|
||||||
|
0x7F, 0xF7, 0xFC, 0x0F, 0xF8, 0x7F, 0x80, 0x7F, 0xBF, 0xF0, 0x3F, 0xFF,
|
||||||
|
0xFC, 0x0F, 0xFF, 0xFF, 0x03, 0xFF, 0x7F, 0x80, 0x7F, 0x87, 0xE0, 0x1F,
|
||||||
|
0x80, 0xFC, 0x07, 0xC0, 0x1F, 0x03, 0xE0, 0x03, 0xE1, 0xF8, 0x00, 0xFC,
|
||||||
|
0x7C, 0x00, 0x1F, 0xBE, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x7F, 0xC0, 0x00,
|
||||||
|
0x1F, 0xE0, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, 0x00,
|
||||||
|
0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F,
|
||||||
|
0x00, 0x00, 0x07, 0xC0, 0x00, 0x1F, 0xFF, 0x00, 0x0F, 0xFF, 0xE0, 0x03,
|
||||||
|
0xFF, 0xF8, 0x00, 0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0x00, 0x7F, 0xFF, 0xF3,
|
||||||
|
0xFF, 0xFF, 0x9F, 0xFF, 0xFC, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0x3E, 0x03,
|
||||||
|
0xF1, 0xF0, 0x1F, 0x8F, 0x81, 0xF8, 0x7C, 0x1F, 0x83, 0xE1, 0xF8, 0x0E,
|
||||||
|
0x1F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0,
|
||||||
|
0x00, 0xFC, 0x00, 0x0F, 0xE0, 0x70, 0x7E, 0x07, 0xC7, 0xE0, 0x3E, 0x7E,
|
||||||
|
0x01, 0xF7, 0xE0, 0x0F, 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xBF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xBE, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8,
|
||||||
|
0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F,
|
||||||
|
0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0,
|
||||||
|
0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x60, 0x00, 0x0F, 0x00, 0x00,
|
||||||
|
0xF8, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7E, 0x00,
|
||||||
|
0x03, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x00, 0xF8,
|
||||||
|
0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x03,
|
||||||
|
0xE0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00,
|
||||||
|
0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xF0,
|
||||||
|
0x00, 0x1F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x07,
|
||||||
|
0xC0, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00,
|
||||||
|
0x1F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F,
|
||||||
|
0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0,
|
||||||
|
0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F,
|
||||||
|
0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x7F, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0x7F, 0xC0, 0x00, 0x40, 0x00, 0x06, 0x00, 0x00, 0xF0,
|
||||||
|
0x00, 0x1F, 0x80, 0x03, 0xFC, 0x00, 0x7F, 0xE0, 0x0F, 0xFF, 0x00, 0xFF,
|
||||||
|
0xF8, 0x1F, 0x9F, 0x83, 0xF0, 0xFC, 0x7E, 0x07, 0xEF, 0xC0, 0x3F, 0xF8,
|
||||||
|
0x01, 0xFF, 0x80, 0x0F, 0x70, 0x00, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xF0, 0xE0, 0x78, 0x3E, 0x0F, 0xC3, 0xF0, 0x7C, 0x1E, 0x06, 0x01, 0xFF,
|
||||||
|
0x00, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0xE0, 0x1F, 0xFF, 0xF0, 0x0F, 0xFF,
|
||||||
|
0xF8, 0x00, 0x01, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x01, 0xFF,
|
||||||
|
0xF8, 0x07, 0xFF, 0xF8, 0x1F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF8, 0x7F, 0xFF,
|
||||||
|
0xF8, 0x7F, 0x00, 0xF8, 0xFC, 0x00, 0xF8, 0xF8, 0x00, 0xF8, 0xF8, 0x03,
|
||||||
|
0xF8, 0xFC, 0x0F, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x3F, 0xFF,
|
||||||
|
0xFF, 0x1F, 0xFE, 0xFE, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x00, 0x1F, 0xE0,
|
||||||
|
0x00, 0x03, 0xFC, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00,
|
||||||
|
0x3E, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x1F, 0x0F,
|
||||||
|
0xE0, 0x03, 0xEF, 0xFF, 0x00, 0x7F, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0x81,
|
||||||
|
0xFF, 0xFF, 0xF8, 0x3F, 0xE0, 0x7F, 0x07, 0xF0, 0x03, 0xF0, 0xFC, 0x00,
|
||||||
|
0x3E, 0x1F, 0x80, 0x07, 0xE3, 0xE0, 0x00, 0x7C, 0x7C, 0x00, 0x0F, 0x8F,
|
||||||
|
0x80, 0x01, 0xF1, 0xF0, 0x00, 0x3E, 0x3E, 0x00, 0x07, 0xC7, 0xE0, 0x01,
|
||||||
|
0xF8, 0xFC, 0x00, 0x3E, 0x1F, 0xC0, 0x0F, 0xCF, 0xFE, 0x07, 0xF3, 0xFF,
|
||||||
|
0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xE0, 0xFE, 0x7F, 0xF0,
|
||||||
|
0x00, 0x03, 0xF8, 0x00, 0x00, 0xFF, 0x18, 0x03, 0xFF, 0xFC, 0x0F, 0xFF,
|
||||||
|
0xFC, 0x1F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFC, 0x3F, 0x81, 0xFC, 0x7E, 0x00,
|
||||||
|
0x7C, 0x7C, 0x00, 0x7C, 0xFC, 0x00, 0x3C, 0xF8, 0x00, 0x38, 0xF8, 0x00,
|
||||||
|
0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFC, 0x00,
|
||||||
|
0x00, 0x7C, 0x00, 0x06, 0x7E, 0x00, 0x1F, 0x7F, 0x80, 0x7F, 0x3F, 0xFF,
|
||||||
|
0xFF, 0x1F, 0xFF, 0xFE, 0x0F, 0xFF, 0xFC, 0x07, 0xFF, 0xF8, 0x00, 0xFF,
|
||||||
|
0xC0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x1F, 0xE0, 0x00,
|
||||||
|
0x07, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xE0,
|
||||||
|
0x00, 0x00, 0xF8, 0x00, 0xFE, 0x3E, 0x00, 0xFF, 0xEF, 0x80, 0xFF, 0xFF,
|
||||||
|
0xE0, 0x7F, 0xFF, 0xF8, 0x3F, 0xFF, 0xFE, 0x1F, 0xE0, 0xFF, 0x87, 0xE0,
|
||||||
|
0x0F, 0xE1, 0xF0, 0x01, 0xF8, 0xFC, 0x00, 0x7E, 0x3E, 0x00, 0x0F, 0x8F,
|
||||||
|
0x80, 0x03, 0xE3, 0xE0, 0x00, 0xF8, 0xF8, 0x00, 0x3E, 0x3E, 0x00, 0x0F,
|
||||||
|
0x8F, 0xC0, 0x07, 0xE1, 0xF0, 0x01, 0xF8, 0x7E, 0x00, 0xFE, 0x0F, 0xE0,
|
||||||
|
0x7F, 0xE3, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xC0,
|
||||||
|
0xFF, 0xEF, 0xE0, 0x0F, 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x03, 0xFF, 0xC0,
|
||||||
|
0x0F, 0xFF, 0xE0, 0x1F, 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, 0x7F, 0x81, 0xFC,
|
||||||
|
0x7E, 0x00, 0x7E, 0xFC, 0x00, 0x3E, 0xF8, 0x00, 0x3E, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xF8, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7F, 0x80, 0x7E,
|
||||||
|
0x3F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFE, 0x07, 0xFF, 0xF8,
|
||||||
|
0x00, 0xFF, 0x80, 0x00, 0x3F, 0xE0, 0x03, 0xFF, 0xE0, 0x1F, 0xFF, 0xC0,
|
||||||
|
0xFF, 0xFF, 0x07, 0xFF, 0xF8, 0x1F, 0x80, 0x00, 0x7C, 0x00, 0x01, 0xF0,
|
||||||
|
0x00, 0x07, 0xC0, 0x01, 0xFF, 0xFF, 0x0F, 0xFF, 0xFE, 0x3F, 0xFF, 0xF8,
|
||||||
|
0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x07,
|
||||||
|
0xC0, 0x00, 0x1F, 0x00, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x07, 0xC0,
|
||||||
|
0x00, 0x1F, 0x00, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x07, 0xC0, 0x01,
|
||||||
|
0xFF, 0xFF, 0x0F, 0xFF, 0xFE, 0x3F, 0xFF, 0xF8, 0xFF, 0xFF, 0xE1, 0xFF,
|
||||||
|
0xFF, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xFF, 0xBF, 0x83, 0xFF, 0xFF, 0xE3,
|
||||||
|
0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xFB, 0xFC, 0x3F, 0xF9, 0xF8, 0x07, 0xF0,
|
||||||
|
0xF8, 0x01, 0xF8, 0xFC, 0x00, 0xFC, 0x7C, 0x00, 0x3E, 0x3E, 0x00, 0x1F,
|
||||||
|
0x1F, 0x00, 0x0F, 0x8F, 0x80, 0x07, 0xC7, 0xC0, 0x03, 0xE3, 0xF0, 0x03,
|
||||||
|
0xF0, 0xF8, 0x01, 0xF8, 0x7E, 0x01, 0xFC, 0x3F, 0xC3, 0xFE, 0x0F, 0xFF,
|
||||||
|
0xFF, 0x03, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xC0, 0x3F, 0xFB, 0xE0, 0x07,
|
||||||
|
0xF1, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xFE, 0x00,
|
||||||
|
0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x3F, 0xFE, 0x00,
|
||||||
|
0x0F, 0xFC, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00,
|
||||||
|
0x03, 0xFC, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0,
|
||||||
|
0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, 0x0F, 0xC0, 0x07, 0xCF, 0xFC, 0x01,
|
||||||
|
0xF7, 0xFF, 0x80, 0x7F, 0xFF, 0xF0, 0x1F, 0xFF, 0xFC, 0x07, 0xFC, 0x1F,
|
||||||
|
0x81, 0xFC, 0x03, 0xE0, 0x7E, 0x00, 0xF8, 0x1F, 0x00, 0x3E, 0x07, 0xC0,
|
||||||
|
0x0F, 0x81, 0xF0, 0x03, 0xE0, 0x7C, 0x00, 0xF8, 0x1F, 0x00, 0x3E, 0x07,
|
||||||
|
0xC0, 0x0F, 0x81, 0xF0, 0x03, 0xE0, 0x7C, 0x00, 0xF8, 0x1F, 0x00, 0x3E,
|
||||||
|
0x1F, 0xF0, 0x3F, 0xEF, 0xFE, 0x1F, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xE1,
|
||||||
|
0xFF, 0xDF, 0xF0, 0x3F, 0xE0, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C,
|
||||||
|
0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x1F, 0xF8, 0x01, 0xFF, 0xC0, 0x0F, 0xFE, 0x00, 0x7F, 0xF0,
|
||||||
|
0x01, 0xFF, 0x80, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x00,
|
||||||
|
0xF8, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80,
|
||||||
|
0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x7F, 0xFF, 0xF7, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0x00, 0x00, 0x7C,
|
||||||
|
0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7,
|
||||||
|
0xFF, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07,
|
||||||
|
0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00,
|
||||||
|
0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8,
|
||||||
|
0x00, 0x7C, 0x00, 0x3E, 0x00, 0x3F, 0x00, 0x3F, 0xBF, 0xFF, 0xBF, 0xFF,
|
||||||
|
0x9F, 0xFF, 0xCF, 0xFF, 0x83, 0xFF, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x80,
|
||||||
|
0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xF8,
|
||||||
|
0x00, 0x00, 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F,
|
||||||
|
0x87, 0xFC, 0x07, 0xC7, 0xFF, 0x03, 0xE3, 0xFF, 0x81, 0xF1, 0xFF, 0xC0,
|
||||||
|
0xF8, 0x7F, 0xC0, 0x7C, 0xFE, 0x00, 0x3E, 0xFE, 0x00, 0x1F, 0xFE, 0x00,
|
||||||
|
0x0F, 0xFE, 0x00, 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x80, 0x01, 0xFF, 0xE0,
|
||||||
|
0x00, 0xFF, 0xF8, 0x00, 0x7C, 0xFE, 0x00, 0x3E, 0x3F, 0x80, 0x1F, 0x0F,
|
||||||
|
0xE0, 0x3F, 0x81, 0xFF, 0xBF, 0xC1, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF0,
|
||||||
|
0x7F, 0xFB, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x01, 0xFF, 0xC0, 0x0F, 0xFE,
|
||||||
|
0x00, 0x7F, 0xF0, 0x01, 0xFF, 0x80, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00,
|
||||||
|
0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0,
|
||||||
|
0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x00,
|
||||||
|
0xF8, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80,
|
||||||
|
0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x03, 0xFF,
|
||||||
|
0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xF8,
|
||||||
|
0x00, 0x3C, 0x1F, 0x00, 0xFD, 0xFC, 0xFF, 0x07, 0xFF, 0xFF, 0xFE, 0x1F,
|
||||||
|
0xFF, 0xFF, 0xF8, 0x7F, 0xFF, 0xFF, 0xF0, 0xFF, 0x1F, 0x87, 0xC1, 0xF8,
|
||||||
|
0x7E, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F,
|
||||||
|
0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1,
|
||||||
|
0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C,
|
||||||
|
0x1F, 0x07, 0xC1, 0xF1, 0xFE, 0x1F, 0x87, 0xEF, 0xFC, 0x7F, 0x1F, 0xFF,
|
||||||
|
0xF1, 0xFC, 0x7F, 0xFF, 0xC7, 0xF1, 0xFD, 0xFE, 0x1F, 0x87, 0xE0, 0x00,
|
||||||
|
0x1F, 0x80, 0x1F, 0x9F, 0xF8, 0x1F, 0xDF, 0xFE, 0x0F, 0xFF, 0xFF, 0x87,
|
||||||
|
0xFF, 0xFF, 0xC1, 0xFF, 0x07, 0xF0, 0x7F, 0x01, 0xF8, 0x3F, 0x00, 0x7C,
|
||||||
|
0x1F, 0x00, 0x3E, 0x0F, 0x80, 0x1F, 0x07, 0xC0, 0x0F, 0x83, 0xE0, 0x07,
|
||||||
|
0xC1, 0xF0, 0x03, 0xE0, 0xF8, 0x01, 0xF0, 0x7C, 0x00, 0xF8, 0x3E, 0x00,
|
||||||
|
0x7C, 0x1F, 0x00, 0x3E, 0x3F, 0xE0, 0x7F, 0xBF, 0xF8, 0x7F, 0xFF, 0xFC,
|
||||||
|
0x3F, 0xFF, 0xFE, 0x1F, 0xFB, 0xFE, 0x07, 0xF8, 0x00, 0x7F, 0x00, 0x01,
|
||||||
|
0xFF, 0xF0, 0x01, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xC1,
|
||||||
|
0xFE, 0x0F, 0xF1, 0xFC, 0x01, 0xFC, 0xFC, 0x00, 0x7E, 0xFC, 0x00, 0x1F,
|
||||||
|
0xFC, 0x00, 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x01, 0xFF, 0x80, 0x00,
|
||||||
|
0xFF, 0xC0, 0x00, 0x7F, 0xF0, 0x00, 0x7E, 0xF8, 0x00, 0x7E, 0x7F, 0x00,
|
||||||
|
0x7F, 0x1F, 0xC0, 0xFF, 0x07, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0x80, 0x7F,
|
||||||
|
0xFF, 0x00, 0x1F, 0xFF, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x07, 0xE0, 0x03,
|
||||||
|
0xF9, 0xFF, 0xC0, 0x7F, 0xBF, 0xFE, 0x07, 0xFF, 0xFF, 0xF8, 0x7F, 0xFF,
|
||||||
|
0xFF, 0xC3, 0xFF, 0x83, 0xFC, 0x0F, 0xE0, 0x0F, 0xE0, 0xFC, 0x00, 0x7E,
|
||||||
|
0x0F, 0xC0, 0x03, 0xF0, 0xF8, 0x00, 0x1F, 0x0F, 0x80, 0x01, 0xF0, 0xF8,
|
||||||
|
0x00, 0x1F, 0x0F, 0x80, 0x01, 0xF0, 0xF8, 0x00, 0x3F, 0x0F, 0xC0, 0x03,
|
||||||
|
0xF0, 0xFE, 0x00, 0x7E, 0x0F, 0xF8, 0x1F, 0xE0, 0xFF, 0xFF, 0xFC, 0x0F,
|
||||||
|
0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xF0, 0x0F, 0x9F, 0xFC, 0x00, 0xF8, 0x7F,
|
||||||
|
0x00, 0x0F, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00,
|
||||||
|
0xF8, 0x00, 0x00, 0x7F, 0xF8, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0xFF, 0xFC,
|
||||||
|
0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x7F, 0xF8, 0x00, 0x00, 0x00, 0x7E, 0x00,
|
||||||
|
0x00, 0x3F, 0xF9, 0xFC, 0x0F, 0xFF, 0xDF, 0xE1, 0xFF, 0xFF, 0xFE, 0x3F,
|
||||||
|
0xFF, 0xFF, 0xE3, 0xF8, 0x1F, 0xFC, 0x7F, 0x00, 0x7F, 0x07, 0xC0, 0x03,
|
||||||
|
0xF0, 0xFC, 0x00, 0x3F, 0x0F, 0x80, 0x01, 0xF0, 0xF8, 0x00, 0x1F, 0x0F,
|
||||||
|
0x80, 0x01, 0xF0, 0xF8, 0x00, 0x1F, 0x0F, 0xC0, 0x01, 0xF0, 0xFC, 0x00,
|
||||||
|
0x3F, 0x07, 0xE0, 0x07, 0xF0, 0x7F, 0x81, 0xFF, 0x03, 0xFF, 0xFF, 0xF0,
|
||||||
|
0x1F, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0x9F, 0x00, 0x0F,
|
||||||
|
0xE1, 0xF0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x1F,
|
||||||
|
0x00, 0x00, 0x01, 0xF0, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0x00,
|
||||||
|
0x03, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x01,
|
||||||
|
0xF0, 0x3F, 0xC7, 0xFC, 0x7F, 0xCF, 0xFE, 0x7F, 0xDF, 0xFF, 0x7F, 0xFF,
|
||||||
|
0xFF, 0x3F, 0xFF, 0x0E, 0x07, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x07, 0xF0,
|
||||||
|
0x00, 0x07, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0,
|
||||||
|
0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0,
|
||||||
|
0x00, 0x7F, 0xFF, 0xC0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF,
|
||||||
|
0xE0, 0x7F, 0xFF, 0xC0, 0x03, 0xFC, 0x60, 0x7F, 0xFF, 0x87, 0xFF, 0xFC,
|
||||||
|
0x7F, 0xFF, 0xE7, 0xFF, 0xFF, 0x3F, 0x01, 0xF9, 0xF0, 0x07, 0xCF, 0xC0,
|
||||||
|
0x1C, 0x7F, 0xF0, 0x03, 0xFF, 0xF8, 0x0F, 0xFF, 0xF0, 0x3F, 0xFF, 0xC0,
|
||||||
|
0x3F, 0xFF, 0x00, 0x0F, 0xFD, 0xC0, 0x07, 0xFE, 0x00, 0x1F, 0xF8, 0x00,
|
||||||
|
0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xEF, 0xFF, 0xFE, 0x3F,
|
||||||
|
0xFF, 0xC0, 0x07, 0xF8, 0x00, 0x07, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x3E,
|
||||||
|
0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0xFF,
|
||||||
|
0xF8, 0x7F, 0xFF, 0xF8, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF,
|
||||||
|
0x80, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00,
|
||||||
|
0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00,
|
||||||
|
0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x03, 0x83, 0xF0, 0x1F, 0x87,
|
||||||
|
0xFF, 0xFF, 0x07, 0xFF, 0xFE, 0x0F, 0xFF, 0xF8, 0x07, 0xFF, 0xC0, 0x03,
|
||||||
|
0xFC, 0x00, 0x7F, 0x01, 0xFE, 0x7F, 0x81, 0xFF, 0x3F, 0xC0, 0xFF, 0x9F,
|
||||||
|
0xE0, 0x7F, 0xC7, 0xF0, 0x1F, 0xE0, 0xF8, 0x01, 0xF0, 0x7C, 0x00, 0xF8,
|
||||||
|
0x3E, 0x00, 0x7C, 0x1F, 0x00, 0x3E, 0x0F, 0x80, 0x1F, 0x07, 0xC0, 0x0F,
|
||||||
|
0x83, 0xE0, 0x07, 0xC1, 0xF0, 0x03, 0xE0, 0xF8, 0x01, 0xF0, 0x7C, 0x01,
|
||||||
|
0xF8, 0x3F, 0x01, 0xFC, 0x1F, 0xC1, 0xFF, 0x07, 0xFF, 0xFF, 0xC3, 0xFF,
|
||||||
|
0xFF, 0xE0, 0xFF, 0xF7, 0xF0, 0x3F, 0xF3, 0xF0, 0x03, 0xF0, 0x00, 0x7F,
|
||||||
|
0xE0, 0x7F, 0xEF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x0F,
|
||||||
|
0xFF, 0x7F, 0xE0, 0x7F, 0xE0, 0xF8, 0x01, 0xF0, 0x0F, 0xC0, 0x1F, 0x00,
|
||||||
|
0x7C, 0x03, 0xE0, 0x07, 0xE0, 0x3E, 0x00, 0x3E, 0x07, 0xC0, 0x03, 0xF0,
|
||||||
|
0x7C, 0x00, 0x1F, 0x0F, 0x80, 0x01, 0xF8, 0xF8, 0x00, 0x0F, 0x9F, 0x00,
|
||||||
|
0x00, 0xFD, 0xF0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x03,
|
||||||
|
0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x1F, 0x80,
|
||||||
|
0x00, 0x7F, 0x80, 0x1F, 0xEF, 0xFC, 0x03, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF,
|
||||||
|
0xFC, 0x03, 0xFF, 0x7F, 0x80, 0x1F, 0xE1, 0xF0, 0xF8, 0x7C, 0x1F, 0x1F,
|
||||||
|
0x87, 0xC1, 0xF1, 0xF8, 0xFC, 0x1F, 0x1F, 0xCF, 0x80, 0xFB, 0xFC, 0xF8,
|
||||||
|
0x0F, 0xBF, 0xDF, 0x80, 0xFB, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x00, 0x7F,
|
||||||
|
0xDF, 0xF0, 0x07, 0xF9, 0xFF, 0x00, 0x7F, 0x9F, 0xE0, 0x07, 0xF0, 0xFE,
|
||||||
|
0x00, 0x3F, 0x0F, 0xE0, 0x03, 0xF0, 0x7E, 0x00, 0x3E, 0x07, 0xC0, 0x03,
|
||||||
|
0xE0, 0x3C, 0x00, 0x3F, 0xC0, 0xFF, 0x1F, 0xF8, 0x7F, 0xE7, 0xFE, 0x1F,
|
||||||
|
0xF9, 0xFF, 0x87, 0xFE, 0x3F, 0xC0, 0xFF, 0x03, 0xF8, 0x7F, 0x00, 0x7F,
|
||||||
|
0x3F, 0x80, 0x0F, 0xFF, 0xC0, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0xE0, 0x00,
|
||||||
|
0x07, 0xF8, 0x00, 0x07, 0xFF, 0x00, 0x03, 0xFF, 0xE0, 0x01, 0xFF, 0xFE,
|
||||||
|
0x00, 0xFE, 0x1F, 0xC0, 0x7F, 0x03, 0xF8, 0x7F, 0xC0, 0xFF, 0xBF, 0xF8,
|
||||||
|
0x7F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF, 0x87, 0xFF, 0x7F, 0xC0, 0xFF, 0x80,
|
||||||
|
0x7F, 0x80, 0x7F, 0xBF, 0xF0, 0x3F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0x03,
|
||||||
|
0xFF, 0x7F, 0x80, 0x7F, 0x8F, 0xC0, 0x07, 0x81, 0xF0, 0x03, 0xE0, 0x7E,
|
||||||
|
0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xF0, 0x3E, 0x00, 0x7C, 0x0F, 0x80,
|
||||||
|
0x0F, 0x87, 0xC0, 0x03, 0xE1, 0xF0, 0x00, 0x7C, 0xF8, 0x00, 0x1F, 0xFE,
|
||||||
|
0x00, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x07,
|
||||||
|
0xF0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x80, 0x00,
|
||||||
|
0x07, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x1F, 0xFF, 0x80,
|
||||||
|
0x0F, 0xFF, 0xF0, 0x03, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0x00, 0x1F, 0xFF,
|
||||||
|
0x80, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xF0, 0x3F, 0xBE, 0x0F, 0xC3, 0x83, 0xF0, 0x00, 0xFC, 0x00,
|
||||||
|
0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F,
|
||||||
|
0xC0, 0x3B, 0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x78, 0x03, 0xF0, 0x1F, 0xC0, 0xFF, 0x07,
|
||||||
|
0xF8, 0x1F, 0x80, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01,
|
||||||
|
0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x0F, 0x81, 0xFE, 0x0F,
|
||||||
|
0xF0, 0x3F, 0x80, 0xFF, 0x01, 0xFE, 0x00, 0xFC, 0x01, 0xF0, 0x07, 0xC0,
|
||||||
|
0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF8,
|
||||||
|
0x07, 0xF8, 0x0F, 0xF0, 0x3F, 0xC0, 0x7F, 0x00, 0x78, 0x77, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xE0, 0x78, 0x03, 0xF0, 0x0F,
|
||||||
|
0xE0, 0x3F, 0xC0, 0x7F, 0x00, 0x7E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80,
|
||||||
|
0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0,
|
||||||
|
0x07, 0xC0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x03, 0xFC, 0x1F, 0xE0, 0xFC,
|
||||||
|
0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E,
|
||||||
|
0x00, 0xF8, 0x07, 0xE0, 0x7F, 0x83, 0xFC, 0x0F, 0xF0, 0x3F, 0x80, 0x78,
|
||||||
|
0x00, 0x07, 0x80, 0x00, 0x7F, 0x80, 0x03, 0xFF, 0x03, 0x9F, 0xFE, 0x1F,
|
||||||
|
0xFF, 0xFC, 0xFF, 0xF3, 0xFF, 0xFF, 0x87, 0xFF, 0x9C, 0x0F, 0xFC, 0x00,
|
||||||
|
0x0F, 0xE0, 0x00, 0x1F, 0x00};
|
||||||
|
|
||||||
|
const GFXglyph FreeMonoBold24pt7bGlyphs[] PROGMEM = {
|
||||||
|
{0, 0, 0, 28, 0, 1}, // 0x20 ' '
|
||||||
|
{0, 7, 31, 28, 10, -29}, // 0x21 '!'
|
||||||
|
{28, 15, 14, 28, 6, -28}, // 0x22 '"'
|
||||||
|
{55, 22, 34, 28, 3, -30}, // 0x23 '#'
|
||||||
|
{149, 19, 38, 28, 5, -31}, // 0x24 '$'
|
||||||
|
{240, 21, 30, 28, 4, -28}, // 0x25 '%'
|
||||||
|
{319, 21, 28, 28, 4, -26}, // 0x26 '&'
|
||||||
|
{393, 6, 14, 28, 11, -28}, // 0x27 '''
|
||||||
|
{404, 10, 37, 28, 12, -29}, // 0x28 '('
|
||||||
|
{451, 10, 37, 28, 6, -29}, // 0x29 ')'
|
||||||
|
{498, 21, 19, 28, 4, -28}, // 0x2A '*'
|
||||||
|
{548, 23, 26, 28, 3, -25}, // 0x2B '+'
|
||||||
|
{623, 9, 14, 28, 7, -6}, // 0x2C ','
|
||||||
|
{639, 24, 5, 28, 2, -15}, // 0x2D '-'
|
||||||
|
{654, 7, 6, 28, 11, -4}, // 0x2E '.'
|
||||||
|
{660, 20, 38, 28, 4, -32}, // 0x2F '/'
|
||||||
|
{755, 21, 31, 28, 4, -29}, // 0x30 '0'
|
||||||
|
{837, 20, 29, 28, 4, -28}, // 0x31 '1'
|
||||||
|
{910, 21, 30, 28, 3, -29}, // 0x32 '2'
|
||||||
|
{989, 21, 31, 28, 4, -29}, // 0x33 '3'
|
||||||
|
{1071, 20, 28, 28, 4, -27}, // 0x34 '4'
|
||||||
|
{1141, 21, 31, 28, 4, -29}, // 0x35 '5'
|
||||||
|
{1223, 20, 31, 28, 5, -29}, // 0x36 '6'
|
||||||
|
{1301, 20, 30, 28, 4, -29}, // 0x37 '7'
|
||||||
|
{1376, 20, 31, 28, 4, -29}, // 0x38 '8'
|
||||||
|
{1454, 20, 31, 28, 5, -29}, // 0x39 '9'
|
||||||
|
{1532, 7, 22, 28, 11, -20}, // 0x3A ':'
|
||||||
|
{1552, 10, 28, 28, 6, -20}, // 0x3B ';'
|
||||||
|
{1587, 24, 21, 28, 2, -23}, // 0x3C '<'
|
||||||
|
{1650, 24, 14, 28, 2, -19}, // 0x3D '='
|
||||||
|
{1692, 23, 22, 28, 3, -23}, // 0x3E '>'
|
||||||
|
{1756, 20, 29, 28, 5, -27}, // 0x3F '?'
|
||||||
|
{1829, 19, 36, 28, 4, -28}, // 0x40 '@'
|
||||||
|
{1915, 29, 27, 28, -1, -26}, // 0x41 'A'
|
||||||
|
{2013, 26, 27, 28, 1, -26}, // 0x42 'B'
|
||||||
|
{2101, 25, 29, 28, 2, -27}, // 0x43 'C'
|
||||||
|
{2192, 25, 27, 28, 1, -26}, // 0x44 'D'
|
||||||
|
{2277, 25, 27, 28, 1, -26}, // 0x45 'E'
|
||||||
|
{2362, 25, 27, 28, 1, -26}, // 0x46 'F'
|
||||||
|
{2447, 25, 29, 28, 2, -27}, // 0x47 'G'
|
||||||
|
{2538, 26, 27, 28, 1, -26}, // 0x48 'H'
|
||||||
|
{2626, 19, 27, 28, 5, -26}, // 0x49 'I'
|
||||||
|
{2691, 25, 28, 28, 3, -26}, // 0x4A 'J'
|
||||||
|
{2779, 27, 27, 28, 1, -26}, // 0x4B 'K'
|
||||||
|
{2871, 25, 27, 28, 2, -26}, // 0x4C 'L'
|
||||||
|
{2956, 31, 27, 28, -1, -26}, // 0x4D 'M'
|
||||||
|
{3061, 28, 27, 28, 0, -26}, // 0x4E 'N'
|
||||||
|
{3156, 27, 29, 28, 1, -27}, // 0x4F 'O'
|
||||||
|
{3254, 24, 27, 28, 1, -26}, // 0x50 'P'
|
||||||
|
{3335, 27, 35, 28, 1, -27}, // 0x51 'Q'
|
||||||
|
{3454, 28, 27, 28, 0, -26}, // 0x52 'R'
|
||||||
|
{3549, 22, 29, 28, 3, -27}, // 0x53 'S'
|
||||||
|
{3629, 25, 27, 28, 2, -26}, // 0x54 'T'
|
||||||
|
{3714, 28, 28, 28, 0, -26}, // 0x55 'U'
|
||||||
|
{3812, 30, 27, 28, -1, -26}, // 0x56 'V'
|
||||||
|
{3914, 28, 27, 28, 0, -26}, // 0x57 'W'
|
||||||
|
{4009, 26, 27, 28, 1, -26}, // 0x58 'X'
|
||||||
|
{4097, 26, 27, 28, 1, -26}, // 0x59 'Y'
|
||||||
|
{4185, 21, 27, 28, 4, -26}, // 0x5A 'Z'
|
||||||
|
{4256, 10, 37, 28, 12, -29}, // 0x5B '['
|
||||||
|
{4303, 20, 38, 28, 4, -32}, // 0x5C '\'
|
||||||
|
{4398, 10, 37, 28, 6, -29}, // 0x5D ']'
|
||||||
|
{4445, 20, 15, 28, 4, -29}, // 0x5E '^'
|
||||||
|
{4483, 28, 5, 28, 0, 5}, // 0x5F '_'
|
||||||
|
{4501, 9, 8, 28, 8, -30}, // 0x60 '`'
|
||||||
|
{4510, 24, 23, 28, 2, -21}, // 0x61 'a'
|
||||||
|
{4579, 27, 31, 28, 0, -29}, // 0x62 'b'
|
||||||
|
{4684, 24, 23, 28, 3, -21}, // 0x63 'c'
|
||||||
|
{4753, 26, 31, 28, 2, -29}, // 0x64 'd'
|
||||||
|
{4854, 24, 23, 28, 2, -21}, // 0x65 'e'
|
||||||
|
{4923, 22, 30, 28, 4, -29}, // 0x66 'f'
|
||||||
|
{5006, 25, 31, 28, 2, -21}, // 0x67 'g'
|
||||||
|
{5103, 26, 30, 28, 1, -29}, // 0x68 'h'
|
||||||
|
{5201, 21, 29, 28, 4, -28}, // 0x69 'i'
|
||||||
|
{5278, 17, 38, 28, 5, -28}, // 0x6A 'j'
|
||||||
|
{5359, 25, 30, 28, 2, -29}, // 0x6B 'k'
|
||||||
|
{5453, 21, 30, 28, 4, -29}, // 0x6C 'l'
|
||||||
|
{5532, 30, 22, 28, -1, -21}, // 0x6D 'm'
|
||||||
|
{5615, 25, 22, 28, 1, -21}, // 0x6E 'n'
|
||||||
|
{5684, 25, 23, 28, 2, -21}, // 0x6F 'o'
|
||||||
|
{5756, 28, 31, 28, 0, -21}, // 0x70 'p'
|
||||||
|
{5865, 28, 31, 28, 1, -21}, // 0x71 'q'
|
||||||
|
{5974, 24, 22, 28, 3, -21}, // 0x72 'r'
|
||||||
|
{6040, 21, 23, 28, 4, -21}, // 0x73 's'
|
||||||
|
{6101, 23, 28, 28, 1, -26}, // 0x74 't'
|
||||||
|
{6182, 25, 22, 28, 1, -20}, // 0x75 'u'
|
||||||
|
{6251, 28, 21, 28, 0, -20}, // 0x76 'v'
|
||||||
|
{6325, 28, 21, 28, 0, -20}, // 0x77 'w'
|
||||||
|
{6399, 26, 21, 28, 1, -20}, // 0x78 'x'
|
||||||
|
{6468, 26, 30, 28, 1, -20}, // 0x79 'y'
|
||||||
|
{6566, 19, 21, 28, 5, -20}, // 0x7A 'z'
|
||||||
|
{6616, 14, 37, 28, 7, -29}, // 0x7B '{'
|
||||||
|
{6681, 5, 36, 28, 12, -28}, // 0x7C '|'
|
||||||
|
{6704, 14, 37, 28, 8, -29}, // 0x7D '}'
|
||||||
|
{6769, 22, 10, 28, 3, -17}}; // 0x7E '~'
|
||||||
|
|
||||||
|
const GFXfont FreeMonoBold24pt7b PROGMEM = {
|
||||||
|
(uint8_t *)FreeMonoBold24pt7bBitmaps, (GFXglyph *)FreeMonoBold24pt7bGlyphs,
|
||||||
|
0x20, 0x7E, 47};
|
||||||
|
|
||||||
|
// Approx. 7469 bytes
|
||||||
191
libraries/Adafruit_GFX_Library/Fonts/FreeMonoBold9pt7b.h
Normal file
191
libraries/Adafruit_GFX_Library/Fonts/FreeMonoBold9pt7b.h
Normal file
@@ -0,0 +1,191 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
|
||||||
|
const uint8_t FreeMonoBold9pt7bBitmaps[] PROGMEM = {
|
||||||
|
0xFF, 0xFF, 0xD2, 0x1F, 0x80, 0xEC, 0x89, 0x12, 0x24, 0x40, 0x36, 0x36,
|
||||||
|
0x36, 0x7F, 0x7F, 0x36, 0xFF, 0xFF, 0x3C, 0x3C, 0x3C, 0x00, 0x18, 0xFF,
|
||||||
|
0xFE, 0x3C, 0x1F, 0x1F, 0x83, 0x46, 0x8D, 0xF0, 0xC1, 0x83, 0x00, 0x61,
|
||||||
|
0x22, 0x44, 0x86, 0x67, 0x37, 0x11, 0x22, 0x4C, 0x70, 0x3C, 0x7E, 0x60,
|
||||||
|
0x60, 0x30, 0x7B, 0xDF, 0xCE, 0xFF, 0x7F, 0xC9, 0x24, 0x37, 0x66, 0xCC,
|
||||||
|
0xCC, 0xCC, 0x66, 0x31, 0xCE, 0x66, 0x33, 0x33, 0x33, 0x66, 0xC8, 0x18,
|
||||||
|
0x18, 0xFF, 0xFF, 0x3C, 0x3C, 0x66, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18,
|
||||||
|
0x18, 0x18, 0x18, 0x6B, 0x48, 0xFF, 0xFF, 0xC0, 0xF0, 0x02, 0x0C, 0x18,
|
||||||
|
0x60, 0xC3, 0x06, 0x0C, 0x30, 0x61, 0x83, 0x0C, 0x18, 0x20, 0x00, 0x38,
|
||||||
|
0xFB, 0xBE, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0xDD, 0xF1, 0xC0, 0x38, 0xF3,
|
||||||
|
0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0xFD, 0xF8, 0x3C, 0xFE, 0xC7, 0x03,
|
||||||
|
0x03, 0x06, 0x0C, 0x18, 0x70, 0xE3, 0xFF, 0xFF, 0x7C, 0xFE, 0x03, 0x03,
|
||||||
|
0x03, 0x1E, 0x1E, 0x07, 0x03, 0x03, 0xFE, 0x7C, 0x1C, 0x38, 0xB1, 0x64,
|
||||||
|
0xD9, 0xBF, 0xFF, 0x3E, 0x7C, 0x7E, 0x3F, 0x18, 0x0F, 0xC7, 0xF3, 0x1C,
|
||||||
|
0x06, 0x03, 0xC3, 0xFF, 0x9F, 0x80, 0x0F, 0x3F, 0x30, 0x60, 0x60, 0xDC,
|
||||||
|
0xFE, 0xE3, 0xC3, 0x63, 0x7E, 0x3C, 0xFF, 0xFF, 0xC3, 0x03, 0x06, 0x06,
|
||||||
|
0x06, 0x0C, 0x0C, 0x0C, 0x18, 0x38, 0xFB, 0x1E, 0x3C, 0x6F, 0x9F, 0x63,
|
||||||
|
0xC7, 0x8F, 0xF1, 0xC0, 0x3C, 0x7E, 0xE6, 0xC3, 0xC3, 0xE7, 0x7F, 0x3B,
|
||||||
|
0x06, 0x0E, 0xFC, 0xF0, 0xF0, 0x0F, 0x6C, 0x00, 0x1A, 0xD2, 0x00, 0x01,
|
||||||
|
0x83, 0x87, 0x0E, 0x0F, 0x80, 0xE0, 0x1C, 0x03, 0xFF, 0xFF, 0xC0, 0x00,
|
||||||
|
0x0F, 0xFF, 0xFC, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0xF9, 0xE3, 0xC1, 0x80,
|
||||||
|
0x7C, 0xFE, 0xC7, 0x03, 0x0E, 0x1C, 0x00, 0x00, 0x00, 0x30, 0x30, 0x1E,
|
||||||
|
0x1F, 0x1C, 0xDC, 0x6C, 0x76, 0x7B, 0x6D, 0xB6, 0xDB, 0x6F, 0xF3, 0xFC,
|
||||||
|
0x06, 0x33, 0xF8, 0x78, 0x3C, 0x07, 0xC0, 0x38, 0x05, 0x81, 0xB0, 0x36,
|
||||||
|
0x0F, 0xE1, 0xFC, 0x71, 0xDF, 0x7F, 0xEF, 0x80, 0xFF, 0x3F, 0xE6, 0x19,
|
||||||
|
0x86, 0x7F, 0x1F, 0xE6, 0x1D, 0x83, 0x60, 0xFF, 0xFF, 0xF0, 0x1F, 0xBF,
|
||||||
|
0xD8, 0xF8, 0x3C, 0x06, 0x03, 0x01, 0x80, 0x61, 0xBF, 0xC7, 0xC0, 0xFE,
|
||||||
|
0x3F, 0xE6, 0x19, 0x83, 0x60, 0xD8, 0x36, 0x0D, 0x83, 0x61, 0xBF, 0xEF,
|
||||||
|
0xE0, 0xFF, 0xFF, 0xD8, 0x6D, 0xB7, 0xC3, 0xE1, 0xB0, 0xC3, 0x61, 0xFF,
|
||||||
|
0xFF, 0xE0, 0xFF, 0xFF, 0xD8, 0x6D, 0xB7, 0xC3, 0xE1, 0xB0, 0xC0, 0x60,
|
||||||
|
0x7C, 0x3E, 0x00, 0x1F, 0x9F, 0xE6, 0x1B, 0x06, 0xC0, 0x30, 0x0C, 0x7F,
|
||||||
|
0x1F, 0xE1, 0x9F, 0xE3, 0xF0, 0xF7, 0xFB, 0xD8, 0xCC, 0x66, 0x33, 0xF9,
|
||||||
|
0xFC, 0xC6, 0x63, 0x7B, 0xFD, 0xE0, 0xFF, 0xF3, 0x0C, 0x30, 0xC3, 0x0C,
|
||||||
|
0x33, 0xFF, 0xC0, 0x1F, 0xC7, 0xF0, 0x30, 0x0C, 0x03, 0x00, 0xCC, 0x33,
|
||||||
|
0x0C, 0xC7, 0x3F, 0x87, 0xC0, 0xF7, 0xBD, 0xE6, 0x61, 0xB0, 0x78, 0x1F,
|
||||||
|
0x06, 0xE1, 0x98, 0x63, 0x3C, 0xFF, 0x3C, 0xFC, 0x7E, 0x0C, 0x06, 0x03,
|
||||||
|
0x01, 0x80, 0xC6, 0x63, 0x31, 0xFF, 0xFF, 0xE0, 0xE0, 0xFE, 0x3D, 0xC7,
|
||||||
|
0x3D, 0xE7, 0xBC, 0xD7, 0x9B, 0xB3, 0x76, 0x60, 0xDE, 0x3F, 0xC7, 0x80,
|
||||||
|
0xE1, 0xFE, 0x3D, 0xE3, 0x3C, 0x66, 0xCC, 0xDD, 0x99, 0xB3, 0x1E, 0x63,
|
||||||
|
0xDE, 0x3B, 0xC3, 0x00, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x7C, 0x07, 0x80,
|
||||||
|
0xF0, 0x1F, 0x07, 0x71, 0xC7, 0xF0, 0x7C, 0x00, 0xFE, 0x7F, 0x98, 0x6C,
|
||||||
|
0x36, 0x1B, 0xF9, 0xF8, 0xC0, 0x60, 0x7C, 0x3E, 0x00, 0x1F, 0x07, 0xF1,
|
||||||
|
0xC7, 0x70, 0x7C, 0x07, 0x80, 0xF0, 0x1F, 0x07, 0x71, 0xC7, 0xF0, 0x7C,
|
||||||
|
0x0C, 0x33, 0xFE, 0x7F, 0x80, 0xFC, 0x7F, 0x18, 0xCC, 0x66, 0x73, 0xF1,
|
||||||
|
0xF0, 0xCC, 0x63, 0x7D, 0xFE, 0x60, 0x3F, 0xBF, 0xF0, 0x78, 0x0F, 0x03,
|
||||||
|
0xF8, 0x3F, 0x83, 0xC3, 0xFF, 0xBF, 0x80, 0xFF, 0xFF, 0xF6, 0x7B, 0x3D,
|
||||||
|
0x98, 0xC0, 0x60, 0x30, 0x18, 0x3F, 0x1F, 0x80, 0xF1, 0xFE, 0x3D, 0x83,
|
||||||
|
0x30, 0x66, 0x0C, 0xC1, 0x98, 0x33, 0x06, 0x60, 0xC7, 0xF0, 0x7C, 0x00,
|
||||||
|
0xFB, 0xFF, 0x7D, 0xC3, 0x18, 0xC3, 0x18, 0x36, 0x06, 0xC0, 0x50, 0x0E,
|
||||||
|
0x01, 0xC0, 0x10, 0x00, 0xFB, 0xFE, 0xF6, 0x0D, 0x93, 0x6E, 0xDB, 0xB7,
|
||||||
|
0xAD, 0xEE, 0x7B, 0x8E, 0xE3, 0x18, 0xF3, 0xFC, 0xF7, 0x38, 0xFC, 0x1E,
|
||||||
|
0x03, 0x01, 0xE0, 0xCC, 0x73, 0xBC, 0xFF, 0x3C, 0xF3, 0xFC, 0xF7, 0x38,
|
||||||
|
0xCC, 0x1E, 0x07, 0x80, 0xC0, 0x30, 0x0C, 0x0F, 0xC3, 0xF0, 0xFE, 0xFE,
|
||||||
|
0xC6, 0xCC, 0x18, 0x18, 0x30, 0x63, 0xC3, 0xFF, 0xFF, 0xFF, 0xCC, 0xCC,
|
||||||
|
0xCC, 0xCC, 0xCC, 0xFF, 0x01, 0x03, 0x06, 0x06, 0x0C, 0x0C, 0x18, 0x18,
|
||||||
|
0x30, 0x30, 0x60, 0x60, 0xC0, 0x80, 0xFF, 0x33, 0x33, 0x33, 0x33, 0x33,
|
||||||
|
0xFF, 0x10, 0x71, 0xE3, 0x6C, 0x70, 0x40, 0xFF, 0xFF, 0xFC, 0x88, 0x80,
|
||||||
|
0x7E, 0x3F, 0x8F, 0xCF, 0xEE, 0x36, 0x1B, 0xFE, 0xFF, 0xE0, 0x38, 0x06,
|
||||||
|
0x01, 0xBC, 0x7F, 0x9C, 0x76, 0x0D, 0x83, 0x71, 0xFF, 0xEE, 0xF0, 0x3F,
|
||||||
|
0xBF, 0xF8, 0x78, 0x3C, 0x07, 0x05, 0xFE, 0x7E, 0x03, 0x80, 0xE0, 0x18,
|
||||||
|
0xF6, 0x7F, 0xB8, 0xEC, 0x1B, 0x06, 0xE3, 0x9F, 0xF3, 0xFC, 0x3E, 0x3F,
|
||||||
|
0xB0, 0xFF, 0xFF, 0xFE, 0x01, 0xFE, 0x7E, 0x1F, 0x3F, 0x30, 0x7E, 0x7E,
|
||||||
|
0x30, 0x30, 0x30, 0x30, 0xFE, 0xFE, 0x3F, 0xBF, 0xF9, 0xD8, 0x6C, 0x37,
|
||||||
|
0x39, 0xFC, 0x76, 0x03, 0x01, 0x8F, 0xC7, 0xC0, 0xE0, 0x70, 0x18, 0x0D,
|
||||||
|
0xC7, 0xF3, 0x99, 0x8C, 0xC6, 0x63, 0x7B, 0xFD, 0xE0, 0x18, 0x18, 0x00,
|
||||||
|
0x78, 0x78, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18, 0x60, 0x3F, 0xFC,
|
||||||
|
0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0F, 0xFF, 0x80, 0xE0, 0x70, 0x18, 0x0D,
|
||||||
|
0xE6, 0xF3, 0xE1, 0xE0, 0xF8, 0x6E, 0x73, 0xF9, 0xE0, 0x78, 0x78, 0x18,
|
||||||
|
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0xFD, 0x9F, 0xF9, 0x9B,
|
||||||
|
0x33, 0x66, 0x6C, 0xCD, 0xBD, 0xFF, 0xBF, 0xEE, 0x7F, 0x98, 0xCC, 0x66,
|
||||||
|
0x33, 0x1B, 0xDF, 0xEF, 0x3E, 0x3F, 0xB8, 0xF8, 0x3C, 0x1F, 0x1D, 0xFC,
|
||||||
|
0x7C, 0xEF, 0x1F, 0xF9, 0xC3, 0xB0, 0x36, 0x06, 0xE1, 0xDF, 0xF3, 0x78,
|
||||||
|
0x60, 0x0C, 0x03, 0xE0, 0x7C, 0x00, 0x1E, 0xEF, 0xFF, 0x87, 0x60, 0x6C,
|
||||||
|
0x0D, 0xC3, 0x9F, 0xF0, 0xF6, 0x00, 0xC0, 0x18, 0x0F, 0x81, 0xF0, 0x77,
|
||||||
|
0xBF, 0xCF, 0x06, 0x03, 0x01, 0x83, 0xF9, 0xFC, 0x3F, 0xFF, 0xC3, 0xFC,
|
||||||
|
0x3F, 0xC3, 0xFF, 0xFC, 0x60, 0x60, 0x60, 0xFE, 0xFE, 0x60, 0x60, 0x60,
|
||||||
|
0x61, 0x7F, 0x3E, 0xE7, 0x73, 0x98, 0xCC, 0x66, 0x33, 0x19, 0xFE, 0x7F,
|
||||||
|
0xFB, 0xFF, 0x7C, 0xC6, 0x18, 0xC1, 0xB0, 0x36, 0x03, 0x80, 0x70, 0xF1,
|
||||||
|
0xFE, 0x3D, 0xBB, 0x37, 0x63, 0xF8, 0x77, 0x0E, 0xE1, 0x8C, 0xF7, 0xFB,
|
||||||
|
0xCD, 0x83, 0x83, 0xC3, 0xBB, 0xDF, 0xEF, 0xF3, 0xFC, 0xF6, 0x18, 0xCC,
|
||||||
|
0x33, 0x07, 0x81, 0xE0, 0x30, 0x0C, 0x06, 0x0F, 0xC3, 0xF0, 0xFF, 0xFF,
|
||||||
|
0x30, 0xC3, 0x0C, 0x7F, 0xFF, 0x37, 0x66, 0x66, 0xCC, 0x66, 0x66, 0x73,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xF0, 0xCE, 0x66, 0x66, 0x33, 0x66, 0x66, 0xEC, 0x70,
|
||||||
|
0x7C, 0xF3, 0xC0, 0xC0};
|
||||||
|
|
||||||
|
const GFXglyph FreeMonoBold9pt7bGlyphs[] PROGMEM = {
|
||||||
|
{0, 0, 0, 11, 0, 1}, // 0x20 ' '
|
||||||
|
{0, 3, 11, 11, 4, -10}, // 0x21 '!'
|
||||||
|
{5, 7, 5, 11, 2, -10}, // 0x22 '"'
|
||||||
|
{10, 8, 12, 11, 1, -10}, // 0x23 '#'
|
||||||
|
{22, 7, 14, 11, 2, -11}, // 0x24 '$'
|
||||||
|
{35, 7, 11, 11, 2, -10}, // 0x25 '%'
|
||||||
|
{45, 8, 10, 11, 1, -9}, // 0x26 '&'
|
||||||
|
{55, 3, 5, 11, 4, -10}, // 0x27 '''
|
||||||
|
{57, 4, 14, 11, 5, -10}, // 0x28 '('
|
||||||
|
{64, 4, 14, 11, 2, -10}, // 0x29 ')'
|
||||||
|
{71, 8, 7, 11, 2, -10}, // 0x2A '*'
|
||||||
|
{78, 8, 9, 11, 2, -8}, // 0x2B '+'
|
||||||
|
{87, 3, 5, 11, 3, -1}, // 0x2C ','
|
||||||
|
{89, 9, 2, 11, 1, -5}, // 0x2D '-'
|
||||||
|
{92, 2, 2, 11, 4, -1}, // 0x2E '.'
|
||||||
|
{93, 7, 15, 11, 2, -12}, // 0x2F '/'
|
||||||
|
{107, 7, 12, 11, 2, -11}, // 0x30 '0'
|
||||||
|
{118, 7, 11, 11, 2, -10}, // 0x31 '1'
|
||||||
|
{128, 8, 12, 11, 1, -11}, // 0x32 '2'
|
||||||
|
{140, 8, 12, 11, 2, -11}, // 0x33 '3'
|
||||||
|
{152, 7, 10, 11, 2, -9}, // 0x34 '4'
|
||||||
|
{161, 9, 11, 11, 1, -10}, // 0x35 '5'
|
||||||
|
{174, 8, 12, 11, 2, -11}, // 0x36 '6'
|
||||||
|
{186, 8, 11, 11, 1, -10}, // 0x37 '7'
|
||||||
|
{197, 7, 12, 11, 2, -11}, // 0x38 '8'
|
||||||
|
{208, 8, 12, 11, 2, -11}, // 0x39 '9'
|
||||||
|
{220, 2, 8, 11, 4, -7}, // 0x3A ':'
|
||||||
|
{222, 3, 11, 11, 3, -7}, // 0x3B ';'
|
||||||
|
{227, 9, 8, 11, 1, -8}, // 0x3C '<'
|
||||||
|
{236, 9, 6, 11, 1, -7}, // 0x3D '='
|
||||||
|
{243, 9, 8, 11, 1, -8}, // 0x3E '>'
|
||||||
|
{252, 8, 11, 11, 2, -10}, // 0x3F '?'
|
||||||
|
{263, 9, 15, 11, 1, -11}, // 0x40 '@'
|
||||||
|
{280, 11, 11, 11, 0, -10}, // 0x41 'A'
|
||||||
|
{296, 10, 11, 11, 1, -10}, // 0x42 'B'
|
||||||
|
{310, 9, 11, 11, 1, -10}, // 0x43 'C'
|
||||||
|
{323, 10, 11, 11, 0, -10}, // 0x44 'D'
|
||||||
|
{337, 9, 11, 11, 1, -10}, // 0x45 'E'
|
||||||
|
{350, 9, 11, 11, 1, -10}, // 0x46 'F'
|
||||||
|
{363, 10, 11, 11, 1, -10}, // 0x47 'G'
|
||||||
|
{377, 9, 11, 11, 1, -10}, // 0x48 'H'
|
||||||
|
{390, 6, 11, 11, 3, -10}, // 0x49 'I'
|
||||||
|
{399, 10, 11, 11, 1, -10}, // 0x4A 'J'
|
||||||
|
{413, 10, 11, 11, 1, -10}, // 0x4B 'K'
|
||||||
|
{427, 9, 11, 11, 1, -10}, // 0x4C 'L'
|
||||||
|
{440, 11, 11, 11, 0, -10}, // 0x4D 'M'
|
||||||
|
{456, 11, 11, 11, 0, -10}, // 0x4E 'N'
|
||||||
|
{472, 11, 11, 11, 0, -10}, // 0x4F 'O'
|
||||||
|
{488, 9, 11, 11, 1, -10}, // 0x50 'P'
|
||||||
|
{501, 11, 14, 11, 0, -10}, // 0x51 'Q'
|
||||||
|
{521, 9, 11, 11, 1, -10}, // 0x52 'R'
|
||||||
|
{534, 9, 11, 11, 1, -10}, // 0x53 'S'
|
||||||
|
{547, 9, 11, 11, 1, -10}, // 0x54 'T'
|
||||||
|
{560, 11, 11, 11, 0, -10}, // 0x55 'U'
|
||||||
|
{576, 11, 11, 11, 0, -10}, // 0x56 'V'
|
||||||
|
{592, 10, 11, 11, 0, -10}, // 0x57 'W'
|
||||||
|
{606, 10, 11, 11, 0, -10}, // 0x58 'X'
|
||||||
|
{620, 10, 11, 11, 0, -10}, // 0x59 'Y'
|
||||||
|
{634, 8, 11, 11, 2, -10}, // 0x5A 'Z'
|
||||||
|
{645, 4, 14, 11, 5, -10}, // 0x5B '['
|
||||||
|
{652, 7, 15, 11, 2, -12}, // 0x5C '\'
|
||||||
|
{666, 4, 14, 11, 2, -10}, // 0x5D ']'
|
||||||
|
{673, 7, 6, 11, 2, -11}, // 0x5E '^'
|
||||||
|
{679, 11, 2, 11, 0, 3}, // 0x5F '_'
|
||||||
|
{682, 3, 3, 11, 3, -11}, // 0x60 '`'
|
||||||
|
{684, 9, 8, 11, 1, -7}, // 0x61 'a'
|
||||||
|
{693, 10, 11, 11, 0, -10}, // 0x62 'b'
|
||||||
|
{707, 9, 8, 11, 1, -7}, // 0x63 'c'
|
||||||
|
{716, 10, 11, 11, 1, -10}, // 0x64 'd'
|
||||||
|
{730, 9, 8, 11, 1, -7}, // 0x65 'e'
|
||||||
|
{739, 8, 11, 11, 2, -10}, // 0x66 'f'
|
||||||
|
{750, 9, 12, 11, 1, -7}, // 0x67 'g'
|
||||||
|
{764, 9, 11, 11, 1, -10}, // 0x68 'h'
|
||||||
|
{777, 8, 11, 11, 2, -10}, // 0x69 'i'
|
||||||
|
{788, 6, 15, 11, 2, -10}, // 0x6A 'j'
|
||||||
|
{800, 9, 11, 11, 1, -10}, // 0x6B 'k'
|
||||||
|
{813, 8, 11, 11, 2, -10}, // 0x6C 'l'
|
||||||
|
{824, 11, 8, 11, 0, -7}, // 0x6D 'm'
|
||||||
|
{835, 9, 8, 11, 1, -7}, // 0x6E 'n'
|
||||||
|
{844, 9, 8, 11, 1, -7}, // 0x6F 'o'
|
||||||
|
{853, 11, 12, 11, 0, -7}, // 0x70 'p'
|
||||||
|
{870, 11, 12, 11, 0, -7}, // 0x71 'q'
|
||||||
|
{887, 9, 8, 11, 1, -7}, // 0x72 'r'
|
||||||
|
{896, 8, 8, 11, 2, -7}, // 0x73 's'
|
||||||
|
{904, 8, 11, 11, 1, -10}, // 0x74 't'
|
||||||
|
{915, 9, 8, 11, 1, -7}, // 0x75 'u'
|
||||||
|
{924, 11, 8, 11, 0, -7}, // 0x76 'v'
|
||||||
|
{935, 11, 8, 11, 0, -7}, // 0x77 'w'
|
||||||
|
{946, 9, 8, 11, 1, -7}, // 0x78 'x'
|
||||||
|
{955, 10, 12, 11, 0, -7}, // 0x79 'y'
|
||||||
|
{970, 7, 8, 11, 2, -7}, // 0x7A 'z'
|
||||||
|
{977, 4, 14, 11, 3, -10}, // 0x7B '{'
|
||||||
|
{984, 2, 14, 11, 5, -10}, // 0x7C '|'
|
||||||
|
{988, 4, 14, 11, 4, -10}, // 0x7D '}'
|
||||||
|
{995, 9, 4, 11, 1, -6}}; // 0x7E '~'
|
||||||
|
|
||||||
|
const GFXfont FreeMonoBold9pt7b PROGMEM = {(uint8_t *)FreeMonoBold9pt7bBitmaps,
|
||||||
|
(GFXglyph *)FreeMonoBold9pt7bGlyphs,
|
||||||
|
0x20, 0x7E, 18};
|
||||||
|
|
||||||
|
// Approx. 1672 bytes
|
||||||
271
libraries/Adafruit_GFX_Library/Fonts/FreeMonoBoldOblique12pt7b.h
Normal file
271
libraries/Adafruit_GFX_Library/Fonts/FreeMonoBoldOblique12pt7b.h
Normal file
@@ -0,0 +1,271 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
|
||||||
|
const uint8_t FreeMonoBoldOblique12pt7bBitmaps[] PROGMEM = {
|
||||||
|
0x1C, 0xF3, 0xCE, 0x38, 0xE7, 0x1C, 0x61, 0x86, 0x00, 0x63, 0x8C, 0x00,
|
||||||
|
0xE7, 0xE7, 0xE6, 0xC6, 0xC6, 0xC4, 0x84, 0x03, 0x30, 0x19, 0x81, 0xDC,
|
||||||
|
0x0C, 0xE0, 0x66, 0x1F, 0xFC, 0xFF, 0xE1, 0x98, 0x0C, 0xC0, 0xEE, 0x06,
|
||||||
|
0x70, 0xFF, 0xCF, 0xFE, 0x1D, 0xC0, 0xCC, 0x06, 0x60, 0x77, 0x03, 0x30,
|
||||||
|
0x00, 0x01, 0x00, 0x70, 0x0C, 0x07, 0xF1, 0xFE, 0x71, 0xCC, 0x11, 0x80,
|
||||||
|
0x3F, 0x03, 0xF0, 0x0F, 0x20, 0x6E, 0x0D, 0xC3, 0x3F, 0xE7, 0xF8, 0x1C,
|
||||||
|
0x03, 0x00, 0x60, 0x0C, 0x00, 0x0E, 0x03, 0xE0, 0xC4, 0x10, 0x82, 0x30,
|
||||||
|
0x7C, 0x07, 0x78, 0x7C, 0x7F, 0x19, 0xF0, 0x62, 0x08, 0x41, 0x18, 0x3E,
|
||||||
|
0x03, 0x80, 0x07, 0xC1, 0xF8, 0x62, 0x0C, 0x01, 0x80, 0x38, 0x0F, 0x03,
|
||||||
|
0xF7, 0x6F, 0xD8, 0xF3, 0x1E, 0x7F, 0xE7, 0xF8, 0xFF, 0x6D, 0x20, 0x06,
|
||||||
|
0x1C, 0x70, 0xC3, 0x06, 0x18, 0x30, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30,
|
||||||
|
0x70, 0x60, 0xC1, 0x00, 0x0C, 0x18, 0x38, 0x30, 0x60, 0xC1, 0x83, 0x06,
|
||||||
|
0x0C, 0x30, 0x61, 0xC3, 0x0E, 0x38, 0x61, 0xC2, 0x00, 0x06, 0x00, 0xC0,
|
||||||
|
0x18, 0x3F, 0x7F, 0xFE, 0xFF, 0x07, 0x81, 0xF8, 0x77, 0x0C, 0x60, 0x03,
|
||||||
|
0x00, 0x70, 0x07, 0x00, 0x60, 0x06, 0x0F, 0xFF, 0xFF, 0xF0, 0xE0, 0x0C,
|
||||||
|
0x00, 0xC0, 0x0C, 0x01, 0xC0, 0x18, 0x00, 0x1C, 0xE3, 0x1C, 0x63, 0x08,
|
||||||
|
0x00, 0x7F, 0xFF, 0xFF, 0xC0, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x70, 0x01,
|
||||||
|
0x80, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x0C, 0x00, 0x70, 0x03, 0x80, 0x0C,
|
||||||
|
0x00, 0x70, 0x03, 0x80, 0x0C, 0x00, 0x70, 0x03, 0x80, 0x0C, 0x00, 0x70,
|
||||||
|
0x03, 0x80, 0x0C, 0x00, 0x20, 0x00, 0x07, 0x83, 0xF8, 0xE3, 0x98, 0x37,
|
||||||
|
0x06, 0xC0, 0xD8, 0x1B, 0x03, 0xE0, 0xF8, 0x1B, 0x03, 0x60, 0xEE, 0x38,
|
||||||
|
0xFE, 0x0F, 0x00, 0x03, 0xC1, 0xF0, 0x7E, 0x0C, 0xC0, 0x38, 0x07, 0x00,
|
||||||
|
0xC0, 0x18, 0x07, 0x00, 0xE0, 0x18, 0x03, 0x00, 0x61, 0xFF, 0xFF, 0xF0,
|
||||||
|
0x03, 0xE0, 0x3F, 0x83, 0x8E, 0x38, 0x31, 0x81, 0x80, 0x18, 0x01, 0xC0,
|
||||||
|
0x1C, 0x01, 0xC0, 0x38, 0x03, 0x80, 0x38, 0x47, 0x87, 0x3F, 0xF3, 0xFF,
|
||||||
|
0x80, 0x07, 0xC1, 0xFF, 0x18, 0x70, 0x03, 0x00, 0x30, 0x06, 0x07, 0xC0,
|
||||||
|
0x7C, 0x00, 0xE0, 0x06, 0x00, 0x60, 0x06, 0xC1, 0xCF, 0xF8, 0x7E, 0x00,
|
||||||
|
0x01, 0xE0, 0x3C, 0x0F, 0x03, 0x60, 0xCC, 0x3B, 0x8E, 0x63, 0x8C, 0x61,
|
||||||
|
0x9F, 0xFB, 0xFF, 0x01, 0x81, 0xF8, 0x3F, 0x00, 0x0F, 0xF1, 0xFE, 0x18,
|
||||||
|
0x01, 0x80, 0x18, 0x03, 0xF8, 0x3F, 0xC3, 0x8E, 0x00, 0x60, 0x06, 0x00,
|
||||||
|
0x60, 0x0C, 0xC1, 0xCF, 0xF8, 0x7E, 0x00, 0x03, 0xE1, 0xFC, 0x70, 0x1C,
|
||||||
|
0x03, 0x00, 0xC0, 0x1B, 0xC7, 0xFC, 0xF3, 0x98, 0x33, 0x06, 0x60, 0xCE,
|
||||||
|
0x30, 0xFC, 0x0F, 0x00, 0xFF, 0xFF, 0xFB, 0x07, 0x60, 0xC0, 0x38, 0x06,
|
||||||
|
0x01, 0xC0, 0x30, 0x0E, 0x01, 0x80, 0x70, 0x1C, 0x03, 0x80, 0x60, 0x08,
|
||||||
|
0x00, 0x07, 0x83, 0xF8, 0xE3, 0xB0, 0x36, 0x06, 0xC0, 0xDC, 0x31, 0xFC,
|
||||||
|
0x3F, 0x8C, 0x3B, 0x03, 0x60, 0x6C, 0x39, 0xFE, 0x1F, 0x00, 0x07, 0x81,
|
||||||
|
0xF8, 0x63, 0x98, 0x33, 0x06, 0x60, 0xCE, 0x79, 0xFF, 0x1E, 0xC0, 0x18,
|
||||||
|
0x06, 0x01, 0xC0, 0x71, 0xFC, 0x3E, 0x00, 0x19, 0xCC, 0x00, 0x00, 0x00,
|
||||||
|
0x67, 0x30, 0x06, 0x1C, 0x30, 0x00, 0x00, 0x00, 0x00, 0x38, 0x71, 0xC3,
|
||||||
|
0x0E, 0x18, 0x20, 0x00, 0x00, 0x18, 0x03, 0xC0, 0x7C, 0x1F, 0x03, 0xE0,
|
||||||
|
0x3E, 0x00, 0x7C, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0x80, 0x08, 0x7F, 0xFB,
|
||||||
|
0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFB, 0xFF, 0xC0, 0x30, 0x01,
|
||||||
|
0xE0, 0x07, 0xC0, 0x0F, 0x00, 0x3E, 0x00, 0x7C, 0x1F, 0x03, 0xE0, 0x7C,
|
||||||
|
0x07, 0x80, 0x20, 0x00, 0x3E, 0x7F, 0xB0, 0xF8, 0x30, 0x18, 0x1C, 0x1C,
|
||||||
|
0x3C, 0x38, 0x18, 0x00, 0x06, 0x07, 0x03, 0x00, 0x03, 0xC0, 0x7E, 0x0C,
|
||||||
|
0x71, 0x83, 0x30, 0x33, 0x0F, 0x33, 0xE6, 0x76, 0x6C, 0x66, 0xC6, 0x6C,
|
||||||
|
0x6C, 0xFC, 0xC7, 0xEC, 0x00, 0xC0, 0x0C, 0x00, 0xE3, 0x07, 0xF0, 0x3C,
|
||||||
|
0x00, 0x07, 0xF0, 0x1F, 0xE0, 0x07, 0xC0, 0x1F, 0x80, 0x3B, 0x00, 0xE7,
|
||||||
|
0x01, 0x8E, 0x07, 0x1C, 0x1F, 0xF8, 0x3F, 0xF0, 0xE0, 0x71, 0x80, 0xEF,
|
||||||
|
0xC7, 0xFF, 0x8F, 0xC0, 0x3F, 0xF1, 0xFF, 0xC3, 0x06, 0x38, 0x31, 0xC1,
|
||||||
|
0x8C, 0x18, 0x7F, 0xC3, 0xFE, 0x38, 0x39, 0xC0, 0xCC, 0x06, 0x60, 0x6F,
|
||||||
|
0xFF, 0x7F, 0xE0, 0x03, 0xEC, 0x3F, 0xF1, 0xC3, 0x8C, 0x06, 0x60, 0x19,
|
||||||
|
0x80, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x03, 0x3C, 0x1C,
|
||||||
|
0x7F, 0xE0, 0x7E, 0x00, 0x3F, 0xE1, 0xFF, 0x87, 0x0C, 0x30, 0x31, 0x81,
|
||||||
|
0x8C, 0x0C, 0xE0, 0x67, 0x03, 0x30, 0x31, 0x81, 0x8C, 0x0C, 0xE1, 0xCF,
|
||||||
|
0xFC, 0x7F, 0x80, 0x1F, 0xFE, 0x3F, 0xFC, 0x38, 0x38, 0x70, 0x70, 0xCC,
|
||||||
|
0xC1, 0x98, 0x03, 0xF0, 0x0F, 0xE0, 0x1D, 0x80, 0x31, 0x18, 0x60, 0x70,
|
||||||
|
0xC0, 0xE7, 0xFF, 0x9F, 0xFF, 0x00, 0x1F, 0xFF, 0x1F, 0xFE, 0x0E, 0x06,
|
||||||
|
0x0C, 0x0E, 0x0C, 0xC4, 0x0C, 0xC0, 0x1F, 0xC0, 0x1F, 0xC0, 0x19, 0xC0,
|
||||||
|
0x19, 0x80, 0x18, 0x00, 0x38, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x07, 0xEC,
|
||||||
|
0x7F, 0xF3, 0x83, 0x9C, 0x06, 0x60, 0x19, 0x80, 0x0C, 0x00, 0x30, 0xFE,
|
||||||
|
0xC3, 0xFB, 0x01, 0xCC, 0x07, 0x3C, 0x38, 0x7F, 0xE0, 0x7E, 0x00, 0x0F,
|
||||||
|
0xBF, 0x1F, 0xBE, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x1C, 0x0C, 0x1C, 0x1F,
|
||||||
|
0xF8, 0x1F, 0xF8, 0x18, 0x18, 0x18, 0x38, 0x18, 0x38, 0x38, 0x30, 0x7C,
|
||||||
|
0xFC, 0xFC, 0xF8, 0x3F, 0xF3, 0xFF, 0x03, 0x00, 0x70, 0x07, 0x00, 0x60,
|
||||||
|
0x06, 0x00, 0x60, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xC0, 0xFF, 0xCF, 0xFC,
|
||||||
|
0x03, 0xFF, 0x03, 0xFF, 0x00, 0x38, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30,
|
||||||
|
0x00, 0x70, 0x20, 0x70, 0x60, 0x60, 0x60, 0x60, 0x60, 0xE0, 0xE1, 0xC0,
|
||||||
|
0xFF, 0x80, 0x3F, 0x00, 0x1F, 0x9F, 0x1F, 0x9E, 0x0E, 0x38, 0x0C, 0x70,
|
||||||
|
0x0C, 0xE0, 0x0F, 0xC0, 0x1F, 0xC0, 0x1F, 0xE0, 0x1C, 0xE0, 0x18, 0x60,
|
||||||
|
0x18, 0x70, 0x38, 0x70, 0xFE, 0x3C, 0xFC, 0x3C, 0x3F, 0xC1, 0xFE, 0x01,
|
||||||
|
0x80, 0x1C, 0x00, 0xE0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x1C, 0x18, 0xE0,
|
||||||
|
0xC6, 0x06, 0x30, 0x7F, 0xFF, 0xFF, 0xF8, 0x1E, 0x07, 0x87, 0x81, 0xE0,
|
||||||
|
0xF0, 0xF0, 0x7C, 0x7C, 0x1F, 0x1F, 0x06, 0xCF, 0x81, 0xBF, 0x60, 0xEF,
|
||||||
|
0x98, 0x3B, 0xEE, 0x0C, 0x73, 0x83, 0x1C, 0xC0, 0xC0, 0x30, 0xFC, 0x7E,
|
||||||
|
0x3F, 0x1F, 0x80, 0x3C, 0x3F, 0x3E, 0x3F, 0x1E, 0x0C, 0x1F, 0x1C, 0x1F,
|
||||||
|
0x1C, 0x1B, 0x98, 0x3B, 0x98, 0x3B, 0x98, 0x31, 0xF8, 0x31, 0xF8, 0x30,
|
||||||
|
0xF0, 0x70, 0xF0, 0xFC, 0x70, 0xF8, 0x70, 0x03, 0xE0, 0x3F, 0xE1, 0xC3,
|
||||||
|
0x8C, 0x07, 0x60, 0x0D, 0x80, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x1B, 0x00,
|
||||||
|
0x6E, 0x03, 0x1C, 0x38, 0x7F, 0xC0, 0x7C, 0x00, 0x3F, 0xE1, 0xFF, 0x83,
|
||||||
|
0x0E, 0x38, 0x31, 0xC1, 0x8C, 0x0C, 0x60, 0xC3, 0xFC, 0x3F, 0xC1, 0xC0,
|
||||||
|
0x0C, 0x00, 0x60, 0x0F, 0xF0, 0x7F, 0x80, 0x03, 0xE0, 0x3F, 0xE1, 0xC3,
|
||||||
|
0x8C, 0x07, 0x60, 0x0D, 0x80, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x1B, 0x00,
|
||||||
|
0x6E, 0x03, 0x1C, 0x38, 0x7F, 0xC0, 0xFC, 0x03, 0x02, 0x1F, 0xFC, 0xFF,
|
||||||
|
0xE0, 0x1F, 0xF0, 0x3F, 0xF0, 0x38, 0x70, 0x60, 0x60, 0xC0, 0xC1, 0x87,
|
||||||
|
0x07, 0xFC, 0x0F, 0xF0, 0x18, 0xF0, 0x30, 0xE0, 0x60, 0xC1, 0xC1, 0xCF,
|
||||||
|
0xE1, 0xFF, 0xC3, 0xC0, 0x0F, 0xB1, 0xFF, 0x30, 0xE6, 0x06, 0x60, 0x67,
|
||||||
|
0x80, 0x7F, 0x01, 0xFC, 0x01, 0xC4, 0x0C, 0xC0, 0xCE, 0x18, 0xFF, 0x8B,
|
||||||
|
0xE0, 0x7F, 0xFB, 0xFF, 0xD9, 0xCF, 0xCE, 0x7C, 0x63, 0x63, 0x18, 0x18,
|
||||||
|
0x01, 0xC0, 0x0E, 0x00, 0x60, 0x03, 0x00, 0x18, 0x0F, 0xF8, 0x7F, 0xC0,
|
||||||
|
0x7E, 0xFF, 0xF3, 0xF3, 0x03, 0x1C, 0x0C, 0x60, 0x31, 0x81, 0xC6, 0x06,
|
||||||
|
0x38, 0x18, 0xE0, 0x63, 0x03, 0x8C, 0x0C, 0x30, 0x70, 0x7F, 0x80, 0xF8,
|
||||||
|
0x00, 0xFC, 0x7F, 0xF8, 0xFD, 0xC0, 0x61, 0x81, 0xC3, 0x87, 0x07, 0x0C,
|
||||||
|
0x0E, 0x38, 0x0C, 0x60, 0x19, 0xC0, 0x3F, 0x00, 0x7C, 0x00, 0xF8, 0x00,
|
||||||
|
0xE0, 0x01, 0x80, 0x00, 0x7E, 0x7E, 0xFC, 0xFD, 0xC0, 0x73, 0x9C, 0xE7,
|
||||||
|
0x79, 0x8E, 0xF7, 0x1B, 0xEE, 0x36, 0xD8, 0x7D, 0xF0, 0xF3, 0xE1, 0xE7,
|
||||||
|
0x83, 0x8F, 0x07, 0x1E, 0x1C, 0x38, 0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x0E,
|
||||||
|
0x1C, 0x07, 0x38, 0x07, 0x70, 0x03, 0xE0, 0x03, 0xC0, 0x03, 0xC0, 0x07,
|
||||||
|
0xE0, 0x0E, 0xE0, 0x1C, 0x70, 0x38, 0x70, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8,
|
||||||
|
0xFF, 0xC7, 0xCC, 0x38, 0x73, 0x83, 0x9C, 0x0F, 0xC0, 0x7C, 0x01, 0xC0,
|
||||||
|
0x0C, 0x00, 0x60, 0x03, 0x00, 0x38, 0x0F, 0xF8, 0x7F, 0x80, 0x0F, 0xF8,
|
||||||
|
0x7F, 0xE1, 0xC7, 0x86, 0x1C, 0x18, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0,
|
||||||
|
0x0E, 0x00, 0x70, 0xC3, 0x83, 0x1C, 0x1C, 0x7F, 0xF3, 0xFF, 0x80, 0x0F,
|
||||||
|
0x87, 0xC3, 0x03, 0x81, 0xC0, 0xC0, 0x60, 0x30, 0x38, 0x1C, 0x0C, 0x06,
|
||||||
|
0x03, 0x03, 0x81, 0xC0, 0xC0, 0x60, 0x3E, 0x3F, 0x00, 0x41, 0xC3, 0x83,
|
||||||
|
0x07, 0x0E, 0x1C, 0x18, 0x38, 0x70, 0xE0, 0xC1, 0xC3, 0x83, 0x06, 0x0E,
|
||||||
|
0x1C, 0x18, 0x20, 0x1F, 0x0F, 0x80, 0xC0, 0xE0, 0x70, 0x30, 0x18, 0x0C,
|
||||||
|
0x0E, 0x07, 0x03, 0x01, 0x80, 0xC0, 0xE0, 0x70, 0x30, 0x18, 0x7C, 0x3E,
|
||||||
|
0x00, 0x02, 0x01, 0x80, 0xF0, 0x7E, 0x3B, 0x9C, 0x7E, 0x1F, 0x03, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFC, 0xCE, 0x73, 0x1F, 0xC3, 0xFE, 0x00, 0x60, 0x06, 0x0F,
|
||||||
|
0xE3, 0xFE, 0x70, 0xCC, 0x0C, 0xC3, 0xCF, 0xFF, 0x7F, 0xF0, 0x1E, 0x00,
|
||||||
|
0x3C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xDF, 0x81, 0xFF, 0x83, 0xC3, 0x8F,
|
||||||
|
0x03, 0x1C, 0x06, 0x38, 0x0C, 0x70, 0x18, 0xE0, 0x63, 0xE1, 0x9F, 0xFE,
|
||||||
|
0x3D, 0xF8, 0x00, 0x0F, 0xF3, 0xFF, 0x30, 0x76, 0x07, 0xE0, 0x6C, 0x00,
|
||||||
|
0xC0, 0x0C, 0x00, 0xE0, 0x67, 0xFE, 0x3F, 0x80, 0x00, 0x3C, 0x00, 0xF0,
|
||||||
|
0x01, 0xC0, 0x06, 0x07, 0xD8, 0x7F, 0xE3, 0x0F, 0x98, 0x1E, 0x60, 0x73,
|
||||||
|
0x01, 0xCC, 0x07, 0x30, 0x3C, 0xE1, 0xF1, 0xFF, 0xE3, 0xF7, 0x80, 0x0F,
|
||||||
|
0xC1, 0xFE, 0x78, 0x76, 0x03, 0xFF, 0xFF, 0xFF, 0xC0, 0x0C, 0x00, 0xE0,
|
||||||
|
0xE7, 0xFE, 0x1F, 0x80, 0x00, 0xFC, 0x07, 0xF8, 0x0C, 0x00, 0x38, 0x01,
|
||||||
|
0xFF, 0x07, 0xFE, 0x01, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x18, 0x00, 0x30,
|
||||||
|
0x00, 0x60, 0x01, 0xC0, 0x1F, 0xF8, 0x3F, 0xF0, 0x00, 0x0F, 0xBC, 0x7F,
|
||||||
|
0xF3, 0x0F, 0x18, 0x1C, 0xC0, 0x73, 0x01, 0x8C, 0x0E, 0x30, 0x38, 0xE3,
|
||||||
|
0xE1, 0xFF, 0x83, 0xEC, 0x00, 0x30, 0x01, 0xC0, 0x06, 0x07, 0xF0, 0x1F,
|
||||||
|
0x80, 0x1E, 0x01, 0xF0, 0x03, 0x00, 0x18, 0x00, 0xDE, 0x0F, 0xF8, 0x78,
|
||||||
|
0xC3, 0x86, 0x18, 0x30, 0xC1, 0x8E, 0x1C, 0x70, 0xE3, 0x06, 0x7E, 0xFF,
|
||||||
|
0xE7, 0xE0, 0x03, 0x80, 0x70, 0x00, 0x0F, 0xC1, 0xF0, 0x06, 0x00, 0xC0,
|
||||||
|
0x38, 0x07, 0x00, 0xC0, 0x18, 0x03, 0x0F, 0xFF, 0xFF, 0xC0, 0x00, 0x70,
|
||||||
|
0x07, 0x00, 0x00, 0xFF, 0x1F, 0xF0, 0x07, 0x00, 0x70, 0x06, 0x00, 0x60,
|
||||||
|
0x06, 0x00, 0xE0, 0x0E, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x1C, 0x03, 0x87,
|
||||||
|
0xF0, 0xFE, 0x00, 0x1E, 0x00, 0x78, 0x00, 0xE0, 0x03, 0x80, 0x0C, 0xFC,
|
||||||
|
0x33, 0xE0, 0xDE, 0x07, 0xE0, 0x1F, 0x00, 0x7C, 0x01, 0xF8, 0x06, 0xF0,
|
||||||
|
0x39, 0xC3, 0xE7, 0xEF, 0x1F, 0x80, 0x0F, 0x81, 0xF0, 0x06, 0x01, 0xC0,
|
||||||
|
0x38, 0x06, 0x00, 0xC0, 0x18, 0x07, 0x00, 0xE0, 0x18, 0x03, 0x00, 0x61,
|
||||||
|
0xFF, 0xFF, 0xF8, 0x3F, 0xBC, 0x7F, 0xFC, 0xF3, 0x98, 0xC6, 0x33, 0x9C,
|
||||||
|
0xE7, 0x39, 0xCC, 0x63, 0x18, 0xC6, 0x31, 0x8D, 0xF7, 0xBF, 0xEF, 0x78,
|
||||||
|
0x3D, 0xE1, 0xFF, 0x8F, 0x8C, 0x38, 0x61, 0x83, 0x0C, 0x18, 0xE1, 0xC7,
|
||||||
|
0x0E, 0x30, 0x67, 0xEF, 0xFE, 0x7E, 0x07, 0xC1, 0xFE, 0x38, 0x76, 0x03,
|
||||||
|
0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x06, 0xE1, 0xC7, 0xF8, 0x3E, 0x00, 0x1E,
|
||||||
|
0xFC, 0x1F, 0xFE, 0x0F, 0x87, 0x0F, 0x03, 0x0E, 0x03, 0x0E, 0x03, 0x0E,
|
||||||
|
0x07, 0x0E, 0x06, 0x1F, 0x0C, 0x1F, 0xF8, 0x19, 0xF0, 0x18, 0x00, 0x18,
|
||||||
|
0x00, 0x38, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0x0F, 0xDE, 0x3F, 0xFC, 0xC3,
|
||||||
|
0xE3, 0x03, 0x84, 0x07, 0x18, 0x0E, 0x30, 0x1C, 0x60, 0x78, 0xE1, 0xE0,
|
||||||
|
0xFF, 0xC0, 0xF9, 0x80, 0x03, 0x00, 0x0E, 0x00, 0x1C, 0x01, 0xFC, 0x03,
|
||||||
|
0xF8, 0x1E, 0x78, 0x7F, 0xF0, 0x7C, 0xC3, 0xC0, 0x0E, 0x00, 0x30, 0x00,
|
||||||
|
0xC0, 0x03, 0x00, 0x1C, 0x03, 0xFF, 0x0F, 0xFC, 0x00, 0x07, 0xF1, 0xFF,
|
||||||
|
0x30, 0x73, 0x86, 0x3F, 0x81, 0xFE, 0x03, 0xE6, 0x06, 0xE0, 0xEF, 0xFC,
|
||||||
|
0xFF, 0x00, 0x0C, 0x07, 0x01, 0x83, 0xFF, 0xFF, 0xCE, 0x03, 0x00, 0xC0,
|
||||||
|
0x30, 0x1C, 0x07, 0x01, 0x83, 0x7F, 0xCF, 0xC0, 0xF0, 0xFF, 0x1F, 0x60,
|
||||||
|
0x76, 0x07, 0x60, 0x76, 0x06, 0x60, 0x66, 0x0E, 0x61, 0xE7, 0xFF, 0x3E,
|
||||||
|
0xF0, 0x7E, 0x7E, 0xFC, 0xFC, 0xE0, 0xC0, 0xC3, 0x81, 0x86, 0x03, 0x98,
|
||||||
|
0x07, 0x70, 0x06, 0xC0, 0x0F, 0x80, 0x1E, 0x00, 0x38, 0x00, 0xF8, 0x7F,
|
||||||
|
0xE3, 0xE6, 0x63, 0x1B, 0xDC, 0x6F, 0x61, 0xFF, 0x87, 0xFC, 0x1E, 0xF0,
|
||||||
|
0x73, 0x81, 0xCE, 0x06, 0x38, 0x00, 0x3E, 0x7C, 0xF9, 0xF1, 0xE7, 0x03,
|
||||||
|
0xF8, 0x07, 0xC0, 0x1F, 0x01, 0xFC, 0x0F, 0x38, 0x78, 0xFB, 0xF7, 0xEF,
|
||||||
|
0x9F, 0x80, 0x1F, 0x1F, 0x3E, 0x1F, 0x1C, 0x1C, 0x0C, 0x18, 0x0E, 0x38,
|
||||||
|
0x0E, 0x70, 0x06, 0x60, 0x07, 0xE0, 0x07, 0xC0, 0x07, 0xC0, 0x03, 0x80,
|
||||||
|
0x07, 0x00, 0x07, 0x00, 0x0E, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x1F, 0xF1,
|
||||||
|
0xFF, 0x38, 0xE3, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC6, 0x38, 0x67,
|
||||||
|
0xFE, 0x7F, 0xE0, 0x01, 0xC0, 0xF0, 0x70, 0x18, 0x06, 0x03, 0x80, 0xE0,
|
||||||
|
0x30, 0x1C, 0x3E, 0x0F, 0x00, 0x60, 0x18, 0x06, 0x03, 0x80, 0xC0, 0x30,
|
||||||
|
0x0F, 0x01, 0xC0, 0x0C, 0x71, 0xC7, 0x18, 0x63, 0x8E, 0x30, 0xC3, 0x1C,
|
||||||
|
0x71, 0x86, 0x38, 0xE3, 0x04, 0x00, 0x0E, 0x07, 0x80, 0xC0, 0x60, 0x70,
|
||||||
|
0x30, 0x18, 0x0C, 0x06, 0x01, 0xC1, 0xE1, 0xC0, 0xC0, 0xE0, 0x70, 0x30,
|
||||||
|
0x38, 0x78, 0x38, 0x00, 0x3C, 0x27, 0xE6, 0xEF, 0xCC, 0x38};
|
||||||
|
|
||||||
|
const GFXglyph FreeMonoBoldOblique12pt7bGlyphs[] PROGMEM = {
|
||||||
|
{0, 0, 0, 14, 0, 1}, // 0x20 ' '
|
||||||
|
{0, 6, 15, 14, 6, -14}, // 0x21 '!'
|
||||||
|
{12, 8, 7, 14, 6, -13}, // 0x22 '"'
|
||||||
|
{19, 13, 18, 14, 2, -15}, // 0x23 '#'
|
||||||
|
{49, 11, 20, 14, 3, -16}, // 0x24 '$'
|
||||||
|
{77, 11, 15, 14, 3, -14}, // 0x25 '%'
|
||||||
|
{98, 11, 13, 14, 2, -12}, // 0x26 '&'
|
||||||
|
{116, 3, 7, 14, 8, -13}, // 0x27 '''
|
||||||
|
{119, 7, 19, 14, 7, -14}, // 0x28 '('
|
||||||
|
{136, 7, 19, 14, 2, -14}, // 0x29 ')'
|
||||||
|
{153, 11, 10, 14, 4, -14}, // 0x2A '*'
|
||||||
|
{167, 12, 13, 14, 3, -12}, // 0x2B '+'
|
||||||
|
{187, 6, 7, 14, 3, -2}, // 0x2C ','
|
||||||
|
{193, 13, 2, 14, 2, -7}, // 0x2D '-'
|
||||||
|
{197, 3, 3, 14, 6, -2}, // 0x2E '.'
|
||||||
|
{199, 14, 20, 14, 2, -16}, // 0x2F '/'
|
||||||
|
{234, 11, 15, 14, 3, -14}, // 0x30 '0'
|
||||||
|
{255, 11, 15, 14, 2, -14}, // 0x31 '1'
|
||||||
|
{276, 13, 15, 14, 1, -14}, // 0x32 '2'
|
||||||
|
{301, 12, 15, 14, 2, -14}, // 0x33 '3'
|
||||||
|
{324, 11, 14, 14, 3, -13}, // 0x34 '4'
|
||||||
|
{344, 12, 15, 14, 2, -14}, // 0x35 '5'
|
||||||
|
{367, 11, 15, 14, 4, -14}, // 0x36 '6'
|
||||||
|
{388, 11, 15, 14, 4, -14}, // 0x37 '7'
|
||||||
|
{409, 11, 15, 14, 3, -14}, // 0x38 '8'
|
||||||
|
{430, 11, 15, 14, 3, -14}, // 0x39 '9'
|
||||||
|
{451, 5, 11, 14, 5, -10}, // 0x3A ':'
|
||||||
|
{458, 7, 15, 14, 3, -10}, // 0x3B ';'
|
||||||
|
{472, 13, 11, 14, 2, -11}, // 0x3C '<'
|
||||||
|
{490, 13, 7, 14, 2, -9}, // 0x3D '='
|
||||||
|
{502, 13, 11, 14, 2, -11}, // 0x3E '>'
|
||||||
|
{520, 9, 14, 14, 5, -13}, // 0x3F '?'
|
||||||
|
{536, 12, 19, 14, 2, -14}, // 0x40 '@'
|
||||||
|
{565, 15, 14, 14, 0, -13}, // 0x41 'A'
|
||||||
|
{592, 13, 14, 14, 1, -13}, // 0x42 'B'
|
||||||
|
{615, 14, 14, 14, 2, -13}, // 0x43 'C'
|
||||||
|
{640, 13, 14, 14, 1, -13}, // 0x44 'D'
|
||||||
|
{663, 15, 14, 14, 0, -13}, // 0x45 'E'
|
||||||
|
{690, 16, 14, 14, 0, -13}, // 0x46 'F'
|
||||||
|
{718, 14, 14, 14, 1, -13}, // 0x47 'G'
|
||||||
|
{743, 16, 14, 14, 0, -13}, // 0x48 'H'
|
||||||
|
{771, 12, 14, 14, 2, -13}, // 0x49 'I'
|
||||||
|
{792, 16, 14, 14, 0, -13}, // 0x4A 'J'
|
||||||
|
{820, 16, 14, 14, 0, -13}, // 0x4B 'K'
|
||||||
|
{848, 13, 14, 14, 1, -13}, // 0x4C 'L'
|
||||||
|
{871, 18, 14, 14, 0, -13}, // 0x4D 'M'
|
||||||
|
{903, 16, 14, 14, 1, -13}, // 0x4E 'N'
|
||||||
|
{931, 14, 14, 14, 1, -13}, // 0x4F 'O'
|
||||||
|
{956, 13, 14, 14, 1, -13}, // 0x50 'P'
|
||||||
|
{979, 14, 17, 14, 1, -13}, // 0x51 'Q'
|
||||||
|
{1009, 15, 14, 14, 0, -13}, // 0x52 'R'
|
||||||
|
{1036, 12, 14, 14, 3, -13}, // 0x53 'S'
|
||||||
|
{1057, 13, 14, 14, 2, -13}, // 0x54 'T'
|
||||||
|
{1080, 14, 14, 14, 2, -13}, // 0x55 'U'
|
||||||
|
{1105, 15, 14, 14, 1, -13}, // 0x56 'V'
|
||||||
|
{1132, 15, 14, 14, 1, -13}, // 0x57 'W'
|
||||||
|
{1159, 16, 14, 14, 0, -13}, // 0x58 'X'
|
||||||
|
{1187, 13, 14, 14, 2, -13}, // 0x59 'Y'
|
||||||
|
{1210, 14, 14, 14, 1, -13}, // 0x5A 'Z'
|
||||||
|
{1235, 9, 19, 14, 5, -14}, // 0x5B '['
|
||||||
|
{1257, 7, 20, 14, 5, -16}, // 0x5C '\'
|
||||||
|
{1275, 9, 19, 14, 3, -14}, // 0x5D ']'
|
||||||
|
{1297, 10, 8, 14, 4, -15}, // 0x5E '^'
|
||||||
|
{1307, 15, 2, 14, -1, 4}, // 0x5F '_'
|
||||||
|
{1311, 4, 4, 14, 7, -15}, // 0x60 '`'
|
||||||
|
{1313, 12, 11, 14, 2, -10}, // 0x61 'a'
|
||||||
|
{1330, 15, 15, 14, -1, -14}, // 0x62 'b'
|
||||||
|
{1359, 12, 11, 14, 2, -10}, // 0x63 'c'
|
||||||
|
{1376, 14, 15, 14, 2, -14}, // 0x64 'd'
|
||||||
|
{1403, 12, 11, 14, 2, -10}, // 0x65 'e'
|
||||||
|
{1420, 15, 15, 14, 2, -14}, // 0x66 'f'
|
||||||
|
{1449, 14, 16, 14, 2, -10}, // 0x67 'g'
|
||||||
|
{1477, 13, 15, 14, 1, -14}, // 0x68 'h'
|
||||||
|
{1502, 11, 14, 14, 2, -13}, // 0x69 'i'
|
||||||
|
{1522, 12, 19, 14, 1, -13}, // 0x6A 'j'
|
||||||
|
{1551, 14, 15, 14, 1, -14}, // 0x6B 'k'
|
||||||
|
{1578, 11, 15, 14, 2, -14}, // 0x6C 'l'
|
||||||
|
{1599, 15, 11, 14, 0, -10}, // 0x6D 'm'
|
||||||
|
{1620, 13, 11, 14, 1, -10}, // 0x6E 'n'
|
||||||
|
{1638, 12, 11, 14, 2, -10}, // 0x6F 'o'
|
||||||
|
{1655, 16, 16, 14, -1, -10}, // 0x70 'p'
|
||||||
|
{1687, 15, 16, 14, 1, -10}, // 0x71 'q'
|
||||||
|
{1717, 14, 11, 14, 1, -10}, // 0x72 'r'
|
||||||
|
{1737, 12, 11, 14, 2, -10}, // 0x73 's'
|
||||||
|
{1754, 10, 14, 14, 2, -13}, // 0x74 't'
|
||||||
|
{1772, 12, 11, 14, 2, -10}, // 0x75 'u'
|
||||||
|
{1789, 15, 11, 14, 1, -10}, // 0x76 'v'
|
||||||
|
{1810, 14, 11, 14, 2, -10}, // 0x77 'w'
|
||||||
|
{1830, 14, 11, 14, 1, -10}, // 0x78 'x'
|
||||||
|
{1850, 16, 16, 14, 0, -10}, // 0x79 'y'
|
||||||
|
{1882, 12, 11, 14, 2, -10}, // 0x7A 'z'
|
||||||
|
{1899, 10, 19, 14, 4, -14}, // 0x7B '{'
|
||||||
|
{1923, 6, 19, 14, 5, -14}, // 0x7C '|'
|
||||||
|
{1938, 9, 19, 14, 3, -14}, // 0x7D '}'
|
||||||
|
{1960, 12, 4, 14, 3, -7}}; // 0x7E '~'
|
||||||
|
|
||||||
|
const GFXfont FreeMonoBoldOblique12pt7b PROGMEM = {
|
||||||
|
(uint8_t *)FreeMonoBoldOblique12pt7bBitmaps,
|
||||||
|
(GFXglyph *)FreeMonoBoldOblique12pt7bGlyphs, 0x20, 0x7E, 24};
|
||||||
|
|
||||||
|
// Approx. 2638 bytes
|
||||||
462
libraries/Adafruit_GFX_Library/Fonts/FreeMonoBoldOblique18pt7b.h
Normal file
462
libraries/Adafruit_GFX_Library/Fonts/FreeMonoBoldOblique18pt7b.h
Normal file
@@ -0,0 +1,462 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
|
||||||
|
const uint8_t FreeMonoBoldOblique18pt7bBitmaps[] PROGMEM = {
|
||||||
|
0x0F, 0x07, 0xC7, 0xE3, 0xF1, 0xF0, 0xF8, 0xFC, 0x7C, 0x3E, 0x1F, 0x0F,
|
||||||
|
0x07, 0x87, 0xC3, 0xC1, 0xE0, 0x60, 0x00, 0x38, 0x3E, 0x1F, 0x0F, 0x83,
|
||||||
|
0x80, 0xF8, 0xFF, 0x0E, 0xF1, 0xEF, 0x1E, 0xE1, 0xCE, 0x1C, 0xC1, 0xCC,
|
||||||
|
0x18, 0xC1, 0x88, 0x18, 0x00, 0xE3, 0x80, 0x79, 0xE0, 0x1C, 0x70, 0x07,
|
||||||
|
0x1C, 0x03, 0xCF, 0x00, 0xF3, 0xC0, 0x38, 0xE0, 0x7F, 0xFF, 0x3F, 0xFF,
|
||||||
|
0xCF, 0xFF, 0xF3, 0xFF, 0xF8, 0x3C, 0xF0, 0x0F, 0x3C, 0x03, 0x8E, 0x0F,
|
||||||
|
0xFF, 0xE3, 0xFF, 0xFC, 0xFF, 0xFF, 0x3F, 0xFF, 0x83, 0xCF, 0x00, 0xF3,
|
||||||
|
0xC0, 0x38, 0xE0, 0x1E, 0x78, 0x07, 0x9E, 0x01, 0xC7, 0x00, 0x71, 0xC0,
|
||||||
|
0x00, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x07, 0x80, 0x03, 0xF0, 0x03, 0xFF,
|
||||||
|
0x81, 0xFF, 0xF0, 0xFF, 0xF8, 0x3C, 0x1E, 0x1E, 0x07, 0x87, 0x80, 0x01,
|
||||||
|
0xF0, 0x00, 0x7F, 0xC0, 0x0F, 0xFC, 0x01, 0xFF, 0x80, 0x07, 0xF0, 0x00,
|
||||||
|
0x3C, 0x70, 0x0F, 0x3C, 0x03, 0xCF, 0x83, 0xE3, 0xFF, 0xF8, 0xFF, 0xFC,
|
||||||
|
0x3F, 0xFE, 0x0C, 0xFE, 0x00, 0x1C, 0x00, 0x07, 0x00, 0x03, 0xC0, 0x00,
|
||||||
|
0xF0, 0x00, 0x18, 0x00, 0x03, 0xC0, 0x0F, 0xE0, 0x1C, 0x70, 0x30, 0x30,
|
||||||
|
0x30, 0x30, 0x30, 0x70, 0x38, 0xE0, 0x1F, 0xC3, 0x0F, 0x1F, 0x01, 0xFC,
|
||||||
|
0x0F, 0xE0, 0x7F, 0x00, 0xF8, 0xF0, 0x83, 0xF8, 0x07, 0x1C, 0x0E, 0x0C,
|
||||||
|
0x0C, 0x0C, 0x0C, 0x1C, 0x0E, 0x38, 0x07, 0xF0, 0x03, 0xC0, 0x00, 0x7A,
|
||||||
|
0x01, 0xFF, 0x03, 0xFF, 0x07, 0xFE, 0x0F, 0x9C, 0x0F, 0x00, 0x0F, 0x00,
|
||||||
|
0x0F, 0x00, 0x07, 0x80, 0x1F, 0x80, 0x3F, 0xC0, 0x7F, 0xCF, 0x79, 0xFF,
|
||||||
|
0xF1, 0xFE, 0xF1, 0xFC, 0xF0, 0xF8, 0xFF, 0xFE, 0xFF, 0xFE, 0x7F, 0xFE,
|
||||||
|
0x1F, 0xBC, 0x7B, 0xFD, 0xEF, 0x73, 0x9C, 0xC6, 0x00, 0x01, 0xC0, 0xF0,
|
||||||
|
0x3C, 0x1E, 0x0F, 0x03, 0xC1, 0xE0, 0x70, 0x3C, 0x0F, 0x07, 0x81, 0xE0,
|
||||||
|
0x78, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3E,
|
||||||
|
0x07, 0x81, 0xE0, 0x7C, 0x1F, 0x03, 0x80, 0x07, 0x03, 0xC0, 0xF8, 0x3E,
|
||||||
|
0x07, 0x81, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0,
|
||||||
|
0xF0, 0x78, 0x1E, 0x07, 0x81, 0xC0, 0xF0, 0x3C, 0x1E, 0x07, 0x83, 0xC1,
|
||||||
|
0xE0, 0x78, 0x3C, 0x0E, 0x00, 0x00, 0xC0, 0x03, 0xC0, 0x07, 0x00, 0x0E,
|
||||||
|
0x02, 0x3C, 0x0F, 0xFF, 0xFF, 0xFF, 0xBF, 0xFE, 0x1F, 0xF0, 0x1F, 0x80,
|
||||||
|
0x7F, 0x81, 0xEF, 0x07, 0x8F, 0x0F, 0x1E, 0x08, 0x10, 0x00, 0x00, 0x70,
|
||||||
|
0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xE0, 0x00, 0x38, 0x00,
|
||||||
|
0x1E, 0x03, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x0F,
|
||||||
|
0x00, 0x03, 0xC0, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x07, 0x80,
|
||||||
|
0x01, 0xC0, 0x00, 0x70, 0x00, 0x0F, 0x87, 0x87, 0x83, 0x83, 0xC1, 0xC1,
|
||||||
|
0xC0, 0xC0, 0xE0, 0x60, 0x00, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFE, 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x38, 0x00, 0x03, 0xC0,
|
||||||
|
0x00, 0x1C, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x0F,
|
||||||
|
0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00,
|
||||||
|
0x78, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00,
|
||||||
|
0x01, 0xE0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0xF0,
|
||||||
|
0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, 0x78, 0x00, 0x03,
|
||||||
|
0xC0, 0x00, 0x3C, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0xFC, 0x01, 0xFF,
|
||||||
|
0x01, 0xFF, 0xC1, 0xFF, 0xE1, 0xF1, 0xF9, 0xE0, 0x7C, 0xF0, 0x1E, 0xF0,
|
||||||
|
0x0F, 0x78, 0x07, 0xB8, 0x03, 0x9C, 0x03, 0xDE, 0x01, 0xCF, 0x00, 0xE7,
|
||||||
|
0x00, 0x73, 0xC0, 0x79, 0xE0, 0x3C, 0xF0, 0x1C, 0x78, 0x1E, 0x3E, 0x1E,
|
||||||
|
0x0F, 0xFF, 0x07, 0xFF, 0x01, 0xFF, 0x00, 0x7E, 0x00, 0x00, 0x7C, 0x03,
|
||||||
|
0xF8, 0x0F, 0xE0, 0x7F, 0xC0, 0xF7, 0x81, 0x8F, 0x00, 0x1C, 0x00, 0x38,
|
||||||
|
0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x0E, 0x00, 0x3C, 0x00,
|
||||||
|
0x78, 0x00, 0xF0, 0x01, 0xC0, 0x03, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xEF, 0xFF, 0xC0, 0x00, 0x1F, 0x00, 0x07, 0xFC, 0x00, 0xFF, 0xE0, 0x1F,
|
||||||
|
0xFF, 0x03, 0xC1, 0xF0, 0x78, 0x0F, 0x07, 0x80, 0xF0, 0x70, 0x0F, 0x00,
|
||||||
|
0x01, 0xE0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x3F, 0x00,
|
||||||
|
0x07, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00,
|
||||||
|
0x3F, 0x03, 0x87, 0xFF, 0xF8, 0x7F, 0xFF, 0x87, 0xFF, 0xF8, 0xFF, 0xFF,
|
||||||
|
0x00, 0x00, 0xFE, 0x00, 0xFF, 0xC0, 0x7F, 0xF8, 0x3F, 0xFF, 0x0E, 0x07,
|
||||||
|
0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, 0x00, 0x07, 0x80, 0x1F, 0xC0,
|
||||||
|
0x0F, 0xE0, 0x03, 0xF0, 0x00, 0xFF, 0x00, 0x03, 0xE0, 0x00, 0x78, 0x00,
|
||||||
|
0x1E, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x03, 0xF1, 0xFF, 0xF8, 0xFF, 0xFC,
|
||||||
|
0x3F, 0xFE, 0x03, 0xFE, 0x00, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0x7F, 0x00,
|
||||||
|
0xFE, 0x00, 0xFE, 0x01, 0xEE, 0x03, 0xDE, 0x07, 0x9E, 0x0F, 0x1C, 0x1E,
|
||||||
|
0x1C, 0x3C, 0x3C, 0x78, 0x3C, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF,
|
||||||
|
0xFC, 0x00, 0x70, 0x03, 0xFC, 0x07, 0xFC, 0x07, 0xFC, 0x07, 0xF8, 0x07,
|
||||||
|
0xFF, 0xC1, 0xFF, 0xF0, 0x7F, 0xFC, 0x3F, 0xFE, 0x0F, 0x00, 0x03, 0xC0,
|
||||||
|
0x00, 0xE0, 0x00, 0x3B, 0xE0, 0x1F, 0xFE, 0x07, 0xFF, 0xC1, 0xFF, 0xF8,
|
||||||
|
0x78, 0x3E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00,
|
||||||
|
0x0F, 0x18, 0x0F, 0xCF, 0xFF, 0xE3, 0xFF, 0xF0, 0x7F, 0xF8, 0x07, 0xF0,
|
||||||
|
0x00, 0x00, 0x0F, 0xC0, 0x0F, 0xFC, 0x03, 0xFF, 0x81, 0xFF, 0xE0, 0x7F,
|
||||||
|
0x00, 0x1F, 0x80, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x9F,
|
||||||
|
0x01, 0xEF, 0xF0, 0x3F, 0xFF, 0x0F, 0xFF, 0xF1, 0xFC, 0x3E, 0x3E, 0x03,
|
||||||
|
0xC7, 0x80, 0x78, 0xF0, 0x0F, 0x1E, 0x03, 0xC3, 0xE0, 0xF8, 0x7F, 0xFE,
|
||||||
|
0x07, 0xFF, 0x80, 0x7F, 0xE0, 0x07, 0xF0, 0x00, 0x7F, 0xFF, 0x7F, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x0E, 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x3C,
|
||||||
|
0x00, 0x78, 0x00, 0x70, 0x00, 0xF0, 0x00, 0xE0, 0x01, 0xE0, 0x01, 0xC0,
|
||||||
|
0x03, 0xC0, 0x07, 0x80, 0x07, 0x80, 0x0F, 0x00, 0x0E, 0x00, 0x1E, 0x00,
|
||||||
|
0x1C, 0x00, 0x1C, 0x00, 0x00, 0x7E, 0x00, 0x3F, 0xF0, 0x0F, 0xFF, 0x03,
|
||||||
|
0xFF, 0xF0, 0xF8, 0x3E, 0x3E, 0x03, 0xC7, 0x80, 0x78, 0xF0, 0x0F, 0x1E,
|
||||||
|
0x03, 0xC3, 0xE0, 0xF0, 0x3F, 0xFC, 0x03, 0xFF, 0x00, 0xFF, 0xE0, 0x7F,
|
||||||
|
0xFE, 0x1F, 0x83, 0xE3, 0xC0, 0x3C, 0xF0, 0x07, 0x9E, 0x01, 0xF3, 0xE0,
|
||||||
|
0x7C, 0x7F, 0xFF, 0x87, 0xFF, 0xE0, 0x7F, 0xF0, 0x03, 0xF8, 0x00, 0x00,
|
||||||
|
0x7E, 0x00, 0x7F, 0xC0, 0x3F, 0xF8, 0x1F, 0xFE, 0x0F, 0x87, 0xC3, 0xC0,
|
||||||
|
0xF1, 0xE0, 0x3C, 0x78, 0x0F, 0x1E, 0x03, 0xC7, 0x81, 0xF1, 0xF1, 0xFC,
|
||||||
|
0x7F, 0xFE, 0x0F, 0xFF, 0x81, 0xFD, 0xE0, 0x3E, 0xF0, 0x00, 0x7C, 0x00,
|
||||||
|
0x3E, 0x00, 0x1F, 0x00, 0x1F, 0x81, 0xFF, 0xC0, 0xFF, 0xE0, 0x3F, 0xE0,
|
||||||
|
0x07, 0xE0, 0x00, 0x1C, 0x7C, 0xF9, 0xF1, 0xC0, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x03, 0x8F, 0x9F, 0x3E, 0x38, 0x01, 0xC0, 0x7C, 0x0F, 0x81, 0xF0, 0x3C,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0xF0, 0x1E,
|
||||||
|
0x07, 0x80, 0xE0, 0x38, 0x07, 0x01, 0xC0, 0x30, 0x0E, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0xFC, 0x00, 0xFE, 0x00, 0xFE, 0x00,
|
||||||
|
0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE,
|
||||||
|
0x00, 0x1F, 0xC0, 0x01, 0xFC, 0x00, 0x1F, 0xC0, 0x01, 0xF0, 0x00, 0x38,
|
||||||
|
0x3F, 0xFF, 0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0x9F, 0xFF, 0xE0, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x1F, 0xFF, 0xF7, 0xFF, 0xFE, 0xFF, 0xFF, 0xDF, 0xFF, 0xF0,
|
||||||
|
0x00, 0x00, 0x03, 0x80, 0x00, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00,
|
||||||
|
0x07, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x1F, 0xC0, 0x0F, 0xE0,
|
||||||
|
0x07, 0xF0, 0x07, 0xF8, 0x03, 0xF8, 0x01, 0xFC, 0x00, 0x3E, 0x00, 0x07,
|
||||||
|
0x00, 0x00, 0x07, 0xE0, 0xFF, 0xC7, 0xFF, 0xBF, 0xFF, 0xF0, 0x7F, 0x80,
|
||||||
|
0xFE, 0x03, 0xC0, 0x0F, 0x00, 0x78, 0x0F, 0xE1, 0xFE, 0x0F, 0xF0, 0x7E,
|
||||||
|
0x01, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x70, 0x03, 0xE0, 0x0F, 0x80, 0x3E,
|
||||||
|
0x00, 0x70, 0x00, 0x00, 0x3E, 0x00, 0x3F, 0xE0, 0x1F, 0xF8, 0x0F, 0x0F,
|
||||||
|
0x07, 0x01, 0xC3, 0x80, 0x71, 0xE0, 0x1C, 0x70, 0x0E, 0x18, 0x0F, 0x8E,
|
||||||
|
0x1F, 0xE3, 0x8F, 0xF0, 0xE7, 0x9C, 0x33, 0xC7, 0x1C, 0xE1, 0xC7, 0x38,
|
||||||
|
0x71, 0xCF, 0x18, 0x73, 0xFE, 0x38, 0x7F, 0xCE, 0x0F, 0xF3, 0x80, 0x00,
|
||||||
|
0xE0, 0x00, 0x38, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0xC0, 0x7F, 0xF0, 0x0F,
|
||||||
|
0xF8, 0x01, 0xF8, 0x00, 0x01, 0xFF, 0x80, 0x07, 0xFE, 0x00, 0x1F, 0xF8,
|
||||||
|
0x00, 0x7F, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x07, 0xBC, 0x00,
|
||||||
|
0x1C, 0xF0, 0x00, 0xF3, 0xC0, 0x07, 0x87, 0x80, 0x1E, 0x1E, 0x00, 0xF0,
|
||||||
|
0x78, 0x07, 0xFF, 0xE0, 0x1F, 0xFF, 0x80, 0xFF, 0xFF, 0x07, 0xFF, 0xFC,
|
||||||
|
0x1E, 0x00, 0xF1, 0xFE, 0x1F, 0xFF, 0xF8, 0x7F, 0xFF, 0xE1, 0xFF, 0xFF,
|
||||||
|
0x07, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFF, 0x87, 0xFF, 0xFC, 0x1F, 0xFF,
|
||||||
|
0xF0, 0x38, 0x0F, 0x81, 0xC0, 0x3C, 0x1E, 0x01, 0xE0, 0xF0, 0x3E, 0x07,
|
||||||
|
0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xF8, 0x1F, 0xFF, 0xE0, 0xE0, 0x1F,
|
||||||
|
0x87, 0x00, 0x3C, 0x38, 0x01, 0xE3, 0xC0, 0x0F, 0x1E, 0x00, 0xF3, 0xFF,
|
||||||
|
0xFF, 0xBF, 0xFF, 0xF9, 0xFF, 0xFF, 0x8F, 0xFF, 0xF0, 0x00, 0x00, 0x7F,
|
||||||
|
0x30, 0x0F, 0xFF, 0xC1, 0xFF, 0xFE, 0x1F, 0xFF, 0xF1, 0xF8, 0x3F, 0x1F,
|
||||||
|
0x00, 0x78, 0xF0, 0x03, 0xCF, 0x80, 0x1C, 0x78, 0x00, 0x03, 0xC0, 0x00,
|
||||||
|
0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0,
|
||||||
|
0x00, 0x1F, 0x00, 0x38, 0x7E, 0x07, 0xC3, 0xFF, 0xFC, 0x0F, 0xFF, 0xC0,
|
||||||
|
0x3F, 0xFC, 0x00, 0x7F, 0x80, 0x00, 0x0F, 0xFF, 0x80, 0x7F, 0xFE, 0x07,
|
||||||
|
0xFF, 0xF8, 0x1F, 0xFF, 0xE0, 0x78, 0x1F, 0x03, 0x80, 0x7C, 0x1C, 0x01,
|
||||||
|
0xE1, 0xE0, 0x0F, 0x0F, 0x00, 0x78, 0x70, 0x03, 0xC3, 0x80, 0x1E, 0x1C,
|
||||||
|
0x00, 0xF1, 0xE0, 0x0F, 0x0F, 0x00, 0x78, 0x70, 0x07, 0xC3, 0x80, 0x7C,
|
||||||
|
0x3C, 0x07, 0xC3, 0xFF, 0xFC, 0x3F, 0xFF, 0xC1, 0xFF, 0xFC, 0x0F, 0xFF,
|
||||||
|
0x80, 0x00, 0x07, 0xFF, 0xFC, 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0xC3, 0xFF,
|
||||||
|
0xFF, 0x03, 0xC0, 0x3C, 0x0F, 0x00, 0xE0, 0x3C, 0x73, 0x80, 0xE3, 0xCC,
|
||||||
|
0x03, 0xFF, 0x00, 0x1F, 0xFC, 0x00, 0x7F, 0xE0, 0x01, 0xFF, 0x80, 0x07,
|
||||||
|
0x1E, 0x00, 0x3C, 0x70, 0x00, 0xF0, 0x07, 0x03, 0xC0, 0x1C, 0x0E, 0x00,
|
||||||
|
0xF1, 0xFF, 0xFF, 0xC7, 0xFF, 0xFE, 0x3F, 0xFF, 0xF8, 0x7F, 0xFF, 0xE0,
|
||||||
|
0x07, 0xFF, 0xFE, 0x1F, 0xFF, 0xFC, 0x3F, 0xFF, 0xF0, 0x7F, 0xFF, 0xE0,
|
||||||
|
0x3C, 0x01, 0xC0, 0x70, 0x07, 0x80, 0xE1, 0x8E, 0x03, 0xC7, 0x1C, 0x07,
|
||||||
|
0xFE, 0x00, 0x0F, 0xFC, 0x00, 0x1F, 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0xF1,
|
||||||
|
0xC0, 0x01, 0xE3, 0x80, 0x03, 0x80, 0x00, 0x07, 0x00, 0x00, 0x1E, 0x00,
|
||||||
|
0x00, 0xFF, 0xE0, 0x03, 0xFF, 0xC0, 0x07, 0xFF, 0x80, 0x0F, 0xFE, 0x00,
|
||||||
|
0x00, 0x00, 0x3F, 0x18, 0x0F, 0xFF, 0xC0, 0xFF, 0xFE, 0x0F, 0xFF, 0xF0,
|
||||||
|
0xFC, 0x0F, 0x0F, 0x80, 0x38, 0xF8, 0x01, 0x87, 0x80, 0x00, 0x78, 0x00,
|
||||||
|
0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x7F, 0xEF, 0x07, 0xFF, 0x78,
|
||||||
|
0x3F, 0xFB, 0xC0, 0xFF, 0x9E, 0x00, 0x38, 0xFC, 0x03, 0xC3, 0xFF, 0xFE,
|
||||||
|
0x1F, 0xFF, 0xE0, 0x3F, 0xFC, 0x00, 0x7F, 0x80, 0x00, 0x03, 0xF8, 0xFE,
|
||||||
|
0x0F, 0xF3, 0xFC, 0x1F, 0xE7, 0xF8, 0x3F, 0x8F, 0xE0, 0x3C, 0x07, 0x80,
|
||||||
|
0x70, 0x0E, 0x00, 0xE0, 0x1C, 0x03, 0xC0, 0x78, 0x07, 0x80, 0xF0, 0x0F,
|
||||||
|
0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0xFF, 0xFE, 0x01, 0xE0,
|
||||||
|
0x3C, 0x03, 0x80, 0x70, 0x07, 0x00, 0xE0, 0x1E, 0x03, 0xC0, 0xFF, 0x1F,
|
||||||
|
0xE1, 0xFE, 0x7F, 0xC7, 0xFC, 0xFF, 0x87, 0xF1, 0xFE, 0x00, 0x07, 0xFF,
|
||||||
|
0xE1, 0xFF, 0xFC, 0x3F, 0xFF, 0x87, 0xFF, 0xE0, 0x07, 0x80, 0x00, 0xE0,
|
||||||
|
0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0x80,
|
||||||
|
0x00, 0x70, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0E, 0x00,
|
||||||
|
0x01, 0xC0, 0x0F, 0xFF, 0xC3, 0xFF, 0xF8, 0x7F, 0xFF, 0x07, 0xFF, 0xE0,
|
||||||
|
0x00, 0x3F, 0xFE, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x03, 0xFF, 0xE0,
|
||||||
|
0x00, 0x1C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, 0x01, 0xE0, 0x00,
|
||||||
|
0x03, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x80, 0x1C, 0x03, 0x80,
|
||||||
|
0x78, 0x0F, 0x00, 0xF0, 0x1E, 0x01, 0xC0, 0x38, 0x07, 0x80, 0x70, 0x1F,
|
||||||
|
0x01, 0xFF, 0xFC, 0x03, 0xFF, 0xF0, 0x03, 0xFF, 0xC0, 0x00, 0xFC, 0x00,
|
||||||
|
0x00, 0x07, 0xF8, 0xFC, 0x1F, 0xFB, 0xFC, 0x3F, 0xE7, 0xF0, 0x7F, 0xCF,
|
||||||
|
0xE0, 0x3C, 0x1E, 0x00, 0x70, 0xF8, 0x00, 0xE3, 0xE0, 0x03, 0xCF, 0x00,
|
||||||
|
0x07, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xF0, 0x00,
|
||||||
|
0xF9, 0xF0, 0x01, 0xE1, 0xE0, 0x03, 0x83, 0xE0, 0x07, 0x03, 0xC0, 0x1E,
|
||||||
|
0x07, 0x80, 0xFF, 0x8F, 0xE3, 0xFF, 0x0F, 0xC7, 0xFE, 0x1F, 0x8F, 0xF8,
|
||||||
|
0x3E, 0x00, 0x0F, 0xFE, 0x00, 0xFF, 0xF0, 0x1F, 0xFE, 0x00, 0xFF, 0xE0,
|
||||||
|
0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x03, 0xC0,
|
||||||
|
0x00, 0x3C, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x07, 0x80, 0x60, 0x78,
|
||||||
|
0x0F, 0x07, 0x80, 0xF0, 0x70, 0x0E, 0x07, 0x00, 0xE7, 0xFF, 0xFE, 0xFF,
|
||||||
|
0xFF, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xC0, 0x0F, 0xC0, 0x1F, 0x87, 0xE0,
|
||||||
|
0x0F, 0xC7, 0xF8, 0x0F, 0xE1, 0xFC, 0x0F, 0xE0, 0x7E, 0x07, 0xE0, 0x3F,
|
||||||
|
0x07, 0xF0, 0x3F, 0xC7, 0xF8, 0x1F, 0xE3, 0xF8, 0x0E, 0xF3, 0xDC, 0x07,
|
||||||
|
0x7B, 0xDE, 0x03, 0x9F, 0xEF, 0x03, 0xCF, 0xE7, 0x81, 0xE7, 0xE3, 0x80,
|
||||||
|
0xE3, 0xF1, 0xC0, 0x70, 0xF1, 0xE0, 0x38, 0x70, 0xF0, 0x3C, 0x00, 0x70,
|
||||||
|
0x3F, 0xC1, 0xFE, 0x3F, 0xE1, 0xFF, 0x1F, 0xF0, 0xFF, 0x8F, 0xF0, 0x7F,
|
||||||
|
0x80, 0x0F, 0xC1, 0xFE, 0x1F, 0xC1, 0xFF, 0x1F, 0xC3, 0xFE, 0x1F, 0xE1,
|
||||||
|
0xFE, 0x07, 0xE0, 0x38, 0x07, 0xF0, 0x78, 0x07, 0xF0, 0x78, 0x0F, 0xF8,
|
||||||
|
0x70, 0x0F, 0x78, 0x70, 0x0E, 0x78, 0xF0, 0x0E, 0x7C, 0xF0, 0x1E, 0x3C,
|
||||||
|
0xF0, 0x1E, 0x3E, 0xE0, 0x1E, 0x1E, 0xE0, 0x1C, 0x1F, 0xE0, 0x1C, 0x0F,
|
||||||
|
0xE0, 0x3C, 0x0F, 0xE0, 0x7F, 0x87, 0xC0, 0xFF, 0x87, 0xC0, 0xFF, 0x87,
|
||||||
|
0xC0, 0xFF, 0x03, 0xC0, 0x00, 0x7E, 0x00, 0x1F, 0xF8, 0x07, 0xFF, 0xC0,
|
||||||
|
0xFF, 0xFE, 0x1F, 0x87, 0xE3, 0xE0, 0x1F, 0x3C, 0x01, 0xF7, 0xC0, 0x0F,
|
||||||
|
0x78, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x01,
|
||||||
|
0xEF, 0x00, 0x3E, 0xF8, 0x03, 0xCF, 0x80, 0x7C, 0x7C, 0x1F, 0x87, 0xFF,
|
||||||
|
0xF0, 0x3F, 0xFE, 0x01, 0xFF, 0x80, 0x07, 0xE0, 0x00, 0x0F, 0xFF, 0x80,
|
||||||
|
0x7F, 0xFF, 0x07, 0xFF, 0xFC, 0x1F, 0xFF, 0xF0, 0x38, 0x0F, 0x81, 0xC0,
|
||||||
|
0x3C, 0x1E, 0x01, 0xE0, 0xF0, 0x0F, 0x07, 0x00, 0xF0, 0x38, 0x0F, 0x83,
|
||||||
|
0xFF, 0xF8, 0x1F, 0xFF, 0x80, 0xFF, 0xF8, 0x07, 0xFF, 0x00, 0x38, 0x00,
|
||||||
|
0x03, 0xC0, 0x00, 0x1E, 0x00, 0x03, 0xFF, 0x80, 0x3F, 0xFC, 0x01, 0xFF,
|
||||||
|
0xE0, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x1F, 0xF8, 0x07, 0xFF,
|
||||||
|
0xC0, 0xFF, 0xFE, 0x1F, 0x87, 0xE3, 0xE0, 0x1F, 0x3C, 0x01, 0xF7, 0xC0,
|
||||||
|
0x0F, 0x78, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0,
|
||||||
|
0x01, 0xEF, 0x00, 0x3E, 0xF8, 0x03, 0xCF, 0x80, 0x7C, 0x7C, 0x1F, 0x87,
|
||||||
|
0xFF, 0xF0, 0x3F, 0xFE, 0x01, 0xFF, 0x80, 0x07, 0xE0, 0x01, 0xFE, 0x30,
|
||||||
|
0x3F, 0xFF, 0x87, 0xFF, 0xF0, 0x7F, 0xFF, 0x07, 0x83, 0xC0, 0x07, 0xFF,
|
||||||
|
0x80, 0x3F, 0xFF, 0x80, 0xFF, 0xFF, 0x03, 0xFF, 0xFE, 0x03, 0xC0, 0xF8,
|
||||||
|
0x0E, 0x01, 0xE0, 0x38, 0x07, 0x81, 0xE0, 0x3E, 0x07, 0x83, 0xF0, 0x1F,
|
||||||
|
0xFF, 0x80, 0x7F, 0xFC, 0x01, 0xFF, 0xC0, 0x0F, 0xFF, 0x80, 0x3C, 0x3E,
|
||||||
|
0x00, 0xE0, 0x7C, 0x03, 0x80, 0xF0, 0x1E, 0x03, 0xE1, 0xFF, 0x07, 0xFF,
|
||||||
|
0xFC, 0x1F, 0xFF, 0xF0, 0x3F, 0xFF, 0x80, 0xF8, 0x00, 0x7C, 0xE0, 0x7F,
|
||||||
|
0xFC, 0x1F, 0xFF, 0x87, 0xFF, 0xE0, 0xF8, 0x7C, 0x3C, 0x07, 0x87, 0x80,
|
||||||
|
0xE0, 0xF0, 0x00, 0x1F, 0x00, 0x03, 0xFE, 0x00, 0x3F, 0xF8, 0x03, 0xFF,
|
||||||
|
0x80, 0x07, 0xF8, 0x40, 0x1F, 0x3C, 0x01, 0xE7, 0x80, 0x3C, 0xFC, 0x1F,
|
||||||
|
0x1F, 0xFF, 0xE3, 0xFF, 0xF8, 0x7F, 0xFE, 0x00, 0x7E, 0x00, 0x7F, 0xFF,
|
||||||
|
0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0x0E, 0x1F, 0xE1, 0xC3,
|
||||||
|
0xBC, 0x78, 0x77, 0x0F, 0x1E, 0xE1, 0xC1, 0x80, 0x38, 0x00, 0x0F, 0x00,
|
||||||
|
0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x3C, 0x00,
|
||||||
|
0x07, 0x80, 0x0F, 0xFE, 0x03, 0xFF, 0xE0, 0x7F, 0xFC, 0x0F, 0xFF, 0x00,
|
||||||
|
0x7F, 0x8F, 0xF3, 0xFE, 0x7F, 0xDF, 0xF7, 0xFC, 0xFF, 0x1F, 0xE3, 0xC0,
|
||||||
|
0x3C, 0x1C, 0x01, 0xE0, 0xE0, 0x0F, 0x0F, 0x00, 0x70, 0x78, 0x03, 0x83,
|
||||||
|
0xC0, 0x3C, 0x1C, 0x01, 0xE0, 0xE0, 0x0E, 0x0F, 0x00, 0x70, 0x78, 0x03,
|
||||||
|
0x83, 0xC0, 0x3C, 0x1F, 0x01, 0xC0, 0xFC, 0x3E, 0x03, 0xFF, 0xE0, 0x1F,
|
||||||
|
0xFE, 0x00, 0x7F, 0xE0, 0x00, 0xFC, 0x00, 0x00, 0x7F, 0x81, 0xFE, 0xFF,
|
||||||
|
0x87, 0xFF, 0xFF, 0x0F, 0xFB, 0xFC, 0x1F, 0xE1, 0xC0, 0x0F, 0x03, 0xC0,
|
||||||
|
0x1C, 0x07, 0x80, 0x78, 0x0F, 0x01, 0xE0, 0x1E, 0x03, 0x80, 0x1E, 0x0F,
|
||||||
|
0x00, 0x3C, 0x3C, 0x00, 0x78, 0x70, 0x00, 0xF1, 0xE0, 0x01, 0xE7, 0x80,
|
||||||
|
0x01, 0xEF, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00,
|
||||||
|
0x0F, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x7F, 0x87, 0xFF,
|
||||||
|
0xFF, 0x1F, 0xFF, 0xF8, 0x7F, 0xFF, 0xE1, 0xFE, 0x78, 0x00, 0xF1, 0xE3,
|
||||||
|
0xC3, 0x87, 0x8F, 0x0E, 0x1E, 0x7C, 0x78, 0x79, 0xF9, 0xC1, 0xEF, 0xEF,
|
||||||
|
0x07, 0xBF, 0xBC, 0x1D, 0xFE, 0xE0, 0x77, 0x7F, 0x81, 0xFD, 0xFE, 0x07,
|
||||||
|
0xE3, 0xF0, 0x3F, 0x8F, 0xC0, 0xFC, 0x3F, 0x03, 0xF0, 0xF8, 0x0F, 0x83,
|
||||||
|
0xE0, 0x3E, 0x0F, 0x80, 0xF0, 0x3C, 0x00, 0x07, 0xE0, 0x7E, 0x0F, 0xF0,
|
||||||
|
0xFF, 0x0F, 0xF0, 0xFE, 0x0F, 0xE0, 0xFE, 0x03, 0xC0, 0xF8, 0x01, 0xE1,
|
||||||
|
0xE0, 0x01, 0xF3, 0xC0, 0x00, 0xF7, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x7E,
|
||||||
|
0x00, 0x00, 0x7C, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFF, 0x00, 0x03, 0xEF,
|
||||||
|
0x00, 0x07, 0xCF, 0x80, 0x0F, 0x87, 0xC0, 0x1F, 0x03, 0xC0, 0x7F, 0x07,
|
||||||
|
0xF0, 0xFF, 0x8F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xE0, 0x7E, 0x0F,
|
||||||
|
0xEF, 0xF0, 0xFF, 0xFF, 0x0F, 0xEF, 0xE0, 0xFE, 0x3C, 0x0F, 0x01, 0xE1,
|
||||||
|
0xE0, 0x1E, 0x3E, 0x00, 0xF7, 0xC0, 0x0F, 0xF8, 0x00, 0x7F, 0x00, 0x07,
|
||||||
|
0xE0, 0x00, 0x3C, 0x00, 0x03, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00,
|
||||||
|
0x78, 0x00, 0x07, 0x00, 0x07, 0xFF, 0x00, 0xFF, 0xF8, 0x0F, 0xFF, 0x00,
|
||||||
|
0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xE0, 0xFF, 0xFC, 0x3F, 0xFF, 0x87, 0xFF,
|
||||||
|
0xF0, 0xF0, 0x7C, 0x1C, 0x1F, 0x03, 0x87, 0xC0, 0x61, 0xF0, 0x00, 0x7C,
|
||||||
|
0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x07,
|
||||||
|
0x07, 0xC0, 0xE1, 0xF0, 0x3C, 0x7C, 0x07, 0x9F, 0xFF, 0xF3, 0xFF, 0xFC,
|
||||||
|
0x7F, 0xFF, 0x8F, 0xFF, 0xF0, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xE0,
|
||||||
|
0x70, 0x07, 0x80, 0x3C, 0x01, 0xC0, 0x0E, 0x00, 0xF0, 0x07, 0x80, 0x3C,
|
||||||
|
0x01, 0xC0, 0x0E, 0x00, 0xF0, 0x07, 0x80, 0x38, 0x01, 0xC0, 0x0E, 0x00,
|
||||||
|
0xF0, 0x07, 0x80, 0x38, 0x01, 0xC0, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F,
|
||||||
|
0x80, 0xE0, 0x38, 0x0F, 0x03, 0xC0, 0xF0, 0x1C, 0x07, 0x81, 0xE0, 0x78,
|
||||||
|
0x0E, 0x03, 0xC0, 0xF0, 0x3C, 0x07, 0x01, 0xE0, 0x78, 0x1E, 0x03, 0x80,
|
||||||
|
0xF0, 0x3C, 0x0F, 0x01, 0xE0, 0x78, 0x1E, 0x03, 0x80, 0xF0, 0x3C, 0x06,
|
||||||
|
0x07, 0xF8, 0x3F, 0xC1, 0xFC, 0x0F, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0,
|
||||||
|
0x1C, 0x00, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0x80, 0x1C, 0x01, 0xE0, 0x0F,
|
||||||
|
0x00, 0x78, 0x03, 0x80, 0x1C, 0x01, 0xE0, 0x0F, 0x00, 0x70, 0x03, 0x80,
|
||||||
|
0x1C, 0x0F, 0xE0, 0xFF, 0x07, 0xF0, 0x3F, 0x80, 0x00, 0x40, 0x01, 0x80,
|
||||||
|
0x07, 0x80, 0x3F, 0x80, 0xFF, 0x03, 0xFF, 0x0F, 0x9F, 0x3E, 0x1E, 0xF8,
|
||||||
|
0x3F, 0xE0, 0x3F, 0x00, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xF0, 0xC3, 0xC7, 0x0E, 0x3C, 0x30, 0x00, 0xFE, 0x00,
|
||||||
|
0x7F, 0xF0, 0x1F, 0xFF, 0x03, 0xFF, 0xE0, 0x00, 0x3C, 0x07, 0xFF, 0x83,
|
||||||
|
0xFF, 0xF0, 0xFF, 0xFC, 0x3F, 0xFF, 0x8F, 0x80, 0xF3, 0xE0, 0x1E, 0x78,
|
||||||
|
0x1F, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xF8, 0xFE, 0x7E, 0x07,
|
||||||
|
0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x01, 0xC0,
|
||||||
|
0x00, 0x0F, 0x00, 0x00, 0x3C, 0xFC, 0x00, 0xEF, 0xFC, 0x03, 0xFF, 0xF8,
|
||||||
|
0x1F, 0xFF, 0xE0, 0x7E, 0x0F, 0xC1, 0xE0, 0x1F, 0x07, 0x00, 0x3C, 0x1C,
|
||||||
|
0x00, 0xF0, 0xE0, 0x03, 0xC3, 0x80, 0x1E, 0x0F, 0x00, 0xF8, 0x3E, 0x07,
|
||||||
|
0xC7, 0xFF, 0xFF, 0x3F, 0xFF, 0xF8, 0xFF, 0xFF, 0x81, 0xF1, 0xF8, 0x00,
|
||||||
|
0x00, 0xFE, 0x60, 0xFF, 0xFC, 0x3F, 0xFF, 0x8F, 0xFF, 0xF3, 0xF0, 0x3C,
|
||||||
|
0xF8, 0x03, 0x9E, 0x00, 0x67, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03,
|
||||||
|
0xC0, 0x00, 0x7E, 0x01, 0xC7, 0xFF, 0xF8, 0xFF, 0xFE, 0x0F, 0xFF, 0x80,
|
||||||
|
0x7F, 0x80, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07,
|
||||||
|
0xE0, 0x00, 0x0F, 0x00, 0x00, 0x70, 0x07, 0xE3, 0x80, 0xFF, 0xDC, 0x0F,
|
||||||
|
0xFF, 0xE0, 0xFF, 0xFF, 0x0F, 0xC1, 0xF0, 0xF8, 0x07, 0x87, 0x80, 0x1C,
|
||||||
|
0x78, 0x00, 0xE3, 0xC0, 0x0F, 0x1E, 0x00, 0x70, 0xF0, 0x07, 0x87, 0xE0,
|
||||||
|
0xFC, 0x1F, 0xFF, 0xF8, 0xFF, 0xFF, 0xC3, 0xFF, 0xFE, 0x07, 0xE3, 0xE0,
|
||||||
|
0x00, 0xFC, 0x01, 0xFF, 0xC0, 0xFF, 0xF8, 0x7F, 0xFE, 0x3E, 0x0F, 0xCE,
|
||||||
|
0x00, 0xF7, 0x00, 0x3D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xE0, 0x1E, 0xFF, 0xFF, 0x9F, 0xFF, 0xE3, 0xFF, 0xF0, 0x3F, 0xF0,
|
||||||
|
0x00, 0x0F, 0xF0, 0x01, 0xFF, 0xC0, 0x1F, 0xFE, 0x01, 0xFF, 0xE0, 0x0F,
|
||||||
|
0x00, 0x00, 0xF0, 0x00, 0x3F, 0xFF, 0x03, 0xFF, 0xF8, 0x1F, 0xFF, 0xC0,
|
||||||
|
0xFF, 0xFC, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x38, 0x00, 0x01, 0xC0,
|
||||||
|
0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x00, 0x00, 0x38, 0x00, 0x1F,
|
||||||
|
0xFF, 0x81, 0xFF, 0xFC, 0x0F, 0xFF, 0xE0, 0x7F, 0xFE, 0x00, 0x01, 0xF9,
|
||||||
|
0xF8, 0x3F, 0xFF, 0xC3, 0xFF, 0xFE, 0x7F, 0xFF, 0xE3, 0xE0, 0xFC, 0x3E,
|
||||||
|
0x03, 0xE1, 0xE0, 0x0E, 0x1E, 0x00, 0x70, 0xF0, 0x03, 0x87, 0x80, 0x3C,
|
||||||
|
0x3E, 0x03, 0xE1, 0xF8, 0x7E, 0x07, 0xFF, 0xF0, 0x3F, 0xFF, 0x80, 0xFF,
|
||||||
|
0xFC, 0x01, 0xF9, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x80,
|
||||||
|
0x7F, 0xF8, 0x07, 0xFF, 0x80, 0x3F, 0xF8, 0x00, 0xFF, 0x00, 0x00, 0x0F,
|
||||||
|
0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x03, 0xC0, 0x00,
|
||||||
|
0x38, 0x00, 0x03, 0x9F, 0x00, 0x7F, 0xFC, 0x07, 0xFF, 0xC0, 0x7F, 0xFE,
|
||||||
|
0x07, 0xC3, 0xE0, 0x70, 0x1E, 0x0F, 0x01, 0xC0, 0xF0, 0x1C, 0x0E, 0x03,
|
||||||
|
0xC0, 0xE0, 0x3C, 0x1E, 0x03, 0x81, 0xE0, 0x38, 0x7F, 0x0F, 0xFF, 0xF8,
|
||||||
|
0xFF, 0xFF, 0x8F, 0xF7, 0xF0, 0xFE, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78,
|
||||||
|
0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x0F, 0xF0, 0x1F, 0xF0,
|
||||||
|
0x0F, 0xF0, 0x00, 0xF0, 0x00, 0xE0, 0x00, 0xE0, 0x01, 0xE0, 0x01, 0xE0,
|
||||||
|
0x01, 0xE0, 0x01, 0xC0, 0x01, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFE, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0xF8, 0x00, 0x3C, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x7F, 0xFC, 0x3F, 0xFE, 0x0F, 0xFF, 0x81, 0xFF,
|
||||||
|
0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, 0xF0,
|
||||||
|
0x00, 0x3C, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0, 0x00, 0x78, 0x00,
|
||||||
|
0x1E, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, 0xF0, 0x00, 0x7C, 0x1F, 0xFE,
|
||||||
|
0x0F, 0xFF, 0x03, 0xFF, 0x80, 0x7F, 0x80, 0x00, 0x07, 0xE0, 0x00, 0xFE,
|
||||||
|
0x00, 0x0F, 0xE0, 0x00, 0x7C, 0x00, 0x01, 0xC0, 0x00, 0x3C, 0x00, 0x03,
|
||||||
|
0xCF, 0xF0, 0x3C, 0xFF, 0x03, 0x9F, 0xF0, 0x38, 0xFE, 0x07, 0xBF, 0x00,
|
||||||
|
0x7F, 0xC0, 0x07, 0xF8, 0x00, 0x7F, 0x00, 0x07, 0xF8, 0x00, 0xFF, 0xC0,
|
||||||
|
0x0F, 0x7E, 0x00, 0xE3, 0xF0, 0x7E, 0x1F, 0xE7, 0xE1, 0xFE, 0xFE, 0x3F,
|
||||||
|
0xE7, 0xE1, 0xFC, 0x03, 0xFC, 0x07, 0xFC, 0x07, 0xF8, 0x07, 0xF8, 0x00,
|
||||||
|
0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x70, 0x00, 0x70, 0x00, 0xF0, 0x00,
|
||||||
|
0xF0, 0x00, 0xE0, 0x00, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x01,
|
||||||
|
0xC0, 0x01, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1F,
|
||||||
|
0x7C, 0x78, 0x7F, 0xFF, 0xF8, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF0, 0xF1,
|
||||||
|
0xF1, 0xE1, 0xC3, 0x83, 0xC7, 0x87, 0x07, 0x8F, 0x0E, 0x0E, 0x1C, 0x3C,
|
||||||
|
0x1C, 0x38, 0x78, 0x78, 0x70, 0xE0, 0xF1, 0xE1, 0xC1, 0xC7, 0xE3, 0xC3,
|
||||||
|
0xFF, 0xCF, 0xC7, 0xFF, 0x9F, 0x9F, 0xFF, 0x3E, 0x3E, 0x0F, 0x8F, 0x80,
|
||||||
|
0xFD, 0xFF, 0x07, 0xFF, 0xF8, 0x3F, 0xFF, 0xE0, 0x7E, 0x1F, 0x07, 0xC0,
|
||||||
|
0x78, 0x3C, 0x03, 0x81, 0xE0, 0x1C, 0x0E, 0x01, 0xE0, 0x70, 0x0F, 0x07,
|
||||||
|
0x80, 0x70, 0x3C, 0x03, 0x87, 0xF0, 0x3F, 0x7F, 0xC3, 0xFF, 0xFE, 0x1F,
|
||||||
|
0xEF, 0xE0, 0xFE, 0x01, 0xFC, 0x01, 0xFF, 0x80, 0xFF, 0xF8, 0x7F, 0xFE,
|
||||||
|
0x3E, 0x0F, 0xDF, 0x01, 0xF7, 0x80, 0x3F, 0xC0, 0x0F, 0xF0, 0x03, 0xFC,
|
||||||
|
0x01, 0xEF, 0x80, 0xFB, 0xF0, 0x7C, 0x7F, 0xFF, 0x1F, 0xFF, 0x03, 0xFF,
|
||||||
|
0x80, 0x3F, 0x80, 0x07, 0xC7, 0xE0, 0x1F, 0xBF, 0xF0, 0x3F, 0xFF, 0xF0,
|
||||||
|
0x7F, 0xFF, 0xE0, 0x3F, 0x07, 0xE0, 0x78, 0x03, 0xC0, 0xE0, 0x07, 0x81,
|
||||||
|
0xC0, 0x0F, 0x07, 0x00, 0x1E, 0x0F, 0x00, 0x78, 0x1E, 0x01, 0xF0, 0x3E,
|
||||||
|
0x07, 0xC0, 0xFF, 0xFF, 0x81, 0xFF, 0xFE, 0x03, 0xDF, 0xF0, 0x07, 0x1F,
|
||||||
|
0x80, 0x0E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x78, 0x00, 0x03, 0xFE, 0x00,
|
||||||
|
0x0F, 0xFE, 0x00, 0x1F, 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x01, 0xF8,
|
||||||
|
0xF8, 0x1F, 0xFF, 0xF1, 0xFF, 0xFF, 0xCF, 0xFF, 0xFE, 0x3E, 0x07, 0xC1,
|
||||||
|
0xF0, 0x0F, 0x07, 0x80, 0x1C, 0x3C, 0x00, 0x70, 0xF0, 0x03, 0x83, 0xC0,
|
||||||
|
0x0E, 0x0F, 0x80, 0x78, 0x3F, 0x07, 0xE0, 0x7F, 0xFF, 0x81, 0xFF, 0xFC,
|
||||||
|
0x03, 0xFF, 0x70, 0x03, 0xF3, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00,
|
||||||
|
0x00, 0xE0, 0x00, 0x3F, 0xE0, 0x01, 0xFF, 0xC0, 0x07, 0xFF, 0x00, 0x1F,
|
||||||
|
0xF8, 0x00, 0x0F, 0xC3, 0xC1, 0xFC, 0xFF, 0x1F, 0xFF, 0xF1, 0xFF, 0xFE,
|
||||||
|
0x03, 0xFC, 0x00, 0x3F, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x07, 0x80,
|
||||||
|
0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0xF0, 0x00, 0xFF, 0xFC, 0x0F, 0xFF,
|
||||||
|
0xE0, 0xFF, 0xFC, 0x0F, 0xFF, 0xC0, 0x03, 0xF3, 0x0F, 0xFF, 0x3F, 0xFF,
|
||||||
|
0x3F, 0xFF, 0x7C, 0x0E, 0x78, 0x00, 0x7F, 0xE0, 0x3F, 0xFC, 0x1F, 0xFF,
|
||||||
|
0x00, 0x3F, 0x70, 0x0F, 0xF8, 0x1F, 0xFF, 0xFE, 0xFF, 0xFC, 0xFF, 0xF8,
|
||||||
|
0x0F, 0xE0, 0x06, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x0E, 0x00,
|
||||||
|
0x7F, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFC, 0x1C, 0x00, 0x3C, 0x00,
|
||||||
|
0x3C, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x78, 0x00, 0x7C, 0x0E,
|
||||||
|
0x7F, 0xFF, 0x7F, 0xFE, 0x3F, 0xFC, 0x0F, 0xE0, 0x7C, 0x0F, 0xFF, 0x07,
|
||||||
|
0xFF, 0x81, 0xFF, 0xE0, 0x7E, 0x78, 0x03, 0x9E, 0x00, 0xE7, 0x80, 0x79,
|
||||||
|
0xE0, 0x1E, 0x78, 0x07, 0x1E, 0x01, 0xC7, 0x80, 0xF1, 0xE0, 0xFC, 0x7F,
|
||||||
|
0xFF, 0x9F, 0xFF, 0xE3, 0xFF, 0xF8, 0x3E, 0x7C, 0x7F, 0x87, 0xFF, 0xFC,
|
||||||
|
0x7F, 0xFF, 0xE3, 0xFF, 0xFF, 0x1F, 0xE1, 0xE0, 0x3C, 0x0F, 0x03, 0xC0,
|
||||||
|
0x78, 0x3C, 0x01, 0xE1, 0xC0, 0x0F, 0x1E, 0x00, 0x79, 0xE0, 0x03, 0xCE,
|
||||||
|
0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0x80, 0x00,
|
||||||
|
0x78, 0x00, 0x7E, 0x03, 0xF7, 0xF0, 0x3F, 0xFF, 0x81, 0xFD, 0xF8, 0x0F,
|
||||||
|
0xE7, 0x8E, 0x1C, 0x3C, 0xF9, 0xE1, 0xE7, 0xCE, 0x0F, 0x7E, 0xF0, 0x7B,
|
||||||
|
0xF7, 0x03, 0xFF, 0xF8, 0x1F, 0xDF, 0x80, 0xFC, 0xFC, 0x07, 0xE7, 0xE0,
|
||||||
|
0x3E, 0x3E, 0x01, 0xF1, 0xF0, 0x0F, 0x07, 0x00, 0x0F, 0xE3, 0xF8, 0xFF,
|
||||||
|
0x1F, 0xC7, 0xF9, 0xFE, 0x1F, 0x87, 0xF0, 0x7E, 0x7C, 0x01, 0xFF, 0xC0,
|
||||||
|
0x07, 0xFC, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x1F, 0xF0, 0x01, 0xF7,
|
||||||
|
0xC0, 0x1F, 0x1F, 0x03, 0xF0, 0x7C, 0x7F, 0xCF, 0xFB, 0xFE, 0x7F, 0xDF,
|
||||||
|
0xE3, 0xFC, 0x07, 0xF0, 0x7F, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x07,
|
||||||
|
0xE0, 0xFE, 0x03, 0xC0, 0x78, 0x03, 0xC0, 0x78, 0x03, 0xC0, 0xF0, 0x01,
|
||||||
|
0xE1, 0xE0, 0x01, 0xE1, 0xC0, 0x01, 0xE3, 0xC0, 0x00, 0xF7, 0x80, 0x00,
|
||||||
|
0xFF, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7C, 0x00, 0x00,
|
||||||
|
0x78, 0x00, 0x00, 0x70, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x7F,
|
||||||
|
0xF0, 0x00, 0xFF, 0xF8, 0x00, 0xFF, 0xF0, 0x00, 0x7F, 0xF0, 0x00, 0x1F,
|
||||||
|
0xFF, 0xC7, 0xFF, 0xF1, 0xFF, 0xF8, 0xFF, 0xFE, 0x3C, 0x1F, 0x0E, 0x1F,
|
||||||
|
0x00, 0x0F, 0x80, 0x07, 0xC0, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00,
|
||||||
|
0xF8, 0x3C, 0xFF, 0xFF, 0x3F, 0xFF, 0xCF, 0xFF, 0xE3, 0xFF, 0xF8, 0x00,
|
||||||
|
0xF0, 0x1F, 0x03, 0xF0, 0x7E, 0x07, 0x80, 0x70, 0x0F, 0x00, 0xF0, 0x0E,
|
||||||
|
0x00, 0xE0, 0x1E, 0x01, 0xC0, 0xFC, 0x0F, 0x80, 0xF8, 0x0F, 0xC0, 0x3C,
|
||||||
|
0x03, 0xC0, 0x38, 0x03, 0x80, 0x78, 0x07, 0x80, 0x78, 0x07, 0xE0, 0x7E,
|
||||||
|
0x03, 0xE0, 0x1C, 0x00, 0x02, 0x07, 0x07, 0x0F, 0x0F, 0x0E, 0x0E, 0x0E,
|
||||||
|
0x1E, 0x1E, 0x1C, 0x1C, 0x1C, 0x3C, 0x3C, 0x38, 0x38, 0x38, 0x78, 0x78,
|
||||||
|
0x70, 0x70, 0x70, 0xF0, 0xF0, 0xE0, 0xE0, 0x01, 0xC0, 0x1F, 0x00, 0xFC,
|
||||||
|
0x07, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1C, 0x00, 0xE0, 0x0F, 0x00,
|
||||||
|
0x78, 0x03, 0xC0, 0x1F, 0x80, 0x7C, 0x03, 0xE0, 0x3F, 0x03, 0xC0, 0x1C,
|
||||||
|
0x00, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0x80, 0x3C, 0x0F, 0xE0, 0x7E, 0x07,
|
||||||
|
0xE0, 0x1E, 0x00, 0x0F, 0x00, 0x1F, 0xC0, 0x1F, 0xF0, 0xFF, 0xFC, 0xFF,
|
||||||
|
0x3F, 0xFF, 0x0F, 0xF8, 0x03, 0xF8, 0x00, 0xF0};
|
||||||
|
|
||||||
|
const GFXglyph FreeMonoBoldOblique18pt7bGlyphs[] PROGMEM = {
|
||||||
|
{0, 0, 0, 21, 0, 1}, // 0x20 ' '
|
||||||
|
{0, 9, 22, 21, 9, -21}, // 0x21 '!'
|
||||||
|
{25, 12, 10, 21, 9, -20}, // 0x22 '"'
|
||||||
|
{40, 18, 25, 21, 4, -22}, // 0x23 '#'
|
||||||
|
{97, 18, 28, 21, 4, -23}, // 0x24 '$'
|
||||||
|
{160, 16, 21, 21, 5, -20}, // 0x25 '%'
|
||||||
|
{202, 16, 20, 21, 4, -19}, // 0x26 '&'
|
||||||
|
{242, 5, 10, 21, 12, -20}, // 0x27 '''
|
||||||
|
{249, 10, 27, 21, 11, -21}, // 0x28 '('
|
||||||
|
{283, 10, 27, 21, 4, -21}, // 0x29 ')'
|
||||||
|
{317, 15, 15, 21, 6, -21}, // 0x2A '*'
|
||||||
|
{346, 18, 19, 21, 4, -18}, // 0x2B '+'
|
||||||
|
{389, 9, 10, 21, 4, -3}, // 0x2C ','
|
||||||
|
{401, 18, 4, 21, 4, -11}, // 0x2D '-'
|
||||||
|
{410, 5, 5, 21, 8, -4}, // 0x2E '.'
|
||||||
|
{414, 21, 28, 21, 2, -23}, // 0x2F '/'
|
||||||
|
{488, 17, 23, 21, 5, -22}, // 0x30 '0'
|
||||||
|
{537, 15, 22, 21, 3, -21}, // 0x31 '1'
|
||||||
|
{579, 20, 23, 21, 2, -22}, // 0x32 '2'
|
||||||
|
{637, 18, 23, 21, 3, -22}, // 0x33 '3'
|
||||||
|
{689, 16, 21, 21, 4, -20}, // 0x34 '4'
|
||||||
|
{731, 18, 22, 21, 4, -21}, // 0x35 '5'
|
||||||
|
{781, 19, 23, 21, 5, -22}, // 0x36 '6'
|
||||||
|
{836, 16, 22, 21, 6, -21}, // 0x37 '7'
|
||||||
|
{880, 19, 23, 21, 3, -22}, // 0x38 '8'
|
||||||
|
{935, 18, 23, 21, 4, -22}, // 0x39 '9'
|
||||||
|
{987, 7, 16, 21, 9, -15}, // 0x3A ':'
|
||||||
|
{1001, 11, 22, 21, 4, -15}, // 0x3B ';'
|
||||||
|
{1032, 18, 16, 21, 4, -17}, // 0x3C '<'
|
||||||
|
{1068, 19, 10, 21, 3, -14}, // 0x3D '='
|
||||||
|
{1092, 19, 16, 21, 3, -17}, // 0x3E '>'
|
||||||
|
{1130, 14, 21, 21, 8, -20}, // 0x3F '?'
|
||||||
|
{1167, 18, 27, 21, 3, -21}, // 0x40 '@'
|
||||||
|
{1228, 22, 21, 21, 0, -20}, // 0x41 'A'
|
||||||
|
{1286, 21, 21, 21, 1, -20}, // 0x42 'B'
|
||||||
|
{1342, 21, 21, 21, 2, -20}, // 0x43 'C'
|
||||||
|
{1398, 21, 21, 21, 1, -20}, // 0x44 'D'
|
||||||
|
{1454, 22, 21, 21, 0, -20}, // 0x45 'E'
|
||||||
|
{1512, 23, 21, 21, 0, -20}, // 0x46 'F'
|
||||||
|
{1573, 21, 21, 21, 2, -20}, // 0x47 'G'
|
||||||
|
{1629, 23, 21, 21, 0, -20}, // 0x48 'H'
|
||||||
|
{1690, 19, 21, 21, 2, -20}, // 0x49 'I'
|
||||||
|
{1740, 23, 21, 21, 0, -20}, // 0x4A 'J'
|
||||||
|
{1801, 23, 21, 21, 0, -20}, // 0x4B 'K'
|
||||||
|
{1862, 20, 21, 21, 1, -20}, // 0x4C 'L'
|
||||||
|
{1915, 25, 21, 21, 0, -20}, // 0x4D 'M'
|
||||||
|
{1981, 24, 21, 21, 1, -20}, // 0x4E 'N'
|
||||||
|
{2044, 20, 21, 21, 2, -20}, // 0x4F 'O'
|
||||||
|
{2097, 21, 21, 21, 1, -20}, // 0x50 'P'
|
||||||
|
{2153, 20, 26, 21, 2, -20}, // 0x51 'Q'
|
||||||
|
{2218, 22, 21, 21, 0, -20}, // 0x52 'R'
|
||||||
|
{2276, 19, 21, 21, 3, -20}, // 0x53 'S'
|
||||||
|
{2326, 19, 21, 21, 3, -20}, // 0x54 'T'
|
||||||
|
{2376, 21, 21, 21, 3, -20}, // 0x55 'U'
|
||||||
|
{2432, 23, 21, 21, 1, -20}, // 0x56 'V'
|
||||||
|
{2493, 22, 21, 21, 2, -20}, // 0x57 'W'
|
||||||
|
{2551, 24, 21, 21, 0, -20}, // 0x58 'X'
|
||||||
|
{2614, 20, 21, 21, 3, -20}, // 0x59 'Y'
|
||||||
|
{2667, 19, 21, 21, 2, -20}, // 0x5A 'Z'
|
||||||
|
{2717, 13, 27, 21, 8, -21}, // 0x5B '['
|
||||||
|
{2761, 10, 28, 21, 8, -23}, // 0x5C '\'
|
||||||
|
{2796, 13, 27, 21, 4, -21}, // 0x5D ']'
|
||||||
|
{2840, 15, 11, 21, 6, -21}, // 0x5E '^'
|
||||||
|
{2861, 21, 4, 21, -1, 4}, // 0x5F '_'
|
||||||
|
{2872, 6, 6, 21, 10, -22}, // 0x60 '`'
|
||||||
|
{2877, 19, 16, 21, 2, -15}, // 0x61 'a'
|
||||||
|
{2915, 22, 22, 21, 0, -21}, // 0x62 'b'
|
||||||
|
{2976, 19, 16, 21, 3, -15}, // 0x63 'c'
|
||||||
|
{3014, 21, 22, 21, 3, -21}, // 0x64 'd'
|
||||||
|
{3072, 18, 16, 21, 3, -15}, // 0x65 'e'
|
||||||
|
{3108, 21, 22, 21, 3, -21}, // 0x66 'f'
|
||||||
|
{3166, 21, 23, 21, 2, -15}, // 0x67 'g'
|
||||||
|
{3227, 20, 22, 21, 1, -21}, // 0x68 'h'
|
||||||
|
{3282, 16, 22, 21, 3, -21}, // 0x69 'i'
|
||||||
|
{3326, 18, 29, 21, 2, -21}, // 0x6A 'j'
|
||||||
|
{3392, 20, 22, 21, 1, -21}, // 0x6B 'k'
|
||||||
|
{3447, 16, 22, 21, 3, -21}, // 0x6C 'l'
|
||||||
|
{3491, 23, 16, 21, 0, -15}, // 0x6D 'm'
|
||||||
|
{3537, 21, 16, 21, 1, -15}, // 0x6E 'n'
|
||||||
|
{3579, 18, 16, 21, 3, -15}, // 0x6F 'o'
|
||||||
|
{3615, 23, 23, 21, -1, -15}, // 0x70 'p'
|
||||||
|
{3682, 22, 23, 21, 2, -15}, // 0x71 'q'
|
||||||
|
{3746, 20, 16, 21, 2, -15}, // 0x72 'r'
|
||||||
|
{3786, 16, 16, 21, 4, -15}, // 0x73 's'
|
||||||
|
{3818, 16, 21, 21, 4, -20}, // 0x74 't'
|
||||||
|
{3860, 18, 16, 21, 3, -15}, // 0x75 'u'
|
||||||
|
{3896, 21, 16, 21, 2, -15}, // 0x76 'v'
|
||||||
|
{3938, 21, 16, 21, 3, -15}, // 0x77 'w'
|
||||||
|
{3980, 21, 16, 21, 1, -15}, // 0x78 'x'
|
||||||
|
{4022, 24, 23, 21, -1, -15}, // 0x79 'y'
|
||||||
|
{4091, 18, 16, 21, 3, -15}, // 0x7A 'z'
|
||||||
|
{4127, 12, 27, 21, 8, -21}, // 0x7B '{'
|
||||||
|
{4168, 8, 27, 21, 8, -21}, // 0x7C '|'
|
||||||
|
{4195, 13, 27, 21, 4, -21}, // 0x7D '}'
|
||||||
|
{4239, 17, 8, 21, 4, -13}}; // 0x7E '~'
|
||||||
|
|
||||||
|
const GFXfont FreeMonoBoldOblique18pt7b PROGMEM = {
|
||||||
|
(uint8_t *)FreeMonoBoldOblique18pt7bBitmaps,
|
||||||
|
(GFXglyph *)FreeMonoBoldOblique18pt7bGlyphs, 0x20, 0x7E, 35};
|
||||||
|
|
||||||
|
// Approx. 4928 bytes
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user