Как сохранить значение датчика в 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();
}
}
@clement01, 👍-1
Обсуждение1 ответ
Используйте другую кнопку - возможно, вам придется что-то подключить...
В цикле считайте кнопку, и только если она нажата, вы должны выполнить повторную калибровку и установить значение eeprom. Вы также можете сделать это в настройках, но тогда вам придется перезагрузиться, нажав кнопку, чтобы запустить повторную калибровку.
Вы также можете прочитать последовательную команду в цикле. Все внешнее, что может быть запущено с отдельным намерением перекалибровки, будет работать. Отключение питания слишком сильно напоминает обычный сброс. Чтобы выполнить различное поведение в двух разных сценариях, вы должны уметь определять, в каком сценарии вы находитесь.
Как насчет того, чтобы добавить виртуальную кнопку в приложения Blynk, чтобы я мог откалибровать ее с помощью приложения Blynk вместо физической кнопки? Что касается калибровки и EEPROM, должен ли я создать еще один цикл в другой функции или достаточно функции настройки void ? Спасибо, @clement01
виртуальная кнопка может работать. если в приложениях Blynk есть какой-то графический интерфейс, то ваш вызов для записи eeprom относится к чему-то, называемому Blynk.run() (который вызывает ваша функция цикла), а не к настройке., @Abel
- Как заставить 5-вольтовое реле работать с NodeMCU
- ESP8266 не подключается к Wi-Fi
- Разница между этими двумя платами NodeMCU?
- NodeMCU - использовать кнопку flash в качестве входного сигнала в loop()
- Как определить размер Flash?
- Как изменить имя модуля ESP8266-12E по умолчанию
- Простой запрос GET с ESP8266HTTPClient
- В ESP-12E NodeMCU, какой выход PIN A0?
вы действительно изучали свою собственную программу? ... какой смысл использовать EEPROM, когда первое, что вы делаете, - это удаляете сохраненное значение ?, @jsotola
@jsotola Я новичок в программировании и очень стараюсь. Какая часть кода уничтожит сохраненное значение? Я думал, что ввел команду EEPROM в настройку void, чтобы высота резервуара была помещена в EEPROM? Я делаю это неправильно?, @clement01
взгляните на все строки программы, которые начинаются с EEPROM ... посмотрите, что делает каждый из них, @jsotola
почему вы хотите сохранить уровень воды?, @jsotola
@jsotola Я хотел бы сохранить высоту бака в начале, чтобы при отключении питания высота бака не стиралась сама по себе после перезагрузки. Из кода я сначала ввел высоту бака в addr с помощью EEPROM.put, а затем сохранил ее с помощью EEPROM.commit. После этого я перечитал его еще раз и вставил в "вэл". Ниже я также написал "процент= карта(расстояние,вал,10 ,0, 100);" , вал должен быть сохраненной высотой бака, а 10 - это расстояние от ультразвукового датчика до максимальной высоты воды., @clement01
и вы не видите проблемы с первым сохранением уровня воды после перезагрузки? ... подумайте об этом... это действительно не имеет ничего общего с программированием, @jsotola