Нельзя переключаться между RTC и каким-либо событием

Какие-нибудь идеи, пожалуйста? Я застрял, и также не судите меня за то, как я написал код. Я новичок в программировании и все еще учусь. Итак, идея заключается в том, что я хочу отображать данные и часы на ЖК-дисплее, но когда лампа включена, я хочу, чтобы сообщение печаталось в течение 5 секунд, затем часы и дата будут напечатаны снова... и так далее. Данные с последовательного канала поступают из esp, которые запускают какое-либо событие по беспроводной сети.Arduino получает обратную связь о том, что работа выполнена, а затем выводит сообщение на ЖК-дисплей. Точнее.. Используя mqtt - из браузера, я нажимаю кнопку, чтобы включить лампу. Как только лампа включена, на esp приходит сообщение от брокера mqtt о том, что лампа включена. esp затем отправляет данные в arduino с помощью последовательного. и arduino должен отображать текст "Лампа включена".

    #include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <DS3231.h>

LiquidCrystal_I2C lcd(0x3F,20,4);
DS3231 rtc (SDA, SCL);

int verificare_stare_releu = A13;
char a;

void setup(){
  Serial.begin(115200);
  rtc.begin();
  lcd.init();
  lcd.backlight();
  pinMode(A13,INPUT);
}

void loop(){

  int b = analogRead(verificare_stare_releu);
    if(!Serial.available()){
    display_clock();
    }
    if(!Serial.available()){
    if(b >= 900){
      lcd.print("Lamp ON ");
    }

    if( b < 900 ){
      lcd.print("Lamp OFF");  
    }

    }



  if(Serial.available()>0){
    a = Serial.read();
    if(a == 102){
    lcd.setCursor(0,0);
    lcd.print("Lamp ON ");
    }
  if(a == 110){
    lcd.setCursor(0,0);
    lcd.print("Lamp OFF");
  }  
  }


}

  //a = digitalRead(verificare_stare_releu);


void display_clock (){
   lcd.setCursor(0,0);
  lcd.print("Ora: "+(String)rtc.getTimeStr());
  lcd.setCursor(0,1);
  lcd.print((String)rtc.getDOWStr()+(String) rtc.getDateStr());
}

, 👍0

Обсуждение

Взгляните на пример обнаружения изменений состояния: https://www.arduino.cc/en/Tutorial/StateChangeDetection Когда вы включаете лампу в переменную on/off и запоминаете lastLampState, то можете обнаружить изменение и вывести сообщение на дисплей на 5 секунд. Аналоговый вход можно использовать без pinMode, как вы можете видеть здесь: https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/ Можете ли вы описать, для чего используются данные из последовательного порта? Скетч тестируется три раза для ввода данных с последовательного порта, но вы должны протестировать его один раз. Попробуйте разделить разные вещи., @Jot

Данные из serial поступают из esp, который запускает какое-то событие wireless.Arduino получает обратную связь о том, что работа выполнена, а затем выводит сообщение на жидкокристаллический дисплей. Точнее.. Используя браузер mqtt - from, я нажимаю кнопку, чтобы включить лампу. Как только лампа горит, в esp поступает сообщение от брокера mqtt о том, что лампа сейчас включена. затем esp отправляет данные в arduino с помощью serial. и arduino должен отображать текст "Лампа включена"., @Iulian Chirvasa

Не могли бы вы добавить эту информацию к своему вопросу, пожалуйста. Пожалуйста, объясните также разницу между последовательными данными esp и данными аналогового вывода., @Jot

Не могу сказать, что я думал ясно, когда думал, что это можно сделать, но я хочу использовать обе платы. Arduino Mega потому что у него так много входов/выходов и какое-то беспроводное устройство. Поскольку у меня есть только Nodemcu, я использую это.Итак, что я хочу сделать, так это общаться между Raspberry(как mqtt broker), Esp (mqtt client) и arduino. Arduino будет иметь ЖК-дисплей и некоторые датчики. Я хотел бы отобразить на нем данные: час, температуру,влажность,давление. Но кроме того, я хочу отобразить некоторые события, которые я активирую с веб-стороны. Как я уже сказал ... если я включу лампу, esp будет взаимодействовать с arduino с помощью serial., @Iulian Chirvasa

если лампа горит,то на ЖК-дисплее появится какое-то сообщение,сообщающее об этом в течение 5 секунд. затем переключитесь на свайп между rtc, давлением, dht и т.д., @Iulian Chirvasa

я также использую приложение blynk, где кнопка настроена для ссылки на вывод nr от esp, который контролирует состояние лампы(вкл/выкл). Поэтому, когда я использую приложение и нажимаю кнопку, чтобы включить лампу, я использую другой контакт(в моем случае это аналоговый контакт A13), чтобы увидеть, включено или выключено реле, и поэтому Arduino будет знать, использовал ли я приложение на телефоне, чтобы включить лампу, и будет отображение сообщения, соответствующего состоянию., @Iulian Chirvasa


1 ответ


0

Хотя я все еще не понимаю, как объединить данные с последовательного порта с аналоговым входом, я могу показать, как отображать сообщение в течение 5 секунд, используя пример Мигания без задержки.

Логическая переменная "сообщение" используется для предотвращения использования обычного кода на дисплее в течение 5 секунд. Та же логическая переменная используется для проверки того, прошло ли 5 секунд (с использованием миллиса). По истечении 5 секунд логическая переменная устанавливается в значение "false", и это освобождает дисплей, чтобы его можно было использовать для обычных вещей.

Чтобы начать 5 секунд, необходимы эти две строки:

previousMillis = millis();
message = true;

Когда "сообщение" имеет значение true, переменная "previousMillis" должна быть допустимой. Как только "сообщение" становится ложным, значение "previousMillis" больше не используется.

Скетч может быть таким:

unsigned long previousMillis;
const unsigned long interval = 5000;  // 5 секунд
bool message = false;     // true, если отображается сообщение

void setup() {
  // код для настройки здесь
}

void loop() {
  if(!message) {          // сообщение не отображается ?
    // показать температуру, время и т.д.
  }

  if(Serial.available() > 0) {
    int a = Serial.read();
    switch(a) {
      case 102:
        lcd.setCursor(0,0);
        lcd.print("Lamp ON ");
        previousMillis = millis(); // remember this moment
        message = true;    // задать логическую переменную
        break;
    }
  }

  if(message) {
    if(millis() - previousMillis >= interval) {
      // прошло 5 секунд ?
      message = false;    // освободить дисплей
    }
  }
}
,

@jsotola Я попытался дать лучшее объяснение. Дайте мне знать, если мне нужно будет улучшить его еще больше., @Jot

теперь это кажется достаточно ясным ... комментарии в коде говорят сами за себя, @jsotola