Ранее в статье 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 секунд.
Здравствуйте. Собрал вашу схему, залил скетч, но на дисплей ничего не выводится. Проверял по отдельности DS3231 и BME280 тестовыми скетчами, данные в монитор порта выводятся, значит они рабочие. Дисплей и Ардуинка тоже рабочие, проверено со скетчем от другого проекта на VFD. Обратил внимание, что у вас нет команды на запуск I2C шины ( wire.begin(); ), но с её добавлением ничего не поменялось. Будто что-то мешает данным от датчиков, или наоборот чего-то им не хватает.
проведите тестовый запуск дисплея — http://rcl-radio.ru/?p=131325
Делал. С небольшими изменениями в скетче все работает.
У меня дисплей немного отличается, но сути это не меняет, в нем я тоже подключаюсь к RX и также вывожу данные.
#include
SoftwareSerial mySerial(3,10); // RX, TX
void setup() {
mySerial.begin(9600);
delay(1000);
}
void loop() {
mySerial.print(«\e[1;1H»);
mySerial.println(«RCL-RADIO.RU»);
mySerial.print(1234567890);
VFD_cursor(1,12);
VFD_print_float(1.2569,3);
delay(200);
пройдите тест i2c — http://forum.rcl-radio.ru/viewtopic.php?id=64
на соответствие i2c адреса датчика с указанным в скетче.
Пишет что датчик найден по адрес у 0х76, как в скетче.
К сожалению я не смогу Вам помочь, у меня все работает, уже несколько месяцев. Вы используете другой дисплей , возможно Вы внесли не все исправления под Ваш дисплей в скетч.