Часы-термометр
- Войдите на сайт для отправки комментариев
Вс, 03/02/2019 - 21:16

Проект выходного дня. Дисплей 12864ZW подключен по последовательному интерфейсу (подключение показано в соответствии с нумерацией дисплея схемы, у оригинала нумерация справа налево). Наружний датчик - DHT22, внутренний - BME280, часы - DS3231, пищалка - пассивный пьезоэлемент (есть возможность поставить и активный, в прошивке заложены оба варианта), все управляется ардуиной микро mega328P. Т.к. индикатор хочет 3.3В питания пришлось поставить стабилизатор на LM317 (первое что попало под руку). Все управление и настройки делаются через терминал.
В прошивке не использованы сторонние библиотеки, все свое))
Основной скетч:
/* Часы-термометр * Индикация - 12864ZW работающий в последовательном режиме * * E - D13 * * R/W - D11 * * RS - D10 * * RESET - D9 * Часы - DS3231 * Уличный датчик - DHT22 * Комнатный датчик - BME280 * I2C ** A5 - SCL ** A4 - SDA * Управление и настройка через терминал ** Установка времени: T 23:59:59 ** Установка даты: D 31.12.18 ** Сигнал каждый час: S 0/1 08-22 ** Шрифт часов: B 0/1 ** Текущие настройки: R * Сохранение настроек в DS3231 * 0x07 - Время включения сигнала каждый час * 0х08 - Время выключения сигнала каждый час * 0х09 - Сигнал каждый час вкл/выкл * 0x0B - Шрифт часов * 0x0C - Коррекция влажности DHT22. Старший нибл знак, младший значение */ #include "mIO.h" #include "mI2C.h" #include "mDHT.h" #include "mST7290.h" #include "mBME280.h" #define DS3231 0x68 #define pinSound 8 #define pinSoundPower 7 unsigned char buffer[512]; // Буфер экрана unsigned char sound_en=0,sound_on=0,sound_off=0; // Сигнал каждый час unsigned char ds[0x12]; // Буфер DS3231 unsigned int temp_out; // Температура на улице unsigned int hum_out; // Влажность на улице unsigned char cmd,arg1,arg2,arg3; // Аргументы в команде int temp_in; // Температура в доме int hum_in; // Влажность в доме int press_in; // Давление unsigned char bold=0; // Шрифт часов char hum_corr=0; // Коррекция влажности DHT22 void setup() { Serial.begin(9600); Serial.println("Meteo-12864ZW started"); Serial.println("Set time: \"T 23:59:59\""); Serial.println("Set date: \"D 31.12.18\""); Serial.println("Set sound: \"S 0/1 8-23\""); Serial.println("Set correction: \"K -9...9\""); Serial.println("Bold font: \"B 0/1\""); Serial.println("Read setting: \"R\""); // Сигнал каждый час pinMode(pinSound,OUTPUT); digitalWrite(pinSound,LOW); // Питание для бипера, если используется активный зумер pinMode(pinSoundPower,OUTPUT); digitalWrite(pinSoundPower,LOW); // Переферия инициализация и начальная настройка unsigned char tmp[6]; Serial.print("I2C..."); I2c_Init(); Serial.println("OK"); Serial.print("BME280..."); hum_corr=BME280_Init(); if(!hum_corr) Serial.println("OK"); else Serial.println("ERROR"); Serial.print("ST7290..."); ST7290_Init(); Serial.println("OK"); Serial.print("DHT22..."); hum_corr=DHT_Init(); if(!hum_corr) Serial.println("OK"); else Serial.println("ERROR"); // Первоначальный запуск DS3231 Serial.println("Read setting"); Read_I2C(DS3231,0x0E,2,tmp); if(tmp[1] & 0x80) { Serial.println("DS3231 restarted. Check time and date"); tmp[0]=0x20;tmp[1]=8; Write_I2C(DS3231,0x0E,2,tmp); } Serial.println("Read OK"); // Чтение настроек Read_I2C(DS3231,0x07,6,tmp); sound_on=tmp[0];sound_off=tmp[1];sound_en=tmp[2]; bold=tmp[4]; if(tmp[5] & 0xF0) hum_corr=0-(tmp[5] & 0x0F); else hum_corr=tmp[5]; Write_Scr(); Serial.println("Setup end"); } char tmp=0; int dht_delay=1; int bme280_delay=2; void loop() { Read_I2C(DS3231,0,0x12,ds); if(tmp!=ds[0]) { // Oпрос датчиков раз в минуту dht_delay--; if(!dht_delay) { if(!Read_DHT()) dht_delay=60; else dht_delay=2; } bme280_delay--; if(!bme280_delay) {Read_BME280();bme280_delay=60;} // Сигнал каждый час if(!ds[1] && !ds[0] && sound_en) { if(ds[2]>=sound_on && ds[2]<=sound_off) { digitalWrite(pinSoundPower,HIGH); tone(8,2000,300); delay(300); digitalWrite(pinSoundPower,LOW); } } Write_Scr(); tmp=ds[0]; } if(Serial.available()) { tmp=input_str(); if(cmd=='T') {ds[2]=arg1;ds[1]=arg2;ds[0]=arg3;Write_I2C(DS3231,0,3,ds);} if(cmd=='D') { ds[4]=arg1;ds[5]=arg2;ds[6]=arg3; ds[3]=calc_day(); Write_I2C(DS3231,3,4,&ds[3]); } if(cmd=='S') { ds[9]=sound_en=arg1;ds[7]=sound_on=arg2;ds[8]=sound_off=arg3; Write_I2C(DS3231,0x07,3,&ds[0x07]); } if(cmd=='R') {Read_I2C(DS3231,0,0x12,ds);write_all_data(ds);} if(cmd=='B') { if(arg1) bold=0xFF; else bold=0; Write_byte_I2C(DS3231,0x0B,bold); } if(cmd=='K') { hum_corr=arg1; if(hum_corr<0) Write_byte_I2C(DS3231,0x0C,0x10+(0-hum_corr)); else Write_byte_I2C(DS3231,0x0C,hum_corr); } } delay(250); }Управление дисплеем:
//*************************************************************************************** // Заголовок, файл *.h void ST7290_Init(); void Write_CMD(unsigned char i); void Write_DATA(unsigned char i); void Write_Low_Buffer(); void Write_High_Buffer(); // Файл реализации *.cpp #include "Arduino.h" #include <SPI.h> // Bit 2 = RW // Bit 1 = RS #define WR_CMD 0xF8 #define WR_DATA 0xFA #define RESET 9 #define SS 10 extern unsigned char buffer[]; //*************************************************************************************** //* Запись команды //*************************************************************************************** void Write_CMD(unsigned char i) { digitalWrite(SS,HIGH); SPI.transfer(WR_CMD); SPI.transfer(i & 0xF0); SPI.transfer(i<<4); digitalWrite(SS,LOW); delayMicroseconds(1000); } //*************************************************************************************** //* Запись данных //*************************************************************************************** void Write_DATA(unsigned char i) { digitalWrite(SS,HIGH); SPI.transfer(WR_DATA); SPI.transfer(i & 0xF0); SPI.transfer(i<<4); digitalWrite(SS,LOW); delayMicroseconds(50); } //*************************************************************************************** //* Вывод буфера //*************************************************************************************** void Write_Low_Buffer() { int pos=0; for(int i=0;i<32;i++) { Write_CMD(0x80+i); Write_CMD(0x80); for(int j=0;j<16;j++) Write_DATA(buffer[pos++]); } } //*************************************************************************************** void Write_High_Buffer() { int pos=0; for(int i=0;i<32;i++) { Write_CMD(0x80+i); Write_CMD(0x88); for(int j=0;j<16;j++) Write_DATA(buffer[pos++]); } } //*************************************************************************************** //* Очистить графический экран //*************************************************************************************** void Clear_Scr() { for(int i=0;i<32;i++) { Write_CMD(0x80+i); Write_CMD(0x80); for(int j=0;j<32;j++) Write_DATA(0); } } //*************************************************************************************** // * Init //*************************************************************************************** void ST7290_Init() { pinMode(SS,OUTPUT); digitalWrite(SS,LOW); pinMode(RESET,OUTPUT); pinMode(11,OUTPUT); pinMode(13,OUTPUT); // Reset display digitalWrite(RESET,LOW); delay(100); digitalWrite(RESET,HIGH); // SPI.begin(); SPI.setDataMode(SPI_MODE3); SPI.setBitOrder(MSBFIRST); // Init display Write_CMD(0x01); Write_CMD(0x06); Write_CMD(0x0C); Write_CMD(0x34); Write_CMD(0x36); }Чтение DHT22:
//*************************************************************************************** // Заголовок, файл *.h char DHT_Init(); unsigned char Read_DHT(); // Файл реализации *.cpp #include "Arduino.h" #define pinDHT 2 extern unsigned int temp_out; extern unsigned int hum_out; //*************************************************************************************** //* //*************************************************************************************** unsigned char Read_DHT() { unsigned char dht[5]; temp_out=32767; digitalWrite(pinDHT,LOW); delay(10); pinMode(pinDHT,INPUT); delayMicroseconds(70); if(digitalRead(pinDHT)) {pinMode(pinDHT,OUTPUT);digitalWrite(pinDHT,HIGH);return 0xFF;} delayMicroseconds(80); if(!digitalRead(pinDHT)) {pinMode(pinDHT,OUTPUT);digitalWrite(pinDHT,HIGH);return 0xFF;} // Начало чтения датчика while (digitalRead(pinDHT)); for (unsigned char j=0; j<5; j++) { dht[j]=0; for(unsigned char i=0; i<8; i++) { while (!(digitalRead(pinDHT))); delayMicroseconds(30); if (digitalRead(pinDHT))dht[j]|=1<<(7-i); while (digitalRead(pinDHT)); } } pinMode(pinDHT,OUTPUT);digitalWrite(pinDHT,HIGH); // KC unsigned char ks=dht[0]+dht[1]+dht[2]+dht[3]; if(ks!=dht[4]) return 0x80; // Округление до целого значения hum_out=dht[0]<<8; hum_out+=dht[1];hum_out/=10; temp_out=dht[2]<<8;temp_out+=dht[3]; if(temp_out & 0x8000) { temp_out=temp_out & 0x7FFF; temp_out/=10; temp_out |=0x8000; } else temp_out/=10; return 0; } //*************************************************************************************** // DHT Init //*************************************************************************************** char DHT_Init() { pinMode(pinDHT,OUTPUT); digitalWrite(pinDHT,HIGH); return (char) Read_DHT(); }Шина I2C:
//*************************************************************************************** // Заголовок, файл *.h void I2c_Init(); void Write_I2C (unsigned char device,unsigned char adr,unsigned char count,unsigned char *data); void Read_I2C(unsigned char device,unsigned char adr,unsigned char count,unsigned char *data); void Write_byte_I2C (unsigned char device,unsigned char adr,unsigned char data); unsigned char Read_byte_I2C(unsigned char device,unsigned char adr); // Файл реализации *.cpp #include "Arduino.h" #include <Wire.h> //*************************************************************************************** // * Init //*************************************************************************************** void I2c_Init() { Wire.begin(); Wire.setClock(400000); } //*************************************************************************************** //* Запись I2C //*************************************************************************************** void Write_I2C (unsigned char device,unsigned char adr,unsigned char count,unsigned char *data) { Wire.beginTransmission(device); Wire.write(adr); for(char i=0;i<count;i++) Wire.write(data[i]); Wire.endTransmission(); } //*************************************************************************************** //* Чтение I2C //*************************************************************************************** void Read_I2C(unsigned char device,unsigned char adr,unsigned char count,unsigned char *data) { char i=0; // Установить адрес Wire.beginTransmission(device); Wire.write(adr); Wire.endTransmission(); // Считать данные Wire.beginTransmission(device); Wire.requestFrom(device, count); while(Wire.available()){data[i++] = Wire.read();} Wire.endTransmission(); } //*************************************************************************************** //* Запись байта в I2C //*************************************************************************************** void Write_byte_I2C (unsigned char device,unsigned char adr,unsigned char data) { Wire.beginTransmission(device); Wire.write(adr); Wire.write(data); Wire.endTransmission(); } //*************************************************************************************** //* Чтение байта из I2C //*************************************************************************************** unsigned char Read_byte_I2C(unsigned char device,unsigned char adr) { char i=0; // Установить адрес Wire.beginTransmission(device); Wire.write(adr); Wire.endTransmission(); // Считать данные Wire.beginTransmission(device); Wire.requestFrom(device,(unsigned char) 1); unsigned char c = Wire.read(); Wire.endTransmission(); return c; }Чтение BME280:
//*************************************************************************************** // Заголовок, файл *.h char BME280_Init(); void Read_BME280(); // Файл реализации *.cpp #include "Arduino.h" #include "mI2C.h" #define BME280 0x76 #define BME280_CONFIG 0xF5 #define BME280_CONTROL_HUM 0xF2 #define BME280_SOFTRESET 0xE0 #define BME280_CHIPID 0xD0 #define BME280_STATUS 0XF3 #define BME280_CTRL_HUM 0xF2 #define BME280_CTRL_MEAS 0xF4 #define BME280_PRESS 0xF7 // 0xF7-0xF9 #define BME280_TEMP 0xFA // 0xFA-0xFC #define BME280_HUM 0xFD // 0xFD-0xFE #define BME280_RESET_CODE 0xB6 #define BME280_MEASURING 0x08 #define BME280_UPDATE 0x01 #define BME280_STBY_0_5 0x00 #define BME280_STBY_62_5 0x20 #define BME280_STBY_125 0x40 #define BME280_STBY_250 0x60 #define BME280_STBY_500 0x80 #define BME280_STBY_1000 0xA0 #define BME280_STBY_10 0xC0 #define BME280_STBY_20 0xE0 #define BME280_FILTER_OFF 0x00 #define BME280_FILTER_2 0x04 #define BME280_FILTER_4 0x08 #define BME280_FILTER_8 0x0C #define BME280_FILTER_16 0x10 #define BME280_MODE_SLEEP 0x00 #define BME280_MODE_FORCED 0x01 #define BME280_MODE_NORMAL 0x03 #define BME280_OSRS_T_SKIP 0x00 #define BME280_OSRS_T_x1 0x20 #define BME280_OSRS_T_x2 0x40 #define BME280_OSRS_T_x4 0x60 #define BME280_OSRS_T_x8 0x80 #define BME280_OSRS_T_x16 0xA0 #define BME280_OSRS_P_SKIP 0x00 #define BME280_OSRS_P_x1 0x04 #define BME280_OSRS_P_x2 0x08 #define BME280_OSRS_P_x4 0x0C #define BME280_OSRS_P_x8 0x10 #define BME280_OSRS_P_x16 0x14 #define BME280_OSRS_H_SKIP 0x00 #define BME280_OSRS_H_x1 0x01 #define BME280_OSRS_H_x2 0x02 #define BME280_OSRS_H_x4 0x03 #define BME280_OSRS_H_x8 0x04 #define BME280_OSRS_H_x16 0x05 unsigned int dig_T1; int dig_T2; int dig_T3; unsigned int dig_P1; int dig_P2; int dig_P3; int dig_P4; int dig_P5; int dig_P6; int dig_P7; int dig_P8; int dig_P9; unsigned char dig_H1; int dig_H2; unsigned char dig_H3; int dig_H4; int dig_H5; char dig_H6; extern int temp_in; extern int hum_in; extern int press_in; uint32_t t_fine; //*************************************************************************************** //* Init //*************************************************************************************** char BME280_Init() { unsigned char tmp[24]; int del=100; // Soft reset Write_byte_I2C(BME280,BME280_SOFTRESET,BME280_RESET_CODE); do { del--;delay(1); } while (Read_byte_I2C(BME280,BME280_STATUS) & BME280_UPDATE && del); if(!del) return -1; // Read trimming parameters Read_I2C(BME280,0x88,24,tmp); dig_T1=(unsigned int) tmp[1]<<8 | tmp[0]; dig_T2=(int) tmp[3]<<8 | tmp[2]; dig_T3=tmp[5]<<8 | tmp[4]; // dig_P1=(unsigned int) tmp[7]<<8 | tmp[6]; dig_P2=(int) tmp[9]<<8 | tmp[8]; dig_P3=(int) tmp[11]<<8 | tmp[10]; dig_P4=(int) tmp[13]<<8 | tmp[12]; dig_P5=(int) tmp[15]<<8 | tmp[14]; dig_P6=(int) tmp[17]<<8 | tmp[16]; dig_P7=(int) tmp[19]<<8 | tmp[18]; dig_P8=(int) tmp[21]<<8 | tmp[20]; dig_P9=(int) tmp[23]<<8 | tmp[22]; // dig_H1=Read_byte_I2C(BME280,0xA1); Read_I2C(BME280,0xE1,7,tmp); dig_H2=(int) tmp[1]<<8 | tmp[0]; dig_H3=tmp[2]; dig_H4=(int) (tmp[3] << 4) | (tmp[4] & 0x0F); dig_H5=(int) (tmp[5] << 4) | ((tmp[4] >> 4) & 0x0F); dig_H6=tmp[6]; // Init Write_byte_I2C(BME280,BME280_CTRL_HUM,BME280_OSRS_H_x4); Write_byte_I2C(BME280,BME280_CTRL_MEAS,BME280_OSRS_T_x4 | BME280_OSRS_P_x4); Write_byte_I2C(BME280,BME280_CONFIG,BME280_STBY_1000 | BME280_FILTER_4); Write_byte_I2C(BME280,BME280_CTRL_MEAS,BME280_OSRS_T_x4 | BME280_OSRS_P_x4 | BME280_MODE_FORCED); return 0; } //*************************************************************************************** //* Чтение температуры //*************************************************************************************** void Read_Temp(uint32_t temp_raw) { int32_t var1, var2; var1 = ((((temp_raw>>3)-((int32_t)dig_T1<<1)))*((int32_t)dig_T2))>>11; var2 = (((((temp_raw>>4)-((int32_t)dig_T1))*((temp_raw>>4)-((int32_t)dig_T1)))>>12)*((int32_t)dig_T3))>>14; t_fine = var1 + var2; temp_in = (t_fine * 5 + 128) >> 8; temp_in=temp_in/100; } //*************************************************************************************** //* Чтение давления //*************************************************************************************** void Read_Pressure(uint32_t press_raw) { int64_t var1, var2, p; uint32_t t; var1 = ((int64_t)t_fine)-128000; var2 = var1 * var1 * (int64_t)dig_P6; var2 = var2 + ((var1*(int64_t)dig_P5)<<17); var2 = var2 + (((int64_t)dig_P4)<<35); var1 = ((var1 * var1 * (int64_t)dig_P3)>>8) + ((var1 * (int64_t)dig_P2)<<12); var1 = (((((int64_t)1)<<47)+var1))*((int64_t)dig_P1)>>33; if (var1 == 0) return; // avoid exception caused by division by zero p = 1048576-press_raw; p = (((p<<31)-var2)*3125)/var1; var1 = (((int64_t)dig_P9) * (p>>13) * (p>>13)) >> 25; var2 = (((int64_t)dig_P8) * p) >> 19; p = ((p + var1 + var2) >> 8) + (((int64_t)dig_P7)<<4); t=((int32_t)p)/256; t*=1000; t/=133322; press_in=t; } //*************************************************************************************** //* Чтение влажности //*************************************************************************************** void Read_Hum(uint32_t hum_raw) { int32_t var1; var1 = (t_fine - ((int32_t)76800)); var1 = (((((hum_raw << 14) - (((int32_t)dig_H4) << 20) - (((int32_t)dig_H5) * var1)) + ((int32_t)16384)) >> 15) * (((((((var1 * ((int32_t)dig_H6)) >> 10) * (((var1 * ((int32_t)dig_H3)) >> 11) + ((int32_t)32768))) >> 10) + ((int32_t)2097152)) * ((int32_t)dig_H2) + 8192) >> 14)); var1 = (var1 - (((((var1 >> 15) * (var1 >> 15)) >> 7) * ((int32_t)dig_H1)) >> 4)); var1 = (var1 < 0 ? 0 : var1); var1 = (var1 > 419430400 ? 419430400 : var1); hum_in = ((uint32_t)(var1 >> 12))/1024; } //*************************************************************************************** //* Чтение всех значение из BME280 //*************************************************************************************** void Read_BME280() { // Restart Write_byte_I2C(BME280,BME280_CTRL_MEAS,BME280_OSRS_T_x4 | BME280_OSRS_P_x4 | BME280_MODE_FORCED); int32_t temp; unsigned char tmp[3]; // Read_I2C(BME280,BME280_TEMP,3,tmp); temp=(int32_t)tmp[0]<<12 | tmp[1]<<4 | tmp[2]>>4; if(temp==0x8220){temp_in=32767;return;} Read_Temp(temp); // Read_I2C(BME280,BME280_PRESS,3,tmp); temp=(int32_t)tmp[0]<<12 | tmp[1]<<4 | tmp[2]>>4; Read_Pressure(temp); // Read_I2C(BME280,BME280_HUM,2,tmp); temp=(int32_t)tmp[0]<<8 | tmp[1]; Read_Hum(temp); }Общие подпрограммы ввода-вывода и служебные:
//*************************************************************************************** // Заголовок, файл *.h unsigned char calc_day(); void Write_Scr(); unsigned char input_str(); void write_all_data(unsigned char *data); // Файл реализации *.cpp #include "Arduino.h" #include <avr/pgmspace.h> #include "flash_pic.h" #include "mDHT.h" #include "mST7290.h" #define DS3231 0x68 extern unsigned char buffer[]; extern unsigned char ds[]; extern unsigned int temp_out; extern unsigned int hum_out; extern unsigned char cmd,arg1,arg2,arg3; extern unsigned char sound_en,sound_on,sound_off; extern int temp_in; extern int hum_in; extern int press_in; extern unsigned char bold; extern char hum_corr; //*************************************************************************************** //* Вычисление дня недели //*************************************************************************************** unsigned char calc_day() { const char months[]={5,1,1,4,6,2,4,0,3,5,1,3}; int year=(ds[6]/16)*10+(ds[6]%16)+2000; char month=(ds[5]/16)*10+(ds[5]%16); char date=(ds[4]/16)*10+(ds[4]%16); // Високостный год if(!(year%4) && month<3) month=months[month-1]-1; else month=months[month-1]; int day=year+year/4+month+date; day=(day%7)+1; return (unsigned char)day; } //*************************************************************************************** // Вывод параметров на терминал //*************************************************************************************** void write_all_data(unsigned char *data) { // Время if(data[2]<0x10) Serial.print('0'); Serial.print(data[2],HEX); Serial.print(':'); if(data[1]<0x10) Serial.print('0'); Serial.print(data[1],HEX); Serial.print(':'); if(data[0]<0x10) Serial.print('0'); Serial.println(data[0],HEX); // Дата if(data[4]<0x10) Serial.print('0'); Serial.print(data[4],HEX); Serial.print('.'); if(data[5]<0x10) Serial.print('0'); Serial.print(data[5],HEX); Serial.print('.'); if(data[6]<0x10) Serial.print('0'); Serial.print(data[6],HEX); Serial.print('-'); Serial.println(data[3],HEX); // Сигнал каждый час Serial.print("Signal every hour - "); if(sound_en) Serial.println("ON"); else Serial.println("OFF"); Serial.print("ON: "); if(sound_on<0x10) Serial.print('0'); Serial.println(sound_on,HEX); Serial.print("OFF:"); if(sound_off<0x10) Serial.print('0'); Serial.println(sound_off,HEX); Serial.print("Humidity correction = "); Serial.println(hum_corr,DEC); Serial.print("Bold: "); if(bold) Serial.println("ON"); else Serial.println("OFF"); } //*************************************************************************************** //* Пропуск пустых значений //*************************************************************************************** void skip_blank() { while(Serial.peek()==' ') Serial.read(); } //*************************************************************************************** //* Чтение команды //*************************************************************************************** void read_cmd() { skip_blank(); cmd=Serial.read(); if(cmd>='a') cmd-=0x20; skip_blank(); } //*************************************************************************************** //* Проверка символа на цифру //*************************************************************************************** unsigned char test_char(unsigned char tmp) { if(0x2F<tmp && tmp<0x3A) return 0; else return 1; } //*************************************************************************************** //* Проверка разделителя //*************************************************************************************** unsigned char test_spare(unsigned char tmp) { if(!(tmp=='.' || tmp==':' || tmp=='-' || tmp==' ' || tmp==','))return 1; else return 0; } //*************************************************************************************** //* Чтение параметра от 0 до 99 //* При ошибке возвращается 0xFF //*************************************************************************************** unsigned char read_arg() { unsigned char tmp,arg; arg=Serial.read(); if(test_char(arg)) return 0xFF; arg-=0x30; tmp=Serial.peek(); if(test_char(tmp)) return arg; arg=arg*16+(Serial.read()-0x30); tmp=Serial.peek(); if(!test_char(tmp)) return 0xFF; return arg; } //*************************************************************************************** //* Чтение команды К, значение -9...+9 //*************************************************************************************** char read_corr() { char tmp; arg2=arg3=0; tmp=Serial.read(); if(tmp=='-') { tmp=Serial.read(); if(!test_char(tmp)) tmp-=0x30; if(test_char(Serial.read())) { arg1=0-tmp; return 0; } else return 1; } if(!test_char(tmp)) tmp-=0x30; if(test_char(Serial.read())) { arg1=tmp; return 0; } else return 1; } //*************************************************************************************** //* Чтение 3 аргументов с разделителями //*************************************************************************************** unsigned char read_args() { // Получение 1 параметра arg1=read_arg();if(arg1==0xFF) return 1; if(test_spare(Serial.read()))return 2; // Получение 2 параметра arg2=read_arg();if(arg2==0xFF) return 3; if(test_spare(Serial.read()))return 4; // Получение 3 параметра arg3=read_arg();if(arg3==0xFF) return 5; return 0; } //*************************************************************************************** //* Разбор входной строки //*************************************************************************************** unsigned char input_str() { unsigned char tmp=0xFF; // Разбор командной строки delay(100); Serial.print("Recive "); Serial.print(Serial.available(),DEC); Serial.println(" bytes."); read_cmd(); if(cmd=='R') tmp=0; if(cmd=='K') tmp=read_corr(); if(cmd=='B') { arg1=tmp=read_arg(); if(tmp!=0xFF)tmp=0; } // Команды T,D,S if(cmd=='T' || cmd=='D' || cmd=='S') tmp=read_args(); if(!tmp) { Serial.print("CMD=");Serial.println((char) cmd); Serial.print("ARG1=");Serial.println(arg1,HEX); Serial.print("ARG2=");Serial.println(arg2,HEX); Serial.print("ARG3=");Serial.println(arg3,HEX); Serial.println("OK:0"); } else { Serial.print("ERR:"); Serial.println(tmp,DEC); } while(Serial.available()) Serial.read(); return tmp; } //*************************************************************************************** //* Вывод большого символа в буфер //*************************************************************************************** void Write_Big_Char(unsigned int x, unsigned int y, unsigned int c) { unsigned int sh,ch; //unsigned int ch; y*=16; sh=x/8;x=(x-sh*8)%8; c*=2; for(int i=0;i<24;i++) { if(bold) ch=pgm_read_byte_near(digit_big_bold+c)<<(8-x); else ch=pgm_read_byte_near(digit_big+c)<<(8-x); buffer[y+sh] |=ch>>8; buffer[y+sh+1] |=ch; if(bold) ch=pgm_read_byte_near(digit_big_bold+c+1)<<(8-x); else ch=pgm_read_byte_near(digit_big+c+1)<<(8-x); buffer[y+sh+1] |=ch>>8; buffer[y+sh+2] |=ch; y+=16;c+=20; } } //*************************************************************************************** //* Вывод символа в буфер //*************************************************************************************** void Write_Char(unsigned int x, unsigned int y, unsigned int c) { unsigned char sh; unsigned int ch; if(y>32) y-=32; y*=16; sh=x/8;x=(x-sh*8)%8; for(int i=0;i<12;i++) { ch=pgm_read_byte_near(digit+c)<<(8-x); buffer[y+sh] |=ch>>8; buffer[y+sh+1] |=ch; y+=16;c+=19; } } //*************************************************************************************** //* Вывод фазы луны 0-29 //*************************************************************************************** void Write_Moon() { static char old_day=-1; static unsigned int phase; unsigned int year=2000; unsigned char month,date; double i,j; // Вычисление фазы луны if(old_day!=ds[4]) { year+=(ds[6]>>4)*10+(ds[6] & 0xF); month=(ds[5]>>4)*10+(ds[5] & 0xF); date=(ds[4]>>4)*10+(ds[4] & 0xF); if(month<3) year--; i=modf(year/19.0,&j); i=round(i*209); i+=month; if(month<3) i+=12; i-=3;i+=date; i=modf(i/30.0,&j); i=round(i*30); phase=(unsigned char) i; old_day=ds[4]; } // Вывод фазы луны int pos=28,z,pos_m; pos_m=phase*4; for(int i=0;i<30;i++) { z=pos; for(int j=0;j<4;j++) { buffer[pos++]=pgm_read_byte_near(moon+pos_m); pos_m++; } pos=z+16;pos_m+=116; } } //*************************************************************************************** //* Вывод дня недели //*************************************************************************************** void Write_Day(unsigned char day) { char c1=18,c2=18; if(day==1) {c1=10;c2=11;} // ВС if(day==2) {c1=12;c2=13;} // ПН if(day==3) {c1=10;c2=14;} // ВТ if(day==4) {c1=11;c2=15;} // СР if(day==5) {c1=04;c2=14;} // ЧТ if(day==6) {c1=12;c2=14;} // ПТ if(day==7) {c1=11;c2=16;} // СБ Write_Char(0,10,c1); Write_Char(8,10,c2); } //*************************************************************************************** //* Вывод данных в буфер //*************************************************************************************** void Write_Scr() { // Верхняя часть экрана for(int i=0;i<512;i++) buffer[i]=pgm_read_byte_near(main_screen+i); // Мигание точек if(ds[0] & 1) { buffer[117]=0;buffer[133]=0; buffer[373]=0;buffer[389]=0; } // День недели Write_Day(ds[3]); // Время if(ds[2]>9) Write_Big_Char(17,4,ds[2]>>4); Write_Big_Char(30,4,ds[2] & 0xF); Write_Big_Char(48,4,ds[1]>>4); Write_Big_Char(61,4,ds[1] & 0xF); // Дата Write_Char(75,2,ds[4]>>4); Write_Char(83,2,ds[4] & 0xF); Write_Char(75,18,ds[5]>>4); Write_Char(83,18,ds[5] & 0xF); // Фаза луны Write_Moon(); Write_Low_Buffer(); // Нижняя часть экрана int j=0; for(int i=512;i<1024;i++) buffer[j++]=pgm_read_byte_near(main_screen+i); // Температура и влажность на улице if(temp_out==32767) { // Ошибка датчика Write_Char(0,36,18); Write_Char(9,36,18); Write_Char(17,36,18); Write_Char(9,50,18); Write_Char(17,50,18); } else { int tmp=temp_out; if(temp_out & 0x8000){Write_Char(0,36,18);tmp=temp_out & 0x7FFF;} else Write_Char(0,36,17); if(tmp>9) Write_Char(9,36,tmp/10); Write_Char(17,36,tmp % 10); j=hum_out+(int)hum_corr; Write_Char(9,50,j/10); Write_Char(17,50,j % 10); } // Температура и влажность в доме if(temp_in==32767) { // Ошибка датчика Write_Char(87,36,18); Write_Char(95,36,18); Write_Char(103,36,18); Write_Char(95,50,18); Write_Char(103,50,18); // Давление Write_Char(52,52,18); Write_Char(60,52,18); Write_Char(68,52,18); Write_High_Buffer(); } else { Write_Char(87,36,17); Write_Char(95,36,temp_in/10); Write_Char(103,36,temp_in%10); Write_Char(95,50,hum_in/10); Write_Char(103,50,hum_in%10); // Давление Write_Char(52,52,press_in/100); Write_Char(60,52,(press_in%100)/10); Write_Char(68,52,press_in%10); Write_High_Buffer(); } }Шрифты, фоновое изображение, фазы луны:
// П Н В Т С Р Ч Т П T С Б + - // 12,13,10,14,11,15,04,14,12,14,11,16,17,18 // Size: 8x12 // 0123456789ВСПНТРБ+- const unsigned char digit[] PROGMEM = { 0x7C,0x10,0xFC,0xFC,0x82,0x7E,0x7E,0xFC,0x7C,0x7C,0xFC,0x7E,0x7C,0x82,0xEC,0x7C, 0x7E,0x00,0x00,0xBA,0x18,0x7A,0x7A,0xC6,0xBC,0xBC,0x7A,0xBA,0xBA,0xBA,0xBC,0xBA, 0xC6,0x7E,0x5A,0xBC,0x00,0x00,0xC6,0x18,0x06,0x06,0xC6,0xC0,0xC0,0x06,0xC6,0xC6, 0xC6,0xC0,0xC6,0xC6,0x10,0x66,0xC0,0x00,0x00,0xC6,0x18,0x06,0x06,0xC6,0xC0,0xC0, 0x06,0xC6,0xC6,0xC6,0xC0,0xC6,0xC6,0x18,0x66,0xC0,0x30,0x00,0xC6,0x18,0x06,0x06, 0xC6,0xC0,0xC0,0x06,0xC6,0xC6,0xC6,0xC0,0xC6,0xC6,0x18,0x66,0xC0,0x30,0x00,0x82, 0x08,0x3A,0x7A,0xBA,0xBC,0xBC,0x06,0x7A,0xBA,0xBA,0x80,0x42,0xBA,0x08,0x5A,0xB8, 0xDC,0xF8,0x44,0x10,0x7C,0x7C,0x7C,0x7A,0x7A,0x04,0xFC,0x7C,0x7C,0x40,0x84,0x7C, 0x10,0x3C,0x7C,0xEC,0x7C,0xC6,0x18,0xC0,0x06,0x02,0x06,0xC6,0x06,0xC6,0x06,0xC6, 0xC0,0xC6,0xC6,0x18,0x60,0xC6,0x30,0x00,0xC6,0x18,0xC0,0x06,0x06,0x06,0xC6,0x06, 0xC6,0x06,0xC6,0xC0,0xC6,0xC6,0x18,0x60,0xC6,0x30,0x00,0xC6,0x18,0xC0,0x06,0x06, 0x06,0xC6,0x06,0xC6,0x06,0xC6,0xC0,0xC6,0xC6,0x18,0x60,0xC6,0x00,0x00,0xBA,0x18, 0xBC,0x7A,0x06,0x7A,0xBA,0x06,0xBA,0x7A,0xBA,0xBC,0xC6,0xC6,0x18,0x60,0xBA,0x00, 0x00,0x7C,0x08,0x7E,0xFC,0x02,0xFC,0x7C,0x04,0x7C,0xFC,0xFC,0x7E,0x82,0x82,0x08, 0x40,0xFC,0x00,0x00 }; const unsigned char digit_big_bold[] PROGMEM = { 0x7F,0xE0,0x01,0x00,0xFF,0xE0,0xFF,0xE0,0x80,0x10,0x7F,0xF0,0x7F,0xE0,0xFF,0xE0, 0x7F,0xE0,0x7F,0xE0,0xBF,0xD0,0x03,0x80,0x7F,0xD0,0x7F,0xD0,0xC0,0x30,0xBF,0xE0, 0xBF,0xF0,0x7F,0xD0,0xBF,0xD0,0xBF,0xD0,0xDF,0xB0,0x03,0x80,0x3F,0xB0,0x3F,0xB0, 0xE0,0x70,0xDF,0xC0,0xDF,0xE0,0x3F,0xB0,0xDF,0xB0,0xDF,0xB0,0xE0,0x70,0x03,0x80, 0x00,0x70,0x00,0x70,0xE0,0x70,0xE0,0x00,0xE0,0x00,0x00,0x70,0xE0,0x30,0xE0,0x70, 0xE0,0x70,0x03,0x80,0x00,0x70,0x00,0x70,0xE0,0x70,0xE0,0x00,0xE0,0x00,0x00,0x70, 0xE0,0x30,0xE0,0x70,0xE0,0x70,0x03,0x80,0x00,0x70,0x00,0x70,0xE0,0x70,0xE0,0x00, 0xE0,0x00,0x00,0x70,0xE0,0x30,0xE0,0x70,0xE0,0x70,0x03,0x80,0x00,0x70,0x00,0x70, 0xE0,0x70,0xE0,0x00,0xE0,0x00,0x00,0x70,0xE0,0x30,0xE0,0x70,0xE0,0x70,0x03,0x80, 0x00,0x70,0x00,0x70,0xE0,0x70,0xE0,0x00,0xE0,0x00,0x00,0x70,0xE0,0x30,0xE0,0x70, 0xE0,0x70,0x03,0x80,0x00,0x70,0x00,0x70,0xE0,0x70,0xE0,0x00,0xE0,0x00,0x00,0x70, 0xE0,0x30,0xE0,0x70,0xE0,0x70,0x03,0x80,0x00,0x70,0x00,0x70,0xE0,0x70,0xE0,0x00, 0xE0,0x00,0x00,0x70,0xE0,0x30,0xE0,0x70,0xE0,0x70,0x03,0x80,0x1F,0xB0,0x3F,0xA0, 0xDF,0xA0,0xDF,0xE0,0x5F,0xE0,0x00,0x20,0x5F,0xA0,0xDF,0xA0,0xE0,0x70,0x01,0x00, 0x3F,0xD0,0x7F,0xF0,0xBF,0xC0,0xBF,0xD0,0x3F,0xD0,0x00,0x50,0xFF,0xF0,0xBF,0xF0, 0xE0,0x70,0x03,0x80,0x5F,0xE0,0x3F,0xA0,0x7F,0xA0,0x7F,0xB0,0x5F,0xB0,0x00,0x20, 0x5F,0xA0,0x7F,0xA0,0xE0,0x70,0x03,0x80,0xE0,0x00,0x00,0x70,0x00,0x70,0x00,0x70, 0xE0,0x70,0x00,0x70,0xE0,0x70,0x00,0x70,0xE0,0x70,0x03,0x80,0xE0,0x00,0x00,0x70, 0x00,0x70,0x00,0x70,0xE0,0x70,0x00,0x70,0xE0,0x70,0x00,0x70,0xE0,0x70,0x03,0x80, 0xE0,0x00,0x00,0x70,0x00,0x70,0x00,0x70,0xE0,0x70,0x00,0x70,0xE0,0x70,0x00,0x70, 0xE0,0x70,0x03,0x80,0xE0,0x00,0x00,0x70,0x00,0x70,0x00,0x70,0xE0,0x70,0x00,0x70, 0xE0,0x70,0x00,0x70,0xE0,0x70,0x03,0x80,0xE0,0x00,0x00,0x70,0x00,0x70,0x00,0x70, 0xE0,0x70,0x00,0x70,0xE0,0x70,0x00,0x70,0xE0,0x70,0x03,0x80,0xE0,0x00,0x00,0x70, 0x00,0x70,0x00,0x70,0xE0,0x70,0x00,0x70,0xE0,0x70,0x00,0x70,0xE0,0x70,0x03,0x80, 0xE0,0x00,0x00,0x70,0x00,0x70,0x00,0x70,0xE0,0x70,0x00,0x70,0xE0,0x70,0x00,0x70, 0xE0,0x70,0x03,0x80,0xE0,0x00,0x00,0x70,0x00,0x70,0x00,0x70,0xE0,0x70,0x00,0x70, 0xE0,0x70,0x00,0x70,0xDF,0xB0,0x03,0x80,0xDF,0xC0,0x3F,0xB0,0x00,0x70,0x3F,0xB0, 0xDF,0xB0,0x00,0x70,0xDF,0xB0,0x3F,0xB0,0xBF,0xD0,0x03,0x80,0xBF,0xE0,0x7F,0xD0, 0x00,0x70,0x7F,0xD0,0xBF,0xD0,0x00,0x30,0xBF,0xD0,0x7F,0xD0,0x7F,0xE0,0x01,0x00, 0x7F,0xF0,0xFF,0xE0,0x00,0x20,0xFF,0xE0,0x7F,0xE0,0x00,0x10,0x7F,0xE0,0xFF,0xE0 }; const unsigned char digit_big[] PROGMEM = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3F,0xC0,0x02,0x00,0x3F,0xE0,0x7F,0xC0,0x40,0x20,0x3F,0xE0, 0x3F,0xE0,0x7F,0xC0,0x3F,0xC0,0x3F,0xC0,0x5F,0xA0,0x03,0x00,0x1F,0xD0,0x3F,0xA0, 0x60,0x60,0x5F,0xC0,0x5F,0xC0,0x3F,0xA0,0x5F,0xA0,0x5F,0xA0,0x60,0x60,0x03,0x00, 0x00,0x30,0x00,0x60,0x60,0x60,0x60,0x00,0x60,0x00,0x00,0x60,0x60,0x60,0x60,0x60, 0x60,0x60,0x03,0x00,0x00,0x30,0x00,0x60,0x60,0x60,0x60,0x00,0x60,0x00,0x00,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x03,0x00,0x00,0x30,0x00,0x60,0x60,0x60,0x60,0x00, 0x60,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x03,0x00,0x00,0x30,0x00,0x60, 0x60,0x60,0x60,0x00,0x60,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x03,0x00, 0x00,0x30,0x00,0x60,0x60,0x60,0x60,0x00,0x60,0x00,0x00,0x60,0x60,0x60,0x60,0x60, 0x60,0x60,0x03,0x00,0x00,0x30,0x00,0x60,0x60,0x60,0x60,0x00,0x60,0x00,0x00,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x03,0x00,0x00,0x30,0x00,0x60,0x60,0x60,0x60,0x00, 0x60,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x03,0x00,0x00,0x10,0x00,0x20, 0x40,0x20,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x60,0x40,0x20,0x40,0x20,0x01,0x00, 0x1F,0xE0,0x7F,0xC0,0x3F,0xC0,0x3F,0xC0,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x3F,0xC0, 0x20,0x40,0x02,0x00,0x2F,0xF0,0x3F,0xA0,0x7F,0xA0,0x7F,0xA0,0x5F,0xA0,0x00,0x60, 0x5F,0xA0,0x7F,0xA0,0x60,0x60,0x03,0x00,0x30,0x00,0x00,0x60,0x00,0x60,0x00,0x60, 0x60,0x60,0x00,0x60,0x60,0x60,0x00,0x60,0x60,0x60,0x03,0x00,0x30,0x00,0x00,0x60, 0x00,0x60,0x00,0x60,0x60,0x60,0x00,0x60,0x60,0x60,0x00,0x60,0x60,0x60,0x03,0x00, 0x30,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x60,0x60,0x00,0x60,0x60,0x60,0x00,0x60, 0x60,0x60,0x03,0x00,0x30,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x60,0x60,0x00,0x60, 0x60,0x60,0x00,0x60,0x60,0x60,0x03,0x00,0x30,0x00,0x00,0x60,0x00,0x60,0x00,0x60, 0x60,0x60,0x00,0x60,0x60,0x60,0x00,0x60,0x60,0x60,0x03,0x00,0x30,0x00,0x00,0x60, 0x00,0x60,0x00,0x60,0x60,0x60,0x00,0x60,0x60,0x60,0x00,0x60,0x60,0x60,0x03,0x00, 0x30,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x60,0x60,0x00,0x60,0x60,0x60,0x00,0x60, 0x60,0x60,0x03,0x00,0x30,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x60,0x60,0x00,0x60, 0x60,0x60,0x00,0x60,0x5F,0xA0,0x03,0x00,0x2F,0xE0,0x3F,0xA0,0x00,0x60,0x3F,0xA0, 0x5F,0xA0,0x00,0x60,0x5F,0xA0,0x3F,0xA0,0x3F,0xC0,0x01,0x00,0x1F,0xF0,0x7F,0xC0, 0x00,0x20,0x7F,0xC0,0x3F,0xC0,0x00,0x20,0x3F,0xC0,0x7F,0xC0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; const unsigned char main_screen[] PROGMEM = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xC8,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xC8,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0xA5,0x00,0xEE,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0xF8,0x00,0x6D,0x29,0x01,0xB2,0x00,0x00,0x00,0x00,0x07,0xE0, 0x00,0x00,0x00,0x32,0xF0,0x00,0x49,0x49,0x03,0x1A,0x00,0x00,0x00,0x00,0xCB,0xC0, 0x00,0x00,0x00,0x33,0x00,0x00,0x3A,0x11,0x06,0x0C,0x00,0x00,0x00,0x00,0xCC,0x00, 0x00,0x00,0x00,0x03,0x00,0x01,0x94,0xA1,0x0C,0x06,0x00,0x00,0x00,0x00,0x0C,0x00, 0x00,0x00,0x00,0x03,0x00,0x01,0x54,0x21,0x19,0xF3,0x00,0x00,0x00,0x00,0x0C,0x00, 0x00,0x00,0x00,0x02,0x00,0x03,0x4A,0x41,0x09,0x52,0x00,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x00,0x01,0x00,0x02,0xCA,0x59,0x09,0x52,0x00,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x00,0x03,0x00,0x01,0x90,0xB5,0x09,0xF2,0x00,0x00,0x00,0x00,0x0C,0x00, 0x00,0x00,0x00,0x03,0x00,0x00,0xA5,0x25,0x08,0x02,0x00,0x00,0x00,0x00,0x0C,0x00, 0x00,0x00,0x00,0x03,0x00,0x00,0xA9,0x55,0x09,0xF2,0x00,0x00,0x00,0x00,0x0C,0x00, 0x00,0x00,0x00,0x02,0xF0,0x00,0x42,0x39,0x09,0x12,0x00,0x00,0x00,0x00,0x0B,0xC0, 0x00,0x00,0x00,0x01,0xF8,0x00,0x94,0x11,0x09,0x12,0x00,0x00,0x00,0x00,0x07,0xE0, 0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x11,0x0F,0x1E,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0C,0x18,0x03,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x30,0x60, 0x00,0x00,0x00,0x1E,0x30,0x02,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x78,0xC0, 0x00,0x00,0x00,0x33,0x30,0x02,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xCC,0xC0, 0x00,0x00,0x00,0x33,0x60,0x02,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xCD,0x80, 0x00,0x00,0x00,0x1E,0x40,0x02,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x79,0x00, 0x00,0x00,0x00,0x0C,0x00,0x02,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x30,0x00, 0x00,0x00,0x00,0x00,0x8C,0x02,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x02,0x30, 0x00,0x00,0x00,0x01,0x9E,0x02,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x06,0x78, 0x00,0x00,0x00,0x03,0x33,0x02,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x0C,0xCC, 0x00,0x00,0x00,0x03,0x33,0x02,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x0C,0xCC, 0x00,0x00,0x00,0x06,0x1E,0x02,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x18,0x78, 0x00,0x00,0x00,0x04,0x0C,0x02,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x10,0x30, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00 }; const unsigned char moon[] PROGMEM = { // Bit per pixel:1 // Picture size: 960x30 // Color index: // Index 0: R=255,G=255,B=255 // Index 1: R=0,G=0,B=0 0x00,0x07,0xF8,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x01,0xF8,0x00, 0x00,0x07,0xF8,0x00,0x00,0x07,0xF8,0x00,0x00,0x0F,0xF8,0x00,0x00,0x00,0x78,0x00, 0x00,0x00,0x38,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xF8,0x00,0x00,0x01,0xF8,0x00, 0x00,0x07,0xF8,0x00,0x00,0x07,0xF8,0x00,0x00,0x0F,0xFC,0x00,0x00,0x07,0xF8,0x00, 0x00,0x0F,0xFC,0x00,0x00,0x07,0xF8,0x00,0x00,0x07,0xF8,0x00,0x00,0x07,0xE0,0x00, 0x00,0x07,0xC0,0x00,0x00,0x07,0x80,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x80,0x00, 0x00,0x07,0xFC,0x00,0x00,0x07,0xF8,0x00,0x00,0x07,0xF8,0x00,0x00,0x07,0xE0,0x00, 0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00,0x00,0x18,0x06,0x00,0x00,0x00,0x1E,0x00, 0x00,0x00,0x3E,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x03,0xFE,0x00, 0x00,0x07,0xFE,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0xFE,0x00, 0x00,0x01,0xFE,0x00,0x00,0x03,0xFE,0x00,0x00,0x1F,0xFE,0x00,0x00,0x1F,0xFE,0x00, 0x00,0x1F,0xFE,0x00,0x00,0x1F,0xFE,0x00,0x00,0x1F,0xFE,0x00,0x00,0x1F,0xFE,0x00, 0x00,0x1F,0xFE,0x00,0x00,0x1F,0xF0,0x00,0x00,0x1F,0xE0,0x00,0x00,0x1F,0xC0,0x00, 0x00,0x1F,0x80,0x00,0x00,0x1F,0x80,0x00,0x00,0x1F,0xF8,0x00,0x00,0x1F,0xF0,0x00, 0x00,0x1F,0xC0,0x00,0x00,0x1F,0xC0,0x00,0x00,0x1F,0x00,0x00,0x00,0x1E,0x00,0x00, 0x00,0x60,0x01,0x80,0x00,0x00,0x07,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x3F,0x80, 0x00,0x00,0x7F,0x80,0x00,0x01,0xFF,0x80,0x00,0x03,0xFF,0x80,0x00,0x00,0x7F,0x80, 0x00,0x00,0x7F,0x80,0x00,0x01,0xFF,0x80,0x00,0x03,0xFF,0x80,0x00,0x07,0xFF,0x80, 0x00,0x1F,0xFF,0x80,0x00,0x7F,0xFF,0x80,0x00,0x7F,0xFF,0x80,0x00,0x7F,0xFF,0x80, 0x00,0x7F,0xFF,0x80,0x00,0x7F,0xFF,0x80,0x00,0x7F,0xFE,0x00,0x00,0x7F,0xF8,0x00, 0x00,0x7F,0xF0,0x00,0x00,0x7F,0xE0,0x00,0x00,0x7F,0x80,0x00,0x00,0x7F,0x80,0x00, 0x00,0x7F,0xF0,0x00,0x00,0x7F,0xE0,0x00,0x00,0x7F,0x80,0x00,0x00,0x7F,0x00,0x00, 0x00,0x7C,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x01,0xC0, 0x00,0x00,0x07,0xC0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xC0, 0x00,0x01,0xFF,0xC0,0x00,0x00,0x7F,0xC0,0x00,0x00,0x7F,0xC0,0x00,0x01,0xFF,0xC0, 0x00,0x03,0xFF,0xC0,0x00,0x0F,0xFF,0xC0,0x00,0x3F,0xFF,0xC0,0x00,0x7F,0xFF,0xC0, 0x00,0xFF,0xFF,0xC0,0x00,0xFF,0xFF,0xC0,0x00,0xFF,0xFF,0xC0,0x00,0xFF,0xFF,0x80, 0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFC,0x00,0x00,0xFF,0xF0,0x00,0x00,0xFF,0xE0,0x00, 0x00,0xFF,0x80,0x00,0x00,0xFF,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xC0,0x00, 0x00,0xFF,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xE0,0x00,0x00, 0x01,0x00,0x00,0x20,0x00,0x00,0x00,0xE0,0x00,0x00,0x03,0xE0,0x00,0x00,0x0F,0xE0, 0x00,0x00,0x1F,0xE0,0x00,0x00,0x7F,0xE0,0x00,0x01,0xFF,0xE0,0x00,0x00,0x7F,0xE0, 0x00,0x00,0x7F,0xE0,0x00,0x03,0xFF,0xE0,0x00,0x07,0xFF,0xE0,0x00,0x1F,0xFF,0xE0, 0x00,0x3F,0xFF,0xE0,0x00,0xFF,0xFF,0xE0,0x01,0xFF,0xFF,0xE0,0x01,0xFF,0xFF,0xE0, 0x01,0xFF,0xFF,0xE0,0x01,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0x00,0x01,0xFF,0xFE,0x00, 0x01,0xFF,0xF8,0x00,0x01,0xFF,0xF0,0x00,0x01,0xFF,0x80,0x00,0x01,0xFF,0x80,0x00, 0x01,0xFF,0xE0,0x00,0x01,0xFF,0x80,0x00,0x01,0xFE,0x00,0x00,0x01,0xFC,0x00,0x00, 0x01,0xF0,0x00,0x00,0x01,0xC0,0x00,0x00,0x02,0x00,0x00,0x10,0x00,0x00,0x00,0x70, 0x00,0x00,0x01,0xF0,0x00,0x00,0x07,0xF0,0x00,0x00,0x1F,0xF0,0x00,0x00,0x3F,0xF0, 0x00,0x00,0xFF,0xF0,0x00,0x00,0x7F,0xF0,0x00,0x00,0xFF,0xF0,0x00,0x03,0xFF,0xF0, 0x00,0x07,0xFF,0xF0,0x00,0x1F,0xFF,0xF0,0x00,0x7F,0xFF,0xF0,0x00,0xFF,0xFF,0xF0, 0x03,0xFF,0xFF,0xF0,0x03,0xFF,0xFF,0xF0,0x03,0xFF,0xFF,0xF0,0x03,0xFF,0xFF,0xC0, 0x03,0xFF,0xFF,0x80,0x03,0xFF,0xFE,0x00,0x03,0xFF,0xF8,0x00,0x03,0xFF,0xF0,0x00, 0x03,0xFF,0xC0,0x00,0x03,0xFF,0x80,0x00,0x03,0xFF,0xC0,0x00,0x03,0xFF,0x00,0x00, 0x03,0xFE,0x00,0x00,0x03,0xF8,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0x80,0x00,0x00, 0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xF8,0x00,0x00,0x03,0xF8, 0x00,0x00,0x0F,0xF8,0x00,0x00,0x3F,0xF8,0x00,0x00,0xFF,0xF8,0x00,0x00,0x7F,0xF8, 0x00,0x00,0xFF,0xF8,0x00,0x03,0xFF,0xF8,0x00,0x0F,0xFF,0xF8,0x00,0x1F,0xFF,0xF8, 0x00,0x7F,0xFF,0xF8,0x01,0xFF,0xFF,0xF8,0x03,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xF8, 0x07,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0x80,0x07,0xFF,0xFE,0x00, 0x07,0xFF,0xFC,0x00,0x07,0xFF,0xF0,0x00,0x07,0xFF,0xC0,0x00,0x07,0xFF,0x80,0x00, 0x07,0xFF,0xC0,0x00,0x07,0xFF,0x00,0x00,0x07,0xFC,0x00,0x00,0x07,0xF0,0x00,0x00, 0x07,0xC0,0x00,0x00,0x07,0x80,0x00,0x00,0x08,0x00,0x00,0x04,0x00,0x00,0x00,0x3C, 0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xFC,0x00,0x00,0x0F,0xFC,0x00,0x00,0x1F,0xFC, 0x00,0x00,0x7F,0xFC,0x00,0x00,0x7F,0xFC,0x00,0x00,0xFF,0xFC,0x00,0x03,0xFF,0xFC, 0x00,0x0F,0xFF,0xFC,0x00,0x3F,0xFF,0xFC,0x00,0xFF,0xFF,0xFC,0x01,0xFF,0xFF,0xFC, 0x07,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xE0, 0x0F,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0x00,0x0F,0xFF,0xFC,0x00,0x0F,0xFF,0xF0,0x00, 0x0F,0xFF,0xC0,0x00,0x0F,0xFF,0x80,0x00,0x0F,0xFF,0x80,0x00,0x0F,0xFE,0x00,0x00, 0x0F,0xFC,0x00,0x00,0x0F,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x0F,0x00,0x00,0x00, 0x08,0x00,0x00,0x04,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x7C,0x00,0x00,0x01,0xFC, 0x00,0x00,0x07,0xFC,0x00,0x00,0x1F,0xFC,0x00,0x00,0x7F,0xFC,0x00,0x00,0x7F,0xFC, 0x00,0x00,0xFF,0xFC,0x00,0x03,0xFF,0xFC,0x00,0x0F,0xFF,0xFC,0x00,0x3F,0xFF,0xFC, 0x00,0xFF,0xFF,0xFC,0x03,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xFC, 0x0F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0x00, 0x0F,0xFF,0xFC,0x00,0x0F,0xFF,0xF0,0x00,0x0F,0xFF,0xC0,0x00,0x0F,0xFF,0x80,0x00, 0x0F,0xFF,0x80,0x00,0x0F,0xFE,0x00,0x00,0x0F,0xF8,0x00,0x00,0x0F,0xE0,0x00,0x00, 0x0F,0x80,0x00,0x00,0x0E,0x00,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x00,0x00,0x1E, 0x00,0x00,0x00,0x7E,0x00,0x00,0x01,0xFE,0x00,0x00,0x07,0xFE,0x00,0x00,0x1F,0xFE, 0x00,0x00,0x7F,0xFE,0x00,0x00,0x7F,0xFE,0x00,0x00,0xFF,0xFE,0x00,0x07,0xFF,0xFE, 0x00,0x1F,0xFF,0xFE,0x00,0x7F,0xFF,0xFE,0x00,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFE, 0x07,0xFF,0xFF,0xFE,0x1F,0xFF,0xFF,0xFE,0x1F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xF0, 0x1F,0xFF,0xFF,0xC0,0x1F,0xFF,0xFF,0x80,0x1F,0xFF,0xFE,0x00,0x1F,0xFF,0xF8,0x00, 0x1F,0xFF,0xC0,0x00,0x1F,0xFF,0x80,0x00,0x1F,0xFF,0x80,0x00,0x1F,0xFE,0x00,0x00, 0x1F,0xF8,0x00,0x00,0x1F,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x1E,0x00,0x00,0x00, 0x10,0x00,0x00,0x02,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x7E,0x00,0x00,0x01,0xFE, 0x00,0x00,0x07,0xFE,0x00,0x00,0x1F,0xFE,0x00,0x00,0x7F,0xFE,0x00,0x00,0x7F,0xFE, 0x00,0x00,0xFF,0xFE,0x00,0x07,0xFF,0xFE,0x00,0x1F,0xFF,0xFE,0x00,0x7F,0xFF,0xFE, 0x00,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFE,0x0F,0xFF,0xFF,0xFE,0x1F,0xFF,0xFF,0xFE, 0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xC0,0x1F,0xFF,0xFF,0x80, 0x1F,0xFF,0xFE,0x00,0x1F,0xFF,0xF8,0x00,0x1F,0xFF,0xC0,0x00,0x1F,0xFF,0x80,0x00, 0x1F,0xFF,0x80,0x00,0x1F,0xFE,0x00,0x00,0x1F,0xF8,0x00,0x00,0x1F,0xE0,0x00,0x00, 0x1F,0x80,0x00,0x00,0x1E,0x00,0x00,0x00,0x20,0x00,0x00,0x02,0x00,0x00,0x00,0x0E, 0x00,0x00,0x00,0x3E,0x00,0x00,0x01,0xFE,0x00,0x00,0x03,0xFE,0x00,0x00,0x0F,0xFE, 0x00,0x00,0x3F,0xFE,0x00,0x00,0x7F,0xFE,0x00,0x00,0xFF,0xFE,0x00,0x07,0xFF,0xFE, 0x00,0x1F,0xFF,0xFE,0x00,0x7F,0xFF,0xFE,0x01,0xFF,0xFF,0xFE,0x07,0xFF,0xFF,0xFE, 0x0F,0xFF,0xFF,0xFE,0x3F,0xFF,0xFF,0xFE,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xF8, 0x1F,0xFF,0xFF,0xE0,0x1F,0xFF,0xFF,0x80,0x1F,0xFF,0xFE,0x00,0x1F,0xFF,0xF8,0x00, 0x1F,0xFF,0xE0,0x00,0x1F,0xFF,0x80,0x00,0x1F,0xFF,0x00,0x00,0x1F,0xFC,0x00,0x00, 0x1F,0xF0,0x00,0x00,0x1F,0xE0,0x00,0x00,0x1F,0x00,0x00,0x00,0x1C,0x00,0x00,0x00, 0x20,0x00,0x00,0x01,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0xFF, 0x00,0x00,0x03,0xFF,0x00,0x00,0x0F,0xFF,0x00,0x00,0x3F,0xFF,0x00,0x00,0x7F,0xFF, 0x00,0x00,0xFF,0xFF,0x00,0x07,0xFF,0xFF,0x00,0x1F,0xFF,0xFF,0x00,0x7F,0xFF,0xFF, 0x01,0xFF,0xFF,0xFF,0x07,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFF, 0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xF8,0x3F,0xFF,0xFF,0xE0,0x3F,0xFF,0xFF,0x80, 0x3F,0xFF,0xFE,0x00,0x3F,0xFF,0xF8,0x00,0x3F,0xFF,0xE0,0x00,0x3F,0xFF,0x80,0x00, 0x3F,0xFF,0x00,0x00,0x3F,0xFC,0x00,0x00,0x3F,0xF0,0x00,0x00,0x3F,0xC0,0x00,0x00, 0x3F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x20,0x00,0x00,0x01,0x00,0x00,0x00,0x0F, 0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0xFF,0x00,0x00,0x03,0xFF,0x00,0x00,0x0F,0xFF, 0x00,0x00,0x3F,0xFF,0x00,0x00,0x7F,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x07,0xFF,0xFF, 0x00,0x1F,0xFF,0xFF,0x00,0x7F,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0x07,0xFF,0xFF,0xFF, 0x0F,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xF8, 0x3F,0xFF,0xFF,0xE0,0x3F,0xFF,0xFF,0x80,0x3F,0xFF,0xFE,0x00,0x3F,0xFF,0xF8,0x00, 0x3F,0xFF,0xE0,0x00,0x3F,0xFF,0x80,0x00,0x3F,0xFF,0x00,0x00,0x3F,0xFC,0x00,0x00, 0x3F,0xF0,0x00,0x00,0x3F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00, 0x20,0x00,0x00,0x01,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0xFF, 0x00,0x00,0x03,0xFF,0x00,0x00,0x0F,0xFF,0x00,0x00,0x3F,0xFF,0x00,0x00,0x7F,0xFF, 0x00,0x00,0xFF,0xFF,0x00,0x07,0xFF,0xFF,0x00,0x1F,0xFF,0xFF,0x00,0x7F,0xFF,0xFF, 0x01,0xFF,0xFF,0xFF,0x07,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFF, 0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xF8,0x3F,0xFF,0xFF,0xE0,0x3F,0xFF,0xFF,0x80, 0x3F,0xFF,0xFE,0x00,0x3F,0xFF,0xF8,0x00,0x3F,0xFF,0xE0,0x00,0x3F,0xFF,0x80,0x00, 0x3F,0xFF,0x00,0x00,0x3F,0xFC,0x00,0x00,0x3F,0xF0,0x00,0x00,0x3F,0xC0,0x00,0x00, 0x3F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x20,0x00,0x00,0x01,0x00,0x00,0x00,0x0F, 0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0xFF,0x00,0x00,0x03,0xFF,0x00,0x00,0x0F,0xFF, 0x00,0x00,0x3F,0xFF,0x00,0x00,0x7F,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x07,0xFF,0xFF, 0x00,0x1F,0xFF,0xFF,0x00,0x7F,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0x07,0xFF,0xFF,0xFF, 0x0F,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xF8, 0x3F,0xFF,0xFF,0xE0,0x3F,0xFF,0xFF,0x80,0x3F,0xFF,0xFE,0x00,0x3F,0xFF,0xF8,0x00, 0x3F,0xFF,0xE0,0x00,0x3F,0xFF,0x80,0x00,0x3F,0xFF,0x00,0x00,0x3F,0xFC,0x00,0x00, 0x3F,0xF0,0x00,0x00,0x3F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00, 0x20,0x00,0x00,0x01,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0xFF, 0x00,0x00,0x03,0xFF,0x00,0x00,0x0F,0xFF,0x00,0x00,0x3F,0xFF,0x00,0x00,0x7F,0xFF, 0x00,0x00,0xFF,0xFF,0x00,0x07,0xFF,0xFF,0x00,0x1F,0xFF,0xFF,0x00,0x7F,0xFF,0xFF, 0x01,0xFF,0xFF,0xFF,0x07,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFF, 0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xF8,0x3F,0xFF,0xFF,0xE0,0x3F,0xFF,0xFF,0x80, 0x3F,0xFF,0xFE,0x00,0x3F,0xFF,0xF8,0x00,0x3F,0xFF,0xE0,0x00,0x3F,0xFF,0x80,0x00, 0x3F,0xFF,0x00,0x00,0x3F,0xFC,0x00,0x00,0x3F,0xF0,0x00,0x00,0x3F,0xC0,0x00,0x00, 0x3F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x20,0x00,0x00,0x01,0x00,0x00,0x00,0x0F, 0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0xFF,0x00,0x00,0x03,0xFF,0x00,0x00,0x0F,0xFF, 0x00,0x00,0x3F,0xFF,0x00,0x00,0x7F,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x07,0xFF,0xFF, 0x00,0x1F,0xFF,0xFF,0x00,0x7F,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0x07,0xFF,0xFF,0xFF, 0x0F,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xF8, 0x3F,0xFF,0xFF,0xE0,0x3F,0xFF,0xFF,0x80,0x3F,0xFF,0xFE,0x00,0x3F,0xFF,0xF8,0x00, 0x3F,0xFF,0xE0,0x00,0x3F,0xFF,0x80,0x00,0x3F,0xFF,0x00,0x00,0x3F,0xFC,0x00,0x00, 0x3F,0xF0,0x00,0x00,0x3F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00, 0x20,0x00,0x00,0x02,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xFE, 0x00,0x00,0x03,0xFE,0x00,0x00,0x0F,0xFE,0x00,0x00,0x3F,0xFE,0x00,0x00,0x7F,0xFE, 0x00,0x00,0xFF,0xFE,0x00,0x07,0xFF,0xFE,0x00,0x1F,0xFF,0xFE,0x00,0x7F,0xFF,0xFE, 0x01,0xFF,0xFF,0xFE,0x07,0xFF,0xFF,0xFE,0x0F,0xFF,0xFF,0xFE,0x3F,0xFF,0xFF,0xFE, 0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xE0,0x1F,0xFF,0xFF,0x80, 0x1F,0xFF,0xFE,0x00,0x1F,0xFF,0xF8,0x00,0x1F,0xFF,0xC0,0x00,0x1F,0xFF,0x80,0x00, 0x1F,0xFF,0x00,0x00,0x1F,0xFC,0x00,0x00,0x1F,0xF0,0x00,0x00,0x1F,0xC0,0x00,0x00, 0x1F,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x00,0x00,0x1E, 0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0xFE,0x00,0x00,0x07,0xFE,0x00,0x00,0x1F,0xFE, 0x00,0x00,0x7F,0xFE,0x00,0x00,0x7F,0xFE,0x00,0x00,0xFF,0xFE,0x00,0x07,0xFF,0xFE, 0x00,0x1F,0xFF,0xFE,0x00,0x7F,0xFF,0xFE,0x00,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFE, 0x07,0xFF,0xFF,0xFE,0x1F,0xFF,0xFF,0xFE,0x1F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xF0, 0x1F,0xFF,0xFF,0xC0,0x1F,0xFF,0xFF,0x80,0x1F,0xFF,0xFE,0x00,0x1F,0xFF,0xF8,0x00, 0x1F,0xFF,0xC0,0x00,0x1F,0xFF,0x80,0x00,0x1F,0xFF,0x80,0x00,0x1F,0xFE,0x00,0x00, 0x1F,0xF8,0x00,0x00,0x1F,0xC0,0x00,0x00,0x1F,0x80,0x00,0x00,0x1E,0x00,0x00,0x00, 0x10,0x00,0x00,0x02,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x7E,0x00,0x00,0x01,0xFE, 0x00,0x00,0x07,0xFE,0x00,0x00,0x1F,0xFE,0x00,0x00,0x7F,0xFE,0x00,0x00,0x7F,0xFE, 0x00,0x00,0xFF,0xFE,0x00,0x07,0xFF,0xFE,0x00,0x1F,0xFF,0xFE,0x00,0x3F,0xFF,0xFE, 0x00,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFE,0x07,0xFF,0xFF,0xFE,0x1F,0xFF,0xFF,0xFE, 0x1F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xC0,0x1F,0xFF,0xFF,0x00, 0x1F,0xFF,0xFE,0x00,0x1F,0xFF,0xF8,0x00,0x1F,0xFF,0xC0,0x00,0x1F,0xFF,0x80,0x00, 0x1F,0xFF,0x80,0x00,0x1F,0xFE,0x00,0x00,0x1F,0xF8,0x00,0x00,0x1F,0xE0,0x00,0x00, 0x1F,0x80,0x00,0x00,0x1E,0x00,0x00,0x00,0x08,0x00,0x00,0x04,0x00,0x00,0x00,0x1C, 0x00,0x00,0x00,0x7C,0x00,0x00,0x01,0xFC,0x00,0x00,0x07,0xFC,0x00,0x00,0x1F,0xFC, 0x00,0x00,0x7F,0xFC,0x00,0x00,0x7F,0xFC,0x00,0x00,0xFF,0xFC,0x00,0x07,0xFF,0xFC, 0x00,0x0F,0xFF,0xFC,0x00,0x3F,0xFF,0xFC,0x00,0xFF,0xFF,0xFC,0x03,0xFF,0xFF,0xFC, 0x07,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF0, 0x0F,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0x00,0x0F,0xFF,0xFC,0x00,0x0F,0xFF,0xF8,0x00, 0x0F,0xFF,0xC0,0x00,0x0F,0xFF,0x80,0x00,0x0F,0xFF,0x80,0x00,0x0F,0xFE,0x00,0x00, 0x0F,0xF8,0x00,0x00,0x0F,0xE0,0x00,0x00,0x0F,0x80,0x00,0x00,0x0E,0x00,0x00,0x00, 0x08,0x00,0x00,0x04,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xFC,0x00,0x00,0x01,0xFC, 0x00,0x00,0x07,0xFC,0x00,0x00,0x1F,0xFC,0x00,0x00,0x7F,0xFC,0x00,0x00,0x7F,0xFC, 0x00,0x00,0xFF,0xFC,0x00,0x03,0xFF,0xFC,0x00,0x0F,0xFF,0xFC,0x00,0x3F,0xFF,0xFC, 0x00,0xFF,0xFF,0xFC,0x03,0xFF,0xFF,0xFC,0x03,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xFC, 0x0F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0x00, 0x0F,0xFF,0xFC,0x00,0x0F,0xFF,0xF0,0x00,0x0F,0xFF,0xC0,0x00,0x0F,0xFF,0x80,0x00, 0x0F,0xFF,0x80,0x00,0x0F,0xFE,0x00,0x00,0x0F,0xF8,0x00,0x00,0x0F,0xE0,0x00,0x00, 0x0F,0xC0,0x00,0x00,0x0F,0x00,0x00,0x00,0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x78, 0x00,0x00,0x00,0xF8,0x00,0x00,0x03,0xF8,0x00,0x00,0x0F,0xF8,0x00,0x00,0x3F,0xF8, 0x00,0x00,0xFF,0xF8,0x00,0x00,0x7F,0xF8,0x00,0x00,0xFF,0xF8,0x00,0x03,0xFF,0xF8, 0x00,0x0F,0xFF,0xF8,0x00,0x3F,0xFF,0xF8,0x00,0x7F,0xFF,0xF8,0x01,0xFF,0xFF,0xF8, 0x03,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xE0, 0x07,0xFF,0xFF,0x80,0x07,0xFF,0xFF,0x00,0x07,0xFF,0xFC,0x00,0x07,0xFF,0xF0,0x00, 0x07,0xFF,0xC0,0x00,0x07,0xFF,0x80,0x00,0x07,0xFF,0xC0,0x00,0x07,0xFF,0x00,0x00, 0x07,0xFC,0x00,0x00,0x07,0xF0,0x00,0x00,0x07,0xC0,0x00,0x00,0x07,0x80,0x00,0x00, 0x02,0x00,0x00,0x10,0x00,0x00,0x00,0x70,0x00,0x00,0x01,0xF0,0x00,0x00,0x03,0xF0, 0x00,0x00,0x1F,0xF0,0x00,0x00,0x3F,0xF0,0x00,0x00,0xFF,0xF0,0x00,0x00,0x7F,0xF0, 0x00,0x00,0xFF,0xF0,0x00,0x03,0xFF,0xF0,0x00,0x07,0xFF,0xF0,0x00,0x1F,0xFF,0xF0, 0x00,0x7F,0xFF,0xF0,0x00,0xFF,0xFF,0xF0,0x01,0xFF,0xFF,0xF0,0x03,0xFF,0xFF,0xF0, 0x03,0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xC0,0x03,0xFF,0xFF,0x80,0x03,0xFF,0xFE,0x00, 0x03,0xFF,0xF8,0x00,0x03,0xFF,0xF0,0x00,0x03,0xFF,0xC0,0x00,0x03,0xFF,0x80,0x00, 0x03,0xFF,0xC0,0x00,0x03,0xFF,0x00,0x00,0x03,0xFE,0x00,0x00,0x03,0xF0,0x00,0x00, 0x03,0xE0,0x00,0x00,0x03,0x80,0x00,0x00,0x01,0x00,0x00,0x20,0x00,0x00,0x00,0xE0, 0x00,0x00,0x03,0xE0,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0xE0,0x00,0x00,0x7F,0xE0, 0x00,0x01,0xFF,0xE0,0x00,0x00,0x7F,0xE0,0x00,0x00,0x7F,0xE0,0x00,0x03,0xFF,0xE0, 0x00,0x07,0xFF,0xE0,0x00,0x1F,0xFF,0xE0,0x00,0x3F,0xFF,0xE0,0x00,0xFF,0xFF,0xE0, 0x00,0xFF,0xFF,0xE0,0x01,0xFF,0xFF,0xE0,0x01,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0xC0, 0x01,0xFF,0xFF,0x00,0x01,0xFF,0xFE,0x00,0x01,0xFF,0xF8,0x00,0x01,0xFF,0xF0,0x00, 0x01,0xFF,0x80,0x00,0x01,0xFF,0x80,0x00,0x01,0xFF,0xE0,0x00,0x01,0xFF,0x80,0x00, 0x01,0xFE,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xC0,0x00,0x00, 0x00,0x80,0x00,0x40,0x00,0x00,0x01,0xC0,0x00,0x00,0x07,0xC0,0x00,0x00,0x0F,0xC0, 0x00,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xC0,0x00,0x01,0xFF,0xC0,0x00,0x00,0x7F,0xC0, 0x00,0x00,0x7F,0xC0,0x00,0x01,0xFF,0xC0,0x00,0x03,0xFF,0xC0,0x00,0x0F,0xFF,0xC0, 0x00,0x3F,0xFF,0xC0,0x00,0xFF,0xFF,0xC0,0x00,0x7F,0xFF,0xC0,0x00,0xFF,0xFF,0xC0, 0x00,0xFF,0xFF,0x80,0x00,0xFF,0xFF,0xC0,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFC,0x00, 0x00,0xFF,0xF0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0x80,0x00,0x00,0xFF,0x80,0x00, 0x00,0xFF,0xE0,0x00,0x00,0xFF,0xC0,0x00,0x00,0xFF,0x00,0x00,0x00,0xFC,0x00,0x00, 0x00,0xF8,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x60,0x01,0x80,0x00,0x00,0x07,0x80, 0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x7F,0x80,0x00,0x01,0xFF,0x80, 0x00,0x03,0xFF,0x80,0x00,0x00,0x7F,0x80,0x00,0x00,0x7F,0x80,0x00,0x01,0xFF,0x80, 0x00,0x03,0xFF,0x80,0x00,0x07,0xFF,0x80,0x00,0x3F,0xFF,0x80,0x00,0x7F,0xFF,0x80, 0x00,0x3F,0xFF,0x80,0x00,0x7F,0xFF,0x80,0x00,0x7F,0xFF,0x00,0x00,0x7F,0xFF,0x80, 0x00,0x7F,0xFF,0x00,0x00,0x7F,0xF8,0x00,0x00,0x7F,0xF0,0x00,0x00,0x7F,0xE0,0x00, 0x00,0x7F,0x80,0x00,0x00,0x7F,0x80,0x00,0x00,0x7F,0xF0,0x00,0x00,0x7F,0xE0,0x00, 0x00,0x7F,0x80,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x78,0x00,0x00, 0x00,0x1C,0x0E,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x3E,0x00, 0x00,0x01,0xFE,0x00,0x00,0x03,0xFE,0x00,0x00,0x07,0xFE,0x00,0x00,0x00,0x7E,0x00, 0x00,0x00,0x7E,0x00,0x00,0x00,0xFE,0x00,0x00,0x01,0xFE,0x00,0x00,0x07,0xFE,0x00, 0x00,0x1F,0xFE,0x00,0x00,0x1F,0xFE,0x00,0x00,0x1F,0xFE,0x00,0x00,0x1F,0xFE,0x00, 0x00,0x1F,0xFE,0x00,0x00,0x1F,0xFE,0x00,0x00,0x1F,0xFE,0x00,0x00,0x1F,0xF8,0x00, 0x00,0x1F,0xE0,0x00,0x00,0x1F,0xC0,0x00,0x00,0x1F,0x80,0x00,0x00,0x1F,0x80,0x00, 0x00,0x1F,0xF8,0x00,0x00,0x1F,0xF0,0x00,0x00,0x1F,0xE0,0x00,0x00,0x1F,0x00,0x00, 0x00,0x1F,0x80,0x00,0x00,0x1F,0x00,0x00,0x00,0x03,0xF0,0x00,0x00,0x00,0x70,0x00, 0x00,0x00,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x03,0xF0,0x00,0x00,0x07,0xF0,0x00, 0x00,0x0F,0xF0,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x70,0x00, 0x00,0x00,0xF0,0x00,0x00,0x03,0xF0,0x00,0x00,0x03,0xF0,0x00,0x00,0x03,0xF0,0x00, 0x00,0x03,0xF0,0x00,0x00,0x03,0xF0,0x00,0x00,0x03,0xF0,0x00,0x00,0x03,0xF0,0x00, 0x00,0x03,0xF0,0x00,0x00,0x03,0xF0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0x80,0x00, 0x00,0x03,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x03,0xFC,0x00,0x00,0x03,0xF8,0x00, 0x00,0x03,0xF0,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0x80,0x00 };Вывод на экран сделан выводом всего изображения полностью из буфера, что бы не возиться с масками символов и адресацией. Разделение буфера на две части пришлось делать для уменьшения размера массива экрана, что бы IDE не плакала что у нее память кончается))
Команды терминала:
Все настройки хранятся в DS3231 по адресам:
Смысла использовать еепром тут я особого не вижу.
В IDE делается многостраничный скетч ?
Да, в одной портянке трудно ориентироваться. Да и повторно использовать код так гораздо легче.
Конечно. В общих чертах, выбрасываешь самостоятельные модули в отдельные файлы. Всё складываешь в папку скетча. При загрузке скетча файлы-модули подтягиваются автоматом. Есто некоторые тонкости с глобальными переменными, но это поймёшь на практике, если оно тебе надо.
Добрый день. Заинтересовал данный проект, есть желание повторить, но что то не получается скомпилировать, ругается на отсутствие нужных файлов. Как правильно обозвать все файлы которые подгружаем к основному? нужно ли перед каждым ставить маленькую букву "m"? типа: mBME280.h Перепробовал все варианты, поменял пару сред, ни чего не помогает, ошибка одна и таже, что делаю не так? С многостраничным скетчем первый раз дело имею. Если не трудно, можете выложить весь скетч одним архивом куда нибудь на яндекс диск типа.
https://yadi.sk/d/xBINvFrHXW584g
Благодарю, все прошло на ура. Все наглядно и понятно, как говориться век живи век учись.
ТС прошу помощи. Скетч для схемы с первого поста работает без проблем. Больше интересует "расширенная" версия с регулировкой яркости. Возникло пару вопросов. 1. Не могу установить шрифты и яркость (в терминале, при вводе: "I 1.1.255" выдает ошибку не зависимую от параметров). При этом в текущих настройках не меняется только 3-й аргумент, он постоянно =0. 2. Регулировка яркости подразумевалась только через терминал в ручную? правильно я понимаю (хочу подсветку в зависимости от освещенности реализовать). Схему для "расширенного" скетча собрал правильно, с транзистором в цепи подсветки :)
Для меня этот проект уже закрыт)) Вот последняя версия, которая у меня работала - https://yadi.sk/d/6K0qy9JQvkQLEw
Регулировку яркости от внешнего освещения не делал, руки не дошли
Но тут ужу стм32, есп12 и чистый С, все по взрослому)))
Понятно, попробую эту версию. Правильно ли я понимаю, что формат ввода строки "I 1,1,255" должен быть таким ну или с другими разделителями прописанными в скетче, типа пробел, точка, запятая, двоеточие. и все должно получиться. Регулировку по освещенности сам допилю, резберусь вот только с вводом.
Да на стм32 красиво получается, ну там и ресурсов поболее будет.
Да, там были какие-то косяки именно с командой I. Я их устранил, последняя версия должна нормально работать.
Проблемка с командой "I" осталась, не последняя это видимо версия. :)
https://yadi.sk/d/xBINvFrHXW584g
Архив битый,можно поправить.
Архив нормальный, только что проверил. Попробуй архив из поста №10.
Для меня этот проект уже закрыт)) Вот последняя версия, которая у меня работала - https://yadi.sk/d/6K0qy9JQvkQLEw
Регулировку яркости от внешнего освещения не делал, руки не дошли
Но тут ужу стм32, есп12 и чистый С, все по взрослому)))
друг, подскажи, а схема есть на это с этим TFT дисплеем ?