Погодная станция на VFD-дисплее FUTABA M202MD10D (Arduino)

Ранее в статье 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 секунд.

Comments

  1. Здравствуйте. Собрал вашу схему, залил скетч, но на дисплей ничего не выводится. Проверял по отдельности DS3231 и BME280 тестовыми скетчами, данные в монитор порта выводятся, значит они рабочие. Дисплей и Ардуинка тоже рабочие, проверено со скетчем от другого проекта на VFD. Обратил внимание, что у вас нет команды на запуск I2C шины ( wire.begin(); ), но с её добавлением ничего не поменялось. Будто что-то мешает данным от датчиков, или наоборот чего-то им не хватает.

      1. Делал. С небольшими изменениями в скетче все работает.
        У меня дисплей немного отличается, но сути это не меняет, в нем я тоже подключаюсь к 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);

            1. К сожалению я не смогу Вам помочь, у меня все работает, уже несколько месяцев. Вы используете другой дисплей , возможно Вы внесли не все исправления под Ваш дисплей в скетч.

Добавить комментарий

Войти с помощью: