Вывод информации на дисплей с millis

04.11.2018
6
0
1
#1
Здравствуйте, начал увлекаться ардуино. Хочу сделать метеостанцию + управление реле с помощью ИК.
Управление релешками с помощью ИК уже сделал, все работает окей! Есть у меня датчик BME280(давление,влажность,температура,относ.высота) будет у меня на улице стоять. Хочу сделать вывод информации с него на дисплей.
Сначала выводятся температура и влажность, через пять секунд выводится давление и высота. С delay все это получилось, но хочу добавить кнопку, нажав на которую будет показывать информация с других датчиков. Как мне добавить в работу millis??
Код:
if (millis() - time > 5000) {

     time = millis();

lcd.setCursor(0, 0);

    lcd.print (L"Температ.: ");

    lcd.print(bme.readTemperature(),0);

    lcd.print(L"°C");

    lcd.setCursor(0, 1);

    lcd.print (L"Влажность: ");

    lcd.print(bme.readHumidity(),0);

    lcd.print (L"%");
Делал такой вариант, но инфа выводится на дисплей и сразу же потухает и так каждые пять секунд.
Целый день сегодня ищу инфу по поводу этого, в итоге ничего.... Помогите пожалуйста начинающему школьнику-ардуинщику, дайте хотя бы наводки какие-нибудь, буду очень благодарен.
P.S Пробовал разными способами сделать вывод инфы : делать вывод другой информации с датчиков через 10 секунд, и чтобы сначала просто выводилась Температура и влажность, а потом используя millis через 5 сек давление и высота - безуспешно, показывается какая-то ерунда....
 
Последнее редактирование:

Wan-Derer

Модератор
Команда форума
31.07.2018
890
125
43
Москва
wan-derer.ru
#2
@dmmmit, Во-первых, у тебя IF не закрыт фигурной скобкой. А во-вторых, ты не показал второй блок, который выводит показания давления и высоты.
А потом возьми и представь себя компьютером. который совсем не понимает чего хочет от него человек, а просто исполняет программу, строчка за строчкой. Пройди по программе с карандашиком и пойми где что не так.
 
04.11.2018
6
0
1
#3
@Wan-Derer вот мой код :
Код:
#include <LCD_1602_RUS.h>
LCD_1602_RUS lcd(0x27, 16, 2);
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme;

void setup (){
Serial.begin(9600);
    lcd.init(); // иницилизируем ЖК
  lcd.backlight(); // включаем подсветку
bme.begin();
}


  void loop()
{

   lcd.setCursor(0, 0);  
    lcd.print (L"Температ.: ");
    lcd.print(bme.readTemperature(),0);
    lcd.print(L"°C");
    lcd.setCursor(0, 1);
    lcd.print (L"Влажность: ");
    lcd.print(bme.readHumidity(),0);
    lcd.print (L"%");
    delay(5000);
    lcd.clear();
    lcd.setCursor(0, 0);  
    lcd.print (L"Давление: ");
    lcd.print(bme.readPressure() / 100.0F * 0.75006375541921,0);
    lcd.print(L"мм");
    lcd.setCursor(0, 1);  
    lcd.print("Высота: ");
    lcd.print(bme.readAltitude(SEALEVELPRESSURE_HPA),0);
    lcd.print("метр");
    delay(5000);
    lcd.clear();
}
это изначальный код с delay. Когда решил добавить кнопку начал куда-то приписывать
if (millis() - time > 5000) {

time = millis();
, но ничего не выходило. В инете нужной инфы не нашел, там только как просто вывести например в Serial, а как вывести и оставить на 5 сек нету...
 

Wan-Derer

Модератор
Команда форума
31.07.2018
890
125
43
Москва
wan-derer.ru
#4
@dmmmit, не надо с делэй. Мы же не его обсуждаем. Давай тот код, который должен работать и описание как он по-твоему должен работать (но не работает)
 
04.11.2018
6
0
1
#5
@Wan-Derer
Вот код:
Код:
#include <LCD_1602_RUS.h>
LCD_1602_RUS lcd(0x27, 16, 2);
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme;
unsigned long timeon;
unsigned long timeoff;
void setup (){
Serial.begin(9600);
    lcd.init(); // иницилизируем ЖК
  lcd.backlight(); // включаем подсветку
bme.begin();
}
void loop()
{
 
   lcd.setCursor(0, 0);   
    lcd.print (L"Температ.: ");
    lcd.print(bme.readTemperature(),0);
    lcd.print(L"°C");
    lcd.setCursor(0, 1);
    lcd.print (L"Влажность: ");
    lcd.print(bme.readHumidity(),0);
    lcd.print (L"%");
  
   if (millis() - timeon > 5000){
    lcd.clear();
    lcd.setCursor(0, 0);   
    lcd.print (L"Давление: ");
    lcd.print(bme.readPressure() / 100.0F * 0.75006375541921,0);
    lcd.print(L"мм");
    lcd.setCursor(0, 1);   
    lcd.print("Высота: ");
    lcd.print(bme.readAltitude(SEALEVELPRESSURE_HPA),0);
    lcd.print("метр");
}
  
   if (millis() - timeoff > 10000){ 
    lcd.clear();
   }
Первые пять секунд после запуска выводит температуру и влажность. Затем начинает выводить два значения и из-за этого текст на экране просто мигает. Мне нужно сделать так: после включения Ардуино выводились показания температуры и влажности на дисплей, затем через пять секунд выводилось давление и высота. И так каждые пять секунд. Нужно сделать именно с millis. Т.к в дальнейшем хочу добавить кнопку и другие датчики. В интернете информацию нашел только по поводу вывода в Сериал, а мне нужно на экран + чтобы вывелась, ждала 5 сек и только потом менялась
P.S Извиняюсь за долгий ответ.
 
04.11.2018
6
0
1
#7
@Wan-Derer Уже проходился, и не раз. вот в этом коде сделал так как думаю. Хотелось бы хоть узнать где ошибка
 

Wan-Derer

Модератор
Команда форума
31.07.2018
890
125
43
Москва
wan-derer.ru
#8
@dmmmit, Ну подумай что случится с твоими IF через 5 и через 10 сек
А чтобы экран не мельтешил, избегай lcd.clear(); внутри циклически повторяющегося вывода.
 
#9
Я бы выделил отдельные функции что-то типа ShowTemperatureAndHumidity(), ShowPressureAndAltitude().
В них уйдут все твои print и основной код займет 5 строк.
Далее в loop ввел бы стандартную state машину. Т.е. ввел переменную режим работы и по ней switch.
А вот эту переменную уже и меняй как угодно. хоть по delay(), хоть по millis().
Получится примерно так:
Код:
int CurrState=0; //текущее состояние
int PreState=1; //предыдущее состояние
// 0 - temp and humidity
// 1 - Pressure and Altitude4

void ShowTemperatureAndHumidity(){
    if (PreState !=CurrState) //чтоб не моргало лишний раз
        lcd.clear();

    lcd.setCursor(0, 0);
    lcd.print (L"Температ.: ");
    lcd.print(bme.readTemperature(),0);
    lcd.print(L"°C");
    lcd.setCursor(0, 1);
    lcd.print (L"Влажность: ");
    lcd.print(bme.readHumidity(),0);
    lcd.print (L"%");
}

void ShowPressureAndAltitude(){
    if (PreState !=CurrState) //чтоб не моргало лишний раз
        lcd.clear();
 
    lcd.setCursor(0, 0);
    lcd.print (L"Давление: ");
    lcd.print(bme.readPressure() / 100.0F * 0.75006375541921,0);
    lcd.print(L"мм");
    lcd.setCursor(0, 1);
    lcd.print("Высота: ");
    lcd.print(bme.readAltitude(SEALEVELPRESSURE_HPA),0);
    lcd.print("метр");
}


unsigned long curtime;
unsigned long lasttime;

void setup (){
  Serial.begin(9600);
  lcd.init(); // иницилизируем ЖК
  lcd.backlight(); // включаем подсветку
  bme.begin();
  lasttime = millis();
}

//сюда вставить обработку кнопки
// в ней ставить CurrState=!CurrState; и менять lasttime на millis();

void loop(){
   currtime = millis();
  if (currtime - lasttime > 5000){
      CurrState=!CurrState;
      lasttime = currtime;
   }

   switch(CurrState){
      case 0:  ShowTemperatureAndHumidity();
                    break;
      case 1: ShowPressureAndAltitude();
               
      default: break;
   }
   delay(200); //чтоб не так часто все дергать.
   PreState = CurrState;
}
 
Последнее редактирование: