На главную страницу | Новости | FAQ | Ссылки | Для детей | Контакты
Суть устройства в том, что на ЖКИ-дисплей выводится информация о погоде:
которая загружается из интернета с помощь вот этого LAN-шилда
Под дисплеем и под шилдом находится ардуина UNO, т.е. здесь используется две ардуины, которые общаются между собой посредством serial-интерфейса. Сначала я использовал только 1 ардуину и выводил инфу на дисплей 1602, но потом мне этого стало нехватать.
Конечно, в виду небольшого разрешения дисплея, мне пришлось выводить всё компактно и использоваться сокращения, которые я сам придумал. Если по порядку сверху вниз и справа налево на дисплее отображается следующая инфа.
Не, ну конечно погоду можно было бы смотреть и в Интернете. Однако дело в том, что мне лично влом каждый раз включать комп, открывать браузер, заходить на сайт погоды и т.д., чтобы посмотреть прогноз. А тут вся информация сразу на виду, обновляется автоматически, смотрится вполне неплохо. Сейчас у меня есть и побольше дисплей, но переделывать не хочется. В принципе, всё необходимая информация выводится и этого достаточно.
Сначала
- краткое описание (clear sky и т.п.)
- шифр погоды (совпадающий по сути с описанием погоды), который состоит из 3-х символов, где средний символ - это первая буква статуса: S - sunny, R - rain, C - cloudly и т.д.; Но поскольку rain может быть разный, то это уточняется 3-им символом; 1-ый символ просто для информативности и цвет для более наглядного восприятия.
- облачность в процентах (белым цветом);
- давление (фиолет. цветом)
- температура (зеленым)
- влажность (голубым)
- скорость ветра (желтым)
- направление ветра, откуда дует (в градусах, например, 0 - северный, 270 - западный и т.д.)
Потом идет
Таким образом, инфа выводится на сутки вперед и чуть больше.
Можно, конечно, было бы сделать и на более далекое будущее, однако такой прогноз всё равно, как правило, ошибочный. Мне обычно на ближайшие 3 часа хватает.
- Arduino Uno ;
- Ethernet-шилд W5100 , совместимый с Arduino, стоит он около $5;
- TFT 2.4" , совместимый с ардуино UNO.
Лучше брать дисплей именно такого вида, т.к. он сделан специально под UNO с значит с ним будет меньше проблем. Но даже в этом случае такие попадаются с разными чипами (ILI9341,ILI9325), так что возможно придется немного повозиться и что-то поменять в программе.
Чтобы всё работало, надо зарегиться на сайте
получить там собственный appid и уже его использывать для получения информации оттудава. Там нужно взять адреса, откуда получать погоду и прогноз и потом заменить это в коде в строках:
client.print(F("/data/2.5/weather ... "))
client.print(F("/data/2.5/forecast ... "))
/*
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
}
/*
#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 = "";
}
}
}
Now 21.11.24 20:37:40, Your IP: 18.191.237.228; arduino.zl3p.com/projects/pogoda
ePN