Ранее в статье VFD-дисплей FUTABA M202MD10D (Arduino) был пример тестового запуска VFD-дисплея FUTABA M202MD10D, в этой статье будет описан пример создания простой погодной станции с использованием VFD-дисплея, датчика давления, влажности и температуры BME280, а так же часов реального времени DS3232.
В первой строке VFD-дисплея выводится время, дата, месяц и год, а так же день недели, во второй строке дисплея выводится температура, давление и влажность.
Погодная станция имеет три кнопки корректировки времени, даты, месяца и года.
#define UP 5 #define DW 6 #define SET 7 #include <Wire.h> #include <Adafruit_Sensor.h> // https://github.com/adafruit/Adafruit_Sensor.git #include <Adafruit_BME280.h> // https://github.com/adafruit/Adafruit_BME280_Library.git #include <SoftwareSerial.h> #include <DS3231.h> // http://rcl-radio.ru/wp-content/uploads/2022/10/DS3231.zip SoftwareSerial serial(3, 2); //RX,TX DS3231 clock;RTCDateTime DateTime; Adafruit_BME280 bme; int hour,minut,secon,year,month,day,den; bool w=1; unsigned long times,times1; int set,hh,mm,ss,dd,mn,gg; void setup() { serial.begin(9600); Serial.begin(9600); clock.begin(); bme.begin(0x76); pinMode(UP,INPUT_PULLUP); pinMode(DW,INPUT_PULLUP); pinMode(SET,INPUT_PULLUP); //clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча VFD_reset(); VFD_brig(1);// 0-5 } void loop() { DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second; year=DateTime.year;month=DateTime.month;day=DateTime.day;den=DateTime.dayOfWeek; if(digitalRead(SET)==LOW){set++;if(set>6){set=0;}delay(200);} hh=hour;mm=minut;ss=secon;dd=day;mn=month;gg=year; if(set==1 && digitalRead(UP)==LOW){hh++;if(hh>23){hh=0;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);} if(set==1 && digitalRead(DW)==LOW){hh--;if(hh<0){hh=0;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);} if(set==2 && digitalRead(UP)==LOW){mm++;if(mm>59){mm=0;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);} if(set==2 && digitalRead(DW)==LOW){mm--;if(mm<0){mm=0;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);} if(set==3 && digitalRead(UP)==LOW){ss=0;clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);} if(set==3 && digitalRead(DW)==LOW){ss=0;clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);} if(set==4 && digitalRead(UP)==LOW){dd++;if(dd>31){dd=1;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);} if(set==4 && digitalRead(DW)==LOW){dd--;if(dd<1){dd=1;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);} if(set==5 && digitalRead(UP)==LOW){mn++;if(mn>12){mn=1;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);} if(set==5 && digitalRead(DW)==LOW){mn--;if(mn<1){mn=1;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);} if(set==6 && digitalRead(UP)==LOW){gg++;if(gg>2099){gg=2099;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);} if(set==6 && digitalRead(DW)==LOW){gg--;if(gg<2023){gg=2023;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);} VFD_cursor(0,0); if(set==1&&millis()-times<200){VFD_print_str(" ");}else{VFD_print_num(hour/10%10);VFD_print_num(hour%10);}VFD_print_str(":"); if(set==2&&millis()-times<200){VFD_print_str(" ");}else{VFD_print_num(minut/10%10);VFD_print_num(minut%10);}VFD_print_str(":"); if(set==3&&millis()-times<200){VFD_print_str(" ");}else{VFD_print_num(secon/10%10);VFD_print_num(secon%10);} VFD_cursor(0,9); if(set==4&&millis()-times<200){VFD_print_str(" ");}else{VFD_print_num(day/10%10);VFD_print_num(day%10);}VFD_print_str("/"); if(set==5&&millis()-times<200){VFD_print_str(" ");}else{VFD_print_num(month/10%10);VFD_print_num(month%10);}VFD_print_str("/"); if(set==6&&millis()-times<200){VFD_print_str(" ");}else{VFD_print_num(year/10%10);VFD_print_num(year%10);} if(millis()-times>400){times=millis();} if(millis()-times1>30000||w==1){ VFD_cursor(1,0); VFD_print_float(bme.readTemperature(),1);VFD_print_str("C"); VFD_cursor(1,7); VFD_print_num(bme.readPressure() / 133.3224);VFD_print_str("mmHg"); VFD_cursor(1,16); VFD_print_num(bme.readHumidity());VFD_print_str("%"); times1=millis();w=0; } VFD_cursor(0,18); switch(den){ case 1: VFD_character(0x15, 0b00111111,0b11000110,0b00011000,0b01100011,0b00000100);VFD_print_str("H");break; case 2: VFD_print_str("BT");break; case 3: VFD_print_str("CP");break; case 4: VFD_character(0x16, 0b00110001,0b11000110,0b00001111,0b00100001,0b11111100);VFD_print_str("T");break; case 5: VFD_character(0x15, 0b00111111,0b11000110,0b00011000,0b01100011,0b00000100);VFD_print_str("T");break; case 6: VFD_print_str("C");VFD_character(0x17, 0x3f,0x84,0x17,0xe3,0x03);break; case 7: VFD_print_str("BC");break; } delay(100); } void VFD_reset(){serial.write(0x1F);} void VFD_clear(){serial.write(0x0D);} void VFD_cursor(byte st, byte sim){serial.write(0x10);serial.write(st*20+sim);} void VFD_print_str(char*data){serial.print(data);} void VFD_print_num(long data){serial.print(data);} void VFD_print_float(float data, byte z){serial.print(data,z);} void VFD_brig(byte br){ serial.write(byte(0x04)); switch(br){ case 0: serial.write(byte(0x00)); case 1: serial.write(0x20); case 2: serial.write(0x40); case 3: serial.write(0x60); case 4: serial.write(0x80); case 5: serial.write(0xFF); } } void VFD_character(byte addr, byte m1,byte m2, byte m3, byte m4, byte m5){ serial.write(0x03); serial.write(addr);// 0X15-0X1E serial.write(byte(m1)); serial.write(byte(m2)); serial.write(byte(m3)); serial.write(byte(m4)); serial.write(byte(m5)); serial.write(addr); }
При подключении дисплея учитывайте что ток потребления может достигать 1,3 А, поэтому питание платы Arduino и дисплея должны быть разделенными.
Датчик давления, температуры и влажности BME280 должен быть вынесен за корпус в котором установлен дисплей, так дисплей довольно энергоемкий и выделяет большое кол-во тепла.
Опрос датчика BME280 происходит каждые 30 секунд.