Проблема с получением значений с экрана Nextion на Arduino

В настоящее время у меня есть установка с датчиком Arduino BME 280 и 4,3-дюймовым экраном Nextion. Что делает моя программа, так это отправляет все вычисленные значения из BME в числа и индикаторы выполнения в моем следующем шаге на экране под названием "Выполнить".

Эта страница состоит из 3 значений: Дельта T, Температура и влажность, а также 3 кнопок для сигнализации. Каждое из этих отображаемых значений подключено к своему собственному индикатору выполнения. Каждое из отдельных значений имеет нижнюю и верхнюю настройки будильника, которые можно настроить на следующем экране под названием "Настройки".

Поэтому в основном то, что я борюсь с заключается в получении в получении значения из моего "настройки", чтобы написать "если" функция в моем Ардуино я.е (если кнопка доступна на странице бегать и значение меньше, чем X на странице "настройки" или более г на странице "настройки", бить тревогу).

Я использовал функцию .GetValue, но она не возвращает значение моей программе Arduino. Может ли кто-нибудь, пожалуйста, помочь. Мы будем вам очень признательны.

// Include required libraries
#include <NexTouch.h>
#include <NexDualStateButton.h>
#include <NexNumber.h>
#include <NexProgressBar.h>
#include <NexText.h>
#include <Nextion.h>
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

//Define BME parameters
#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme; // I2C

//Define variables
int Delta_T;
int Temp_disp;
float Temp_wb;
float Temp;
int rh;

//Define NEXTION variables
//Transport Page
NexNumber Trans_deltaT = NexNumber(2, 10, "n0");
NexNumber Trans_T = NexNumber(2, 11, "n1");
NexNumber Trans_H = NexNumber(2, 12, "n2");
   
//Run Page
NexNumber Run_deltaT = NexNumber(3, 14, "n0");
NexNumber Run_T = NexNumber(3, 15, "n1");
NexNumber Run_H = NexNumber(3, 16, "n2");
NexDSButton Delta_Temp= NexDSButton(3, 12, "bt0");
NexDSButton Temperature= NexDSButton(3, 22, "bt1");
NexDSButton Hum= NexDSButton(3, 13, "bt2");

//Settings Page
NexNumber DT_min= NexNumber(4, 5, "n6");
NexNumber DT_max= NexNumber(4, 12, "n3");
NexNumber T_min= NexNumber(4, 6, "n7");
NexNumber T_max= NexNumber(4, 14, "n4");
NexNumber Hum_min= NexNumber(4, 7, "n8");
NexNumber Hum_max= NexNumber(4, 16, "n5");

NexTouch *nex_listen_list[] = {
  &Delta_Temp,
  &Temperature,
  &Hum,
  &Run_deltaT,
//  &DT_min,
//  &DT_max,
//  &T_min,
//  &T_max,
//  &Hum_min,
//  &Hum_max
    NULL
};

void Delta_TempPopCallback(void*ptr) {
  uint32_t DT = 0;          // Button State
  uint32_t DT_act = 0;
  uint32_t DelT_min = 0;    //Define DT_min setting
  uint32_t DelT_max = 0;    //Define DT_max setting
 
  DT_min.getValue(&DelT_min);
  DT_max.getValue(&DelT_max);
  Delta_Temp.getValue(&DT);
  Run_deltaT.getValue(&DT_act);
 
  Serial.println();
  Serial.println();
  Serial.println(DelT_min);
 
  // Read value of dual state button to know the state (0 or 1)

  if (DT == 0 && DT_act < DelT_min || DT_act > DelT_max) {  // If dual state button is equal to 1 (meaning is ON)...
    digitalWrite(2, HIGH);  // Turn ON internal LED
    Serial.println("ON");
  } else {                  // Since the dual state button is OFF...
    digitalWrite(2, LOW);   // Turn OFF internal LED
    Serial.println("OFF");
  }
}

void setup() {
  Serial.begin(9600);
  bme.begin(); 
  pinMode(2, OUTPUT);
  Delta_Temp.attachPop(Delta_TempPopCallback);
}


void loop() {
  Temp = bme.readTemperature();
  Temp_disp = Temp;
  // Serial.print("Temperature = ");
  // Serial.print(Temp);
  // Serial.println(" *C");
   
  rh=bme.readHumidity();
  // Serial.print("Humidity = ");
  // Serial.print(rh);
  // Serial.println(" %");
     
  Temp_wb = atan(0.151977 * pow(rh + 8.313659, 0.5)) * Temp + atan(Temp + rh) - atan(rh - 1.676331) + 0.00391838 * pow(rh, 1.5) * atan(0.023101 * rh) - 4.686035;
  // Serial.print("Wet Bulb Temp= ");
  // Serial.print(Temp_wb);
  // Serial.println(" *C");
     
  Delta_T=Temp-Temp_wb;
  // Serial.print("Delta T=");
  // Serial.print(Delta_T);
  // Serial.println(" *C");
  // Serial.println();   

  Trans_deltaT.setValue(Delta_T);
  Trans_T.setValue(Temp_disp);
  Trans_H.setValue(rh);

  Run_deltaT.setValue(Delta_T);
  Run_T.setValue(Temp_disp);
  Run_H.setValue(rh);

  nexLoop(nex_listen_list);

  delay(50);
}

, 👍2

Обсуждение

Что вы подразумеваете под "не возвращает значение"? Почему бы вам не распечатать больше значений, которые вы пытаетесь прочитать, чтобы получить больше информации об отладке - по крайней мере, все те, которые вы используете в "если"? Также я бы рекомендовал вам вставлять парены в выражения типа " a && b || c . (a&&b)||c " и "a&&(b||c)" очень разные, и правила приоритета C не всегда интуитивно понятны., @Mat


1 ответ


1

Мне пришлось повторить код getvalue несколько раз, похоже, есть ошибка, на которую указал ютубер в своем видео. https://github.com/rvxfahim/AHU-Firmware/blob/main/development_HMI.ino вы можете видеть из строки 133, я звонил ему так много раз, чтобы быть в безопасности, потому что иногда он ничего не возвращал или, возможно, возвращал ноль, я не помню, чтобы это было давно.

,