На главную страницу | Новости | FAQ | Ссылки | Для детей | Контакты

ARDUINO ROBOTS
Arduino для начинающих электронщиков. Модули и проекты на базе Arduino. Разработка роботов


Прогноз погоды на Ардуине с выводом на ЖКИ-дисплей


Суть устройства


Суть устройства в том, что на ЖКИ-дисплей выводится информация о погоде:

Прогноз погоды на Ардуине с выводом на ЖКИ-дисплей

которая загружается из интернета с помощь вот этого LAN-шилда

Прогноз погоды на Ардуине с выводом на ЖКИ-дисплей

Под дисплеем и под шилдом находится ардуина UNO, т.е. здесь используется две ардуины, которые общаются между собой посредством serial-интерфейса. Сначала я использовал только 1 ардуину и выводил инфу на дисплей 1602, но потом мне этого стало нехватать.


Конечно, в виду небольшого разрешения дисплея, мне пришлось выводить всё компактно и использоваться сокращения, которые я сам придумал. Если по порядку сверху вниз и справа налево на дисплее отображается следующая инфа.


Не, ну конечно погоду можно было бы смотреть и в Интернете. Однако дело в том, что мне лично влом каждый раз включать комп, открывать браузер, заходить на сайт погоды и т.д., чтобы посмотреть прогноз. А тут вся информация сразу на виду, обновляется автоматически, смотрится вполне неплохо. Сейчас у меня есть и побольше дисплей, но переделывать не хочется. В принципе, всё необходимая информация выводится и этого достаточно.

Описание отображаемой инфы


Сначала текущая погода:

- краткое описание (clear sky и т.п.)

- шифр погоды (совпадающий по сути с описанием погоды), который состоит из 3-х символов, где средний символ - это первая буква статуса: S - sunny, R - rain, C - cloudly и т.д.; Но поскольку rain может быть разный, то это уточняется 3-им символом; 1-ый символ просто для информативности и цвет для более наглядного восприятия.

- облачность в процентах (белым цветом);

- давление (фиолет. цветом)

- температура (зеленым)

- влажность (голубым)

- скорость ветра (желтым)

- направление ветра, откуда дует (в градусах, например, 0 - северный, 270 - западный и т.д.)

Потом идет прогноз погоды с интервалом в 3 часа: температура, шифр погоды, облачность, ветер (скорость и направление).

Таким образом, инфа выводится на сутки вперед и чуть больше.

Можно, конечно, было бы сделать и на более далекое будущее, однако такой прогноз всё равно, как правило, ошибочный. Мне обычно на ближайшие 3 часа хватает.


Использованные компоненты


- Arduino Uno ;

- Ethernet-шилд W5100 , совместимый с Arduino, стоит он около $5;

- TFT 2.4" , совместимый с ардуино UNO.

Лучше брать дисплей именно такого вида, т.к. он сделан специально под UNO с значит с ним будет меньше проблем. Но даже в этом случае такие попадаются с разными чипами (ILI9341,ILI9325), так что возможно придется немного повозиться и что-то поменять в программе.

Как всё работает


Чтобы всё работало, надо зарегиться на сайте

http://openweathermap.org/api

получить там собственный appid и уже его использывать для получения информации оттудава. Там нужно взять адреса, откуда получать погоду и прогноз и потом заменить это в коде в строках:

client.print(F("/data/2.5/weather ... "))
client.print(F("/data/2.5/forecast ... "))

Код программы для 1-ой ардуины, сюдящей на LAN-шилде


/*
Ethernet shield attached to pins 10, 11, 12, 13
Поскольку шилд достаточно долго включается, то не всегда удается подключиться к серверу с первой попытке, и часто застревает где-то. Поэтому необходим сторожевой таймер.
*/
 
#include < Wire.h > #include < SPI.h > #include < Ethernet.h > #include < LiquidCrystal_I2C.h > // LCD+I2C #include < avr/wdt.h > // dog timer #define ON_TIMER true #define _DEBUG0_ false // режим отладки через терминал (при TFT не использовать) #define MAX_LEN_VAL 20 // макс. длина строки, в кот. хранится выходное значение //----------------------- #define CMD_CLEAR 'R' #define CMD_COLOR 'C' #define CMD_TEXT_SIZE 'S' #define COL_RED 'R' #define COL_GREEN 'G' #define COL_BLUE 'B' #define COL_YELLOW 'Y' #define COL_MAGENTA 'M' #define COL_CYAN 'C' //----------------------- const char SPACE16[17] = " "; LiquidCrystal_I2C lcd(0x27,16,2); //bool SERIAL = false; // Enter a MAC address for your controller below. // Newer Ethernet shields have a MAC address printed on a sticker on the shield byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // if you don't want to use DNS (and reduce your sketch size) // use the numeric IP instead of the name for the server: //IPAddress server(74,125,232,128); // numeric IP for Google (no DNS) char server[32] = "api.openweathermap.org"; /* погода: api.openweathermap.org/data/2.5/weather?q=.. прогноз: api.openweathermap.org//data/2.5/forecast?q=... API прогноз: http://openweathermap.org/forecast5 list.dt_txt Data/time of caluclation, UTC; icons and condition: http://openweathermap.org/weather-conditions */ /* размер буфера = 64 bytes. */
// ================= код для LCD-дисплея 1602 (подключен напрямую к этой ардуине) byte degree[8] = // кодируем символ градуса { B00111, B00101, B00111, B00000, B00000, B00000, B00000 }; void print_msg(const char* str) { lcd.setCursor(0, 1); // на вторую строчку lcd.print(SPACE16); lcd.setCursor(0, 1); lcd.print(str); } void(* resetFunc) (void) = 0;//объявляем функцию reset с адресом 0 //====================== // некоторые функции void vert_space() { Serial.print(F("#S1_#CW_")); Serial.print(';'); } void horiz_space() { Serial.print(F("#S1_#CW_")); Serial.print(' '); Serial.print('&'); } void horiz_line() { Serial.print(F("#S2_#CB_")); for(int i=0; i<19; i++) Serial.print('-'); Serial.print('&'); } //------------------- // Set the static IP address to use if the DHCP fails to assign IPAddress ip(192, 168, 0, 22); // Initialize the Ethernet client library // with the IP address and port of the server // that you want to connect to (port 80 is default for HTTP): EthernetClient client; // Задаем параметры соединения с сайтом void set_params_by_serial(const char *name_par, char *str_par) { Serial.print(name_par); Serial.println(":"); while (Serial.available() == 0) {} delay(10); // ждем заполнения буфера while (Serial.available()) { char ch = (char) Serial.read(); if(ch!='\n') { str_par[strlen(str_par)] = ch; } else { str_par[strlen(str_par)] = '\0'; break; } delay(2); // ждем заполнения буфера } //server[strlen(server)] = '\0'; Serial.println(name_par); Serial.println("="); Serial.println(str_par); } void setup() { lcd.init(); // Инициализация LCD 1602 /* без init оно у меня не работало, даже если заменить ан begin(16,2) */ // lcd.begin(16, 2); lcd.backlight(); // Включаем подсветку lcd.createChar(1, degree); // Создаем символ под номером 1 //lcd.setBacklight(LOW); print_msg("start"); delay(1500); // Open serial communications and wait for port to open: Serial.begin(9600); delay(10); //while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } vert_space(); Serial.print(F("#S2_#CY_")); Serial.print(F("connect;")); Serial.flush(); // Ожидает окончания передачи исходящих данных print_msg("timer"); if (ON_TIMER) wdt_enable(WDTO_8S); // !!! сторожевой таймер на 8 сек delay(1000); // Задаем параметры соединения с сайтом //set_params_by_serial("server", server); //set_params_by_serial("url", url); print_msg("try mac"); delay(1000); // start the Ethernet connection: if (Ethernet.begin(mac) == 0) { //Serial.println("Failed to configure Ethernet using DHCP"); // try to congifure using IP address instead of DHCP: print_msg("Failed_DHCP"); delay(1000); Ethernet.begin(mac, ip); } // give the Ethernet shield a second to initialize: } /* * если оригинальный URI пуст, то он ДОЛЖЕН запрашиваться как "/" * (корневой каталог сервера). * */ // Подключение к серверу void connect_server(char *server) { print_msg("Connect"); delay(500); // if you get a connection, report back via serial: if (client.connect(server, 80)) { print_msg("ok"); } else { // if you didn't get a connection to the server: print_msg("failed"); // if (ON_TIMER) wdt_disable(); // delay(20000); // ждем 20 сек и перегружаемся resetFunc(); //вызываем reset } } // Make a HTTP request void GET_request(const char *server, byte num_url) { client.print("GET "); // Сюда нужно вставить правильные URL для СВОЕГО ГОРОДА: switch (num_url) { case 0: client.print(F("/data/2.5/weather?q=Vitsyebsk&units=metric&appid=b30b37b7axxxxxxxxxxxxxxxxxxxxxxxx")); // текущая погод break; case 1: client.print(F("/data/2.5/forecast?q=Vitsyebsk&units=metric&appid=b30b37b7axxxxxxxxxxxxxxxxxxxxxxxx")); // прогноз погоды break; } client.println(" HTTP/1.1"); client.print("Host: "); client.println(server); client.println("Connect.close"); // без этого работать не будет! client.println(); } // ================= для управления TFT-дисплеем, подключенного к другой ардуине class Format { public: void temp(char *, int, int); void speed(char *, int); void humi(char *); } format; void Format::temp(char *str, int out_len=4, int num_dig_after_point=1) { const int len = strlen(str); int pos_dot = -1; for(int i=0; i 0 ) { // если не хватает символов char newstr[dif+1+len_str]; // чтобы была возможна конкатенация надо добавить strlen(str) // добавление пробелов в начало и + for(int i=0; i color[1] = 'C'; color[2] = ch_color; color[3] = '_'; color[4] = '\0'; } //====================== // str --- ключ, который ищем void get_value(const char *str, char *out, const char end_sym=',') { const int lenbuf = strlen(str); char buf[lenbuf+1]; // "id"\0 const int max_len_temp = MAX_LEN_VAL; // макс. длина выходной строки. char temp[max_len_temp + 1]; // шаг 1 - поиск ключа str while (true) { if (!client.available()) continue; char ch = client.read(); if (_DEBUG0_) { Serial.println(ch); } for(int i=0; i < lenbuf-1; i++) { buf[i] = buf[i+1]; } buf[lenbuf-1] = ch; buf[lenbuf] = '\0'; if (_DEBUG0_) { Serial.print("buf="); Serial.println(buf); } if (strcmp(buf, str) == 0) { break; } } // шаг 2 - получение значения int i = 0; while (true) { if (!client.available()) continue; char ch = client.read(); if (ch == ':') continue; if ((ch == end_sym)||(ch == ',')||(ch == '}')||(ch == ';')) break; temp[i++] = ch; if (i >= max_len_temp) break; } temp[i] = '\0'; strcpy(out, temp); } void loop() { // if there are incoming bytes available // from the server, read them and print them: /* // if the server's disconnected, stop the client: if (!client.connected()) { Serial.println(); Serial.println("disconnect"); client.stop(); if (ON_TIMER) wdt_disable(); delay(20000); // ждем 20 сек и перегружаемся resetFunc(); //вызываем reset //while (true); } */ print_msg("connect"); delay(500); connect_server(server); print_msg("REQ"); delay(500); GET_request(server, 0); delay(500); if (!client.available()) { print_msg("not av."); delay(5000); return; } // получение данных char str_main[10]; char str_desc[MAX_LEN_VAL+1]; char str_temp[7]; char str_pres[10]; char str_humi[5]; char str_speed[7]; char str_deg[5]; char str_all[4]; // clouds char str_id[4]; // ID char str_id_out[4]; // ID в другой форме char cmd_set_color_id[5]; // команда для задания цвета get_value("\"id\"", str_id ); get_value("\"main\"", str_main ); get_value("\"description\"", str_desc); get_value("\"temp\"", str_temp ); get_value("\"pressure\"", str_pres, '.'); // обрезание также на точке get_value("\"humidity\"", str_humi, '.'); // обрезание также на точке get_value("\"speed\"", str_speed ); // "wind" get_value("\"deg\"", str_deg, '.'); // "wind" get_value("\"all\"", str_all ); // "clouds" format.temp(str_temp, 4); format.speed(str_speed, 3); lcd.clear(); lcd.setCursor(0,0); lcd.print("T="); lcd.setCursor(2,0); lcd.print(str_temp); lcd.print("\1C"); // значок градуса Serial.print(F("#R__")); // clear TFT // ОПИСАНИЕ horiz_space(); Serial.print("#S2_#CY_"); delay(100); Serial.flush(); Serial.print(str_desc); // description Serial.print(';'); Serial.flush(); delay(150); // ЗНАЧКИ process_id(str_main, str_id, str_id_out, cmd_set_color_id); vert_space(); horiz_space(); Serial.print("#S3_"); Serial.print(cmd_set_color_id); // set color of id Serial.flush(); delay(30); Serial.print(str_id_out); Serial.print('&'); // just print Serial.print(' '); // just space Serial.flush(); delay(100); //Serial.print("#S2_#CW_"); //delay(100); //Serial.print(" clouds "); //Serial.print('&'); Serial.print(F("#S3_#CW_")); Serial.print(str_all); // *** ОБЛАЧНОСТЬ *** if (strlen(str_all)<=2) Serial.print('%'); Serial.print(' '); Serial.print('&'); Serial.flush(); delay(50); Serial.print(F("#S3_#CM_")); Serial.print(str_pres); // *** ДАВЛЕНИЕ ***/ Serial.print(';'); Serial.flush(); vert_space(); vert_space(); horiz_space(); Serial.print(F("#S5_#CG_")); Serial.flush(); delay(100); Serial.print(str_temp); // TEMПЕРАТУРА Serial.print('&'); // just print Serial.print(F("#S3_#CG_")); Serial.print("o"); Serial.print('&'); Serial.flush(); horiz_space(); horiz_space(); //Serial.print("#S1_#CR_;"); Serial.print(F("#S4_#CC_")); Serial.flush(); Serial.print(str_humi); // ВЛАЖНОСТЬ Serial.print('&'); Serial.print(F("#S3_#CC_")); //Serial.print("%"); if( strlen(str_humi) < 3 ) Serial.print('%'); // иначе не вмещается! Serial.print(';'); // next line in TFT Serial.flush(); delay(10); vert_space(); vert_space(); vert_space(); horiz_space(); Serial.print(F("#S3_#CY_")); Serial.print(str_speed); Serial.print('&'); // just print horiz_space(); Serial.print(F("#S2_#CY_")); Serial.print("m/s"); Serial.print('&'); // just print Serial.flush(); Serial.print(F("#S3_#CO_")); Serial.print(" ["); Serial.print(str_deg); Serial.print("]"); Serial.print(';'); // next line in TFT Serial.flush(); delay(100); vert_space(); // ШАГ 2 - вывод таблицы с прогнозом погоды: print_msg("REQ_2"); delay(300); GET_request(server, 1); if (!client.available()) { print_msg("not av."); delay(5000); return; } Serial.print("#S1_#CR_;"); const char TABLE_ROWS = 10; for(int i=0; i#S2_#CG_")); Serial.print(str_temp); Serial.print('&'); // just print Serial.print(' '); // just space Serial.flush(); process_id(str_main, str_id, str_id_out, cmd_set_color_id); Serial.print(cmd_set_color_id); // set color of id Serial.print(str_id_out); Serial.print('&'); // just print Serial.print(' '); // just space Serial.flush(); delay(10); Serial.print(F("#S2_#CW_")); if( strlen(str_all)<2 ) Serial.print(' '); // just print Serial.print(str_all); // облачность //if( strlen(str_all)<3 ) Serial.print('%'); // just print Serial.print('&'); // just print Serial.print(' '); // just space Serial.flush(); Serial.print(F("#S2_#CY_")); Serial.print(str_speed); Serial.print('&'); // just print Serial.print(' '); // just space Serial.flush(); Serial.print(F("#S2_#CO_")); Serial.print(str_deg); Serial.print(';'); // next line in TFT Serial.flush(); } // -------- if (ON_TIMER) wdt_disable(); // всё ок, таймер можно отключить delay(1800000); // каждые 30 мин resetFunc(); //вызываем reset }

Код программы для 2-ой ардуины, на которой висит ЖК-дисплей


/*
   #R__#S2_#CY_start;#R__#S2_#CY_"Clouds";#S4_#CG_T=22.35;#S3_#CM_P=1010.13;#S4_#CC_70%;#S2_#CY_3.35 m/s;#S2_#CM_[155.506];#S3_#CG_T'=21.49;
   
   serial buffer = 64 bytes
   
 */

// IMPORTANT: Adafruit_TFTLCD LIBRARY MUST BE SPECIFICALLY
// CONFIGURED FOR EITHER THE TFT SHIELD OR THE BREAKOUT BOARD.
// SEE RELEVANT COMMENTS IN Adafruit_TFTLCD.h FOR SETUP.

 #include < string.h &rt
 #include < Adafruit_GFX.h &rt    // Core graphics library
 #include < Adafruit_TFTLCD.h &rt // Hardware-specific library

// The control pins for the LCD can be assigned to any digital or
// analog pins...but we'll use the analog pins as this allows us to
// double up the pins with the touch screen (see the TFT paint example).
 #define LCD_CS A3 // Chip Select goes to Analog 3
 #define LCD_CD A2 // Command/Data goes to Analog 2
 #define LCD_WR A1 // LCD Write goes to Analog 1
 #define LCD_RD A0 // LCD Read goes to Analog 0

 #define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin

 #define _DEBUG_ false

// When using the BREAKOUT BOARD only, use these 8 data lines to the LCD:
// For the Arduino Uno, Duemilanove, Diecimila, etc.:
//   D0 connects to digital pin 8  (Notice these are
//   D1 connects to digital pin 9   NOT in order!)
//   D2 connects to digital pin 2
//   D3 connects to digital pin 3
//   D4 connects to digital pin 4
//   D5 connects to digital pin 5
//   D6 connects to digital pin 6
//   D7 connects to digital pin 7
// For the Arduino Mega, use digital pins 22 through 29
// (on the 2-row header at the end of the board).

// Assign human-readable names to some common 16-bit color values:
 #define	BLACK   0x0000
 #define	BLUE    0x001F
 #define	RED     0xF800
 #define	GREEN   0x07E0
 #define  CYAN    0x07FF
 #define  MAGENTA 0xF81F
 #define  YELLOW  0xFFE0
 #define  ORANGE  0xFFE0
 #define  WHITE   0xFFFF
 #define  L_GREY  0xC618      /* 192, 192, 192 */
 #define  D_GREY  0x7BEF      /* 128, 128, 128 */

 #define Black           0x0000      /*   0,   0,   0 */
 #define Navy            0x000F      /*   0,   0, 128 */
 #define DarkGreen       0x03E0      /*   0, 128,   0 */
 #define DarkCyan        0x03EF      /*   0, 128, 128 */
 #define Maroon          0x7800      /* 128,   0,   0 */
 #define Purple          0x780F      /* 128,   0, 128 */
 #define Olive           0x7BE0      /* 128, 128,   0 */
 #define LightGrey       0xC618      /* 192, 192, 192 */
 #define DarkGrey        0x7BEF      /* 128, 128, 128 */
 #define Blue            0x001F      /*   0,   0, 255 */
 #define Green           0x07E0      /*   0, 255,   0 */
 #define Cyan            0x07FF      /*   0, 255, 255 */
 #define Red             0xF800      /* 255,   0,   0 */
 #define Magenta         0xF81F      /* 255,   0, 255 */
 #define Yellow          0xFFE0      /* 255, 255,   0 */
 #define White           0xFFFF      /* 255, 255, 255 */
 #define ORANGE          0xFD20      /* 255, 165,   0 */
 #define GreenYellow     0xAFE5      /* 173, 255,  47 */
 #define Pink            0xF81F



Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// If using the shield, all control and data lines are fixed, and
// a simpler declaration can optionally be used:
// Adafruit_TFTLCD tft;


void rotateText() {
  for (uint8_t i=0; i<4; i++) {
    tft.fillScreen(BLACK);
    Serial.println(tft.getRotation(), DEC);

    tft.setCursor(0, 30);
    tft.setTextColor(RED);
    tft.setTextSize(1);
    tft.println("Hello World!");
    tft.setTextColor(YELLOW);
    tft.setTextSize(2);
    tft.println("Hello World!");
    tft.setTextColor(GREEN);
    tft.setTextSize(3);
    tft.println("Hello World!");
    tft.setTextColor(BLUE);
    tft.setTextSize(4);
    tft.print(1234.567);

    while (!Serial.available());
    Serial.read();  Serial.read();  Serial.read();

    tft.setRotation(tft.getRotation()+1);
  }
}

void rotateFillcircle(void) {
  for (uint8_t i=0; i<4; i++) {
    tft.fillScreen(BLACK);
    Serial.println(tft.getRotation(), DEC);

    tft.fillCircle(10, 30, 10, YELLOW);

    while (!Serial.available());
    Serial.read();  Serial.read();  Serial.read();

    tft.setRotation(tft.getRotation()+1);
  }
}

void rotateDrawcircle(void) {
  for (uint8_t i=0; i<4; i++) {
    tft.fillScreen(BLACK);
    Serial.println(tft.getRotation(), DEC);

    tft.drawCircle(10, 30, 10, YELLOW);

    while (!Serial.available());
    Serial.read();  Serial.read();  Serial.read();

    tft.setRotation(tft.getRotation()+1);
  }
}

void rotateFillrect(void) {
  for (uint8_t i=0; i<4; i++) {
    tft.fillScreen(BLACK);
    Serial.println(tft.getRotation(), DEC);

    tft.fillRect(10, 20, 10, 20, GREEN);

    while (!Serial.available());
    Serial.read();  Serial.read();  Serial.read();

    tft.setRotation(tft.getRotation()+1);
  }
}

void rotateDrawrect(void) {
  for (uint8_t i=0; i<4; i++) {
    tft.fillScreen(BLACK);
    Serial.println(tft.getRotation(), DEC);

    tft.drawRect(10, 20, 10, 20, GREEN);

    while (!Serial.available());
    Serial.read();  Serial.read();  Serial.read();

    tft.setRotation(tft.getRotation()+1);
  }
}

void rotateFastline(void) {
  for (uint8_t i=0; i<4; i++) {
    tft.fillScreen(BLACK);
    Serial.println(tft.getRotation(), DEC);

    tft.drawFastHLine(0, 20, tft.width(), RED);
    tft.drawFastVLine(20, 0, tft.height(), BLUE);

    while (!Serial.available());
    Serial.read();  Serial.read();  Serial.read();

    tft.setRotation(tft.getRotation()+1);
  }
}

void rotateLine(void) {
  for (uint8_t i=0; i<4; i++) {
    tft.fillScreen(BLACK);
    Serial.println(tft.getRotation(), DEC);

    tft.drawLine(tft.width()/2, tft.height()/2, 0, 0, RED);
    while (!Serial.available());
    Serial.read();  Serial.read();  Serial.read();

    tft.setRotation(tft.getRotation()+1);
  }
}

void rotatePixel(void) {
  for (uint8_t i=0; i<4; i++) {
    tft.fillScreen(BLACK);
    Serial.println(tft.getRotation(), DEC);

    tft.drawPixel(10,20, RED);
    while (!Serial.available());
    Serial.read();  Serial.read();  Serial.read();

    tft.setRotation(tft.getRotation()+1);
  }
}





// ----------------------------

int cur_color;
int cur_size = 4;

void next_color() {
	switch (cur_color) {
		case RED: cur_color = YELLOW; break;
		case YELLOW: cur_color = GREEN; break;
		case GREEN: 
			cur_color = MAGENTA; 
			cur_size = 3;
			break;
		case MAGENTA: cur_color = CYAN; break;
		case CYAN: cur_color = RED; break;
		default: cur_color = RED;
	}
	tft.setTextColor(cur_color);
	tft.setTextSize(cur_size); // 1-4
}

void clear_disp() {
	tft.fillScreen(BLACK);
	tft.setTextColor(RED);
	cur_color = RED;
	tft.setTextSize(4); // 1-4
	tft.setCursor(0, 40);
}


void setup(void) {
	
  Serial.begin(9600);
  Serial.println(F("TFT LCD test"));

  tft.reset();

  uint16_t identifier = tft.readID();

  if(identifier == 0x9325) {
    Serial.println(F("Found ILI9325 LCD driver"));
  } else if(identifier == 0x9328) {
    Serial.println(F("Found ILI9328 LCD driver"));
  } else if(identifier == 0x7575) {
    Serial.println(F("Found HX8347G LCD driver"));
  } else if(identifier == 0x9341) {
    Serial.println(F("Found ILI9341 LCD driver"));
  } else if(identifier == 0x8357) {
    Serial.println(F("Found HX8357D LCD driver"));
  } else {
    Serial.print(F("Unknown LCD driver chip: "));
    Serial.println(identifier, HEX);
    return;
  }

	tft.begin(identifier);
  	clear_disp();
	tft.println("READY:");
}


//-----------------------
  #define CMD_CLEAR 	'R'
  #define CMD_NEWLINE 	'N'
  #define CMD_COLOR 	'C'
  #define CMD_TEXT_SIZE 'S'

  #define COL_RED 		'R'
  #define COL_GREEN 	'G'
  #define COL_BLUE 		'B'
  #define COL_YELLOW 	'Y'
  #define COL_ORANGE	'O'
  #define COL_MAGENTA 	'M'
  #define COL_CYAN 		'C'

  #define COL_WHITE 	'W'
  #define COL_L_GREY 	'L'
  #define COL_D_GREY 	'D'

// convert to 16-bit schema
int color16(int R, int G, int B)
{
	return (((31*(R+4))/255)<<11) | (((63*(G+2))/255)<<5) | ((31*(B+4))/255);
}

//-----------------------

void do_command(String cmd)
{
	if (_DEBUG_) {
		tft.setTextSize(1); // 1-4
		tft.println(cmd.c_str());
	}
	
	switch (cmd[0]) {
			
		case CMD_CLEAR: 
			tft.fillScreen(BLACK);
			tft.setCursor(0, 5);
			break;
		
		case CMD_NEWLINE:
			tft.println();
			break;
			
		case CMD_COLOR: 
			switch (cmd[1]) {
				case COL_RED: 	 	tft.setTextColor(RED);   	break;
				case COL_GREEN: 	tft.setTextColor(GREEN); 	break;
				case COL_BLUE:  	tft.setTextColor(BLUE);  	break;
				case COL_YELLOW:  tft.setTextColor(YELLOW);  break;
				case COL_ORANGE:  tft.setTextColor(ORANGE);  break;
				case COL_MAGENTA: tft.setTextColor(MAGENTA); break;			
				case COL_CYAN: 	tft.setTextColor(CYAN);		break;
				case COL_WHITE: 	tft.setTextColor(color16(250,250,250));	break;
				case COL_L_GREY: 	tft.setTextColor(color16(225,225,225));	break;
				case COL_D_GREY: 	tft.setTextColor(color16(195,195,195));	break;
				default: tft.setTextColor(RED); 
			}
			break;
			
		case CMD_TEXT_SIZE: 	
			tft.setTextSize( ((int)cmd[1]) - ((int)'0') ); // 1-4
			break;
	}
	
}


void loop(void) {
	
	const int LEN_CMD = 3;
	//char cmd[LEN_CMD];
	String str = "";
	String cmd = "";
	int count = -1;
		
	while (true) {
		
		if (!Serial.available()) continue;
		char ch = (char) Serial.read();  // get the new byte
		
		if (ch==';') {			
			tft.println(str);
			str = "";
			//break; // начинаем цикл заново
		}
		else if (ch=='&') {
			tft.print(str);
			str = "";			
		}
		else if (ch=='#') {	
			count = LEN_CMD;
			//str = "";
		}
		else {
			if (count > 0)  {
				cmd += ch;
				count--;				
			}
			else {
				str += ch;
			}					
		}
		
		if (count == 0) {
			do_command(cmd);
			count--;
			cmd = "";
		}	
		
	}
	
}




Платы ARDUINO по низкой цене

Нажми на изображение, чтобы заказать в интернет-магазине:


arduino NANO купить дешево arduino UNO купить дешево arduino UNO R3 ORIG купить дешево arduino MEGA купить дешево arduino DUE купить дешево



Now 21.11.24 20:37:40, Your IP: 18.191.237.228; arduino.zl3p.com/projects/pogoda
ePN