Как сохранить значение датчика в EEPROM? (ESP8266)?

Я хотел бы сохранить высоту бака в случае отключения питания с помощью EEPROM и каждый раз, когда я перезагружаю плату. Однако я не смог этого сделать после использования EEPROM.commit (), EEPROM.get и EEPROM.put , так как показания датчика высоты меняются каждый раз, когда я пытался его перезагрузить . Я неправильно его использую?

Я использовал EEPROM.get , EEPROM.put , EEPROM.commit в разделе настройки void, чтобы сохранить данные во время загрузки. Однако высота бака просто меняется всякий раз, когда я меняю его на другой бак с другой высотой после загрузки.

Как я мог бы откалибровать высоту резервуара, если я хотел бы однажды перейти на другой резервуар, могу ли я просто нажать ПЕРВУЮ кнопку на плате ESP8266?

Спасибо

#include <LiquidCrystal_I2C.h>  //1602 LCD library
#include <Wire.h>
#include <EEPROM.h>
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>  //NodeMCU ESP8266 library
#include <BlynkSimpleEsp8266.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);


WidgetLED led1(V2);


 
char auth[] = ""; //Enter your Auth token
char ssid[] = ""; //Enter your WIFI name
char pass[] = ""; //Enter your WIFI password
 
BlynkTimer timer;
bool pinValue = 1;


long duration;
int distance; 
int percentage;
int addr=0;
float tankheight, val;

 
#define trig D7
#define echo D8
#define relay D5
 
void setup() {
  Serial.begin(9600);
  EEPROM.begin(512);
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);
  pinMode(relay, OUTPUT);
  Wire.begin(D2, D1);
  lcd.init();
  lcd.backlight();
  Blynk.begin(auth, ssid, pass);
  digitalWrite(trig, LOW);
  delayMicroseconds(4);
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  duration = pulseIn(echo, HIGH);
  tankheight = duration * 0.034 / 2;
  Serial.print("Tank height");
  Serial.print(tankheight);
  EEPROM.put(addr, tankheight);
  EEPROM.commit();
  val=EEPROM.get(addr, tankheight);
  Serial.print("Addr");
  Serial.print(val);
  timer.setInterval(1L, Wlevel);
  digitalWrite(relay, HIGH);
}
 


BLYNK_CONNECTED(){
  Blynk.syncAll();

  }
 
BLYNK_WRITE(V0) {
  pinValue = param.asInt();

}



void loop() {
  Blynk.run();
  timer.run();
  WiFi.setSleepMode(WIFI_NONE_SLEEP);

}

void Wlevel(){  // Initialize detecting water level and relay)
  {
  digitalWrite(trig, LOW);
  delayMicroseconds(4);
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  duration = pulseIn(echo, HIGH);
  distance = duration * 0.034 / 2;
  percentage= map(distance,val,10 ,0, 100);
 
  Blynk.virtualWrite(V1, percentage);  

  if(percentage<0)
  {
    percentage = 0;
  }
  else if(percentage>100)
  {
    percentage = 100;
  }

 }
  

 if (pinValue == 1)
    {
       if (percentage < 100)
       {
          digitalWrite(relay, LOW);
          Serial.print("Water level:");
          Serial.print(percentage);
          Serial.print("%");
          Serial.println(" Pump is ON");
          led1.on();
          lcd.setCursor(0,0);
          lcd.print("Water Lvl:");
          lcd.print(percentage);
          lcd.print("%  ");
          lcd.setCursor(0,1);
          lcd.print("Pump: ON  (AUTO)");
          
       } 
       
       else 
       {
          digitalWrite(relay, HIGH);
          Serial.println("Water level is 100%   Pump is OFF");
          led1.off();
          lcd.setCursor(0, 0);
          lcd.print("Water Lvl:");
          lcd.print(percentage);
          lcd.print("%  ");
          lcd.setCursor(0,1);
          lcd.print("Pump: OFF (AUTO)");
          
       }
    }
   else
    {
      digitalWrite(relay, HIGH);
      Serial.print("Water level:");
      Serial.print(percentage);
      Serial.print("%");
      Serial.println("System is OFF, Check Blynk");
      lcd.setCursor(0,0);
      lcd.print("Water Lvl:");
      lcd.print(percentage);
      lcd.print("%  ");
      lcd.setCursor(0,1);
      lcd.print("System is OFF   ");
      led1.off();
      
    }

   }

, 👍-1

Обсуждение

вы действительно изучали свою собственную программу? ... какой смысл использовать EEPROM, когда первое, что вы делаете, - это удаляете сохраненное значение ?, @jsotola

@jsotola Я новичок в программировании и очень стараюсь. Какая часть кода уничтожит сохраненное значение? Я думал, что ввел команду EEPROM в настройку void, чтобы высота резервуара была помещена в EEPROM? Я делаю это неправильно?, @clement01

взгляните на все строки программы, которые начинаются с EEPROM ... посмотрите, что делает каждый из них, @jsotola

почему вы хотите сохранить уровень воды?, @jsotola

@jsotola Я хотел бы сохранить высоту бака в начале, чтобы при отключении питания высота бака не стиралась сама по себе после перезагрузки. Из кода я сначала ввел высоту бака в addr с помощью EEPROM.put, а затем сохранил ее с помощью EEPROM.commit. После этого я перечитал его еще раз и вставил в "вэл". Ниже я также написал "процент= карта(расстояние,вал,10 ,0, 100);" , вал должен быть сохраненной высотой бака, а 10 - это расстояние от ультразвукового датчика до максимальной высоты воды., @clement01

и вы не видите проблемы с первым сохранением уровня воды после перезагрузки? ... подумайте об этом... это действительно не имеет ничего общего с программированием, @jsotola


1 ответ


1

Используйте другую кнопку - возможно, вам придется что-то подключить...

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

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

,

Как насчет того, чтобы добавить виртуальную кнопку в приложения Blynk, чтобы я мог откалибровать ее с помощью приложения Blynk вместо физической кнопки? Что касается калибровки и EEPROM, должен ли я создать еще один цикл в другой функции или достаточно функции настройки void ? Спасибо, @clement01

виртуальная кнопка может работать. если в приложениях Blynk есть какой-то графический интерфейс, то ваш вызов для записи eeprom относится к чему-то, называемому Blynk.run() (который вызывает ваша функция цикла), а не к настройке., @Abel