NodeMCU проблема с чтением EEPROM....
- Войдите на сайт для отправки комментариев
Чт, 23/07/2020 - 23:46
Всем привет.
Пытаюсь записать в память контроллера два значения по нажатию кнопок. Не получается....
#include <OneWire.h>
#include <Wire.h>
//датчик температуры пола DS18B20
#define DS D6 //объявляем пин датчика температуры пола DS18B20 как GPIO 12 (D6)
OneWire ds1(DS);
float tempPol = 99.0; // Текущие показания от датчика теплого пола ds18b20
// датчик влажн почвы
#define SENS_HUM A0 //объявляем пин датчика влажн почвы как GPIO 17 (A0)
#define But_Min D7 //Виртуальная кнопка колибровки Min значения влажности почвы
#define But_Max D8 //Виртуальная кнопка колибровки Max значения влажности почвы
// датчик влажн почвы
int16_t humIn; // Читаем показания датчика влажности почвы Аналоговый вход
int16_t humOut; // Оброботанные показания от датчика влажности почвы 0-100%
float MIN_SENS = 480; // Калибровка 0%
float MAX_SENS = 210; // Калибровка 100%
////////////////////////EEPROM//////////////////////////////////////////////////////////
#include <EEPROM.h>
//#include "EEPROMAnything.h"
void setupAddrEEPROM(){
EEPROM.begin(8);
//EEPROM_readAnything(0, MIN_SENS);
//EEPROM_readAnything(4, MAX_SENS);
EEPROM.get(0, MIN_SENS);
EEPROM.get(4, MAX_SENS);
EEPROM.end();
}
////////////////////////EEPROM-END//////////////////////////////////////////////////////
void sendSensor()
{
byte data1[2];
ds1.reset();
ds1.write(0xCC);
ds1.write(0x44);
// Читаем данные с ds18b20
ds1.reset();
ds1.write(0xCC);
ds1.write(0xBE);
data1[0] = ds1.read();
data1[1] = ds1.read();
tempPol = ((data1[1] << 8) | data1[0]) * 0.0625;
// Выводим показания в монитор порта
Serial.print("tempPol:");
Serial.println(tempPol);
// Читаем показания датчика влажности почвы
humIn = analogRead(SENS_HUM);
// Обрабатываем показания и представляем в виде от 0 до 100
humOut = map(humIn, int16_t(MIN_SENS), int16_t(MAX_SENS), 0, 100);
// humOut = map(humIn, 480, 210, 0, 100);
// Выводим показания в монитор порта
Serial.print("humIn:");
Serial.println(humIn);
Serial.print("MIN_SENS:");
Serial.println(MIN_SENS);
Serial.print("MAX_SENS:");
Serial.println(MAX_SENS);
Serial.print("humOut:");
Serial.println(humOut);
}
void setup()
{
// Debug console
Serial.begin(9600);
// Загружаем данные из EEPROM
setupAddrEEPROM();
delay(2000);
// Инициализация PIN-ов Arduino
pinMode(SENS_HUM, INPUT);
delay(50);
// Инициализация датчика OneWire для DS18B20
Wire.begin();
delay(50);
}
void loop()
{
if( digitalRead(But_Min) == HIGH )
{
EEPROM.begin(8);
//EEPROM_writeAnything(0, MIN_SENS);
EEPROM.put(0, MIN_SENS);
EEPROM.end();
delay(50);
}
if( digitalRead(But_Max) == HIGH )
{
EEPROM.begin(8);
//EEPROM_writeAnything(4, MAX_SENS);
EEPROM.put(4, MAX_SENS);
EEPROM.end();
delay(50);
}
sendSensor();
}
В монитор порта сыпет ошибки....
Какие ошибки? Секрет?
Нет конечно))
00:53:48.696 -> H)⸮⸮
00:53:48.730 -> ⸮tempPol:27.06
00:53:50.974 ->
00:53:50.974 -> --------------- CUT HERE FOR EXCEPTION DECODER ---------------
00:53:51.042 ->
00:53:51.042 -> Exception (0):
00:53:51.076 -> epc1=0x4000dce5 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
00:53:51.144 ->
00:53:51.144 -> >>>stack>>>
00:53:51.178 ->
00:53:51.178 -> ctx: cont
00:53:51.178 -> sp: 3ffffdc0 end: 3fffffc0 offset: 0190
00:53:51.212 -> 3fffff50: 40202f97 3ffe84d4 3ffee494 40201e0c
00:53:51.280 -> 3fffff60: 3ffee330 3ffe84d4 3ffee494 40201122
00:53:51.314 -> 3fffff70: 00000000 3ffee6bc 00000032 40202484
00:53:51.382 -> 3fffff80: 40202f21 00000032 3ffee5b0 3ffee5b0
00:53:51.450 -> 3fffff90: 3fffdad0 00000000 3ffee45c 402012f3
00:53:51.484 -> 3fffffa0: feefeffe feefeffe 3ffee570 402025a0
00:53:51.552 -> 3fffffb0: feefeffe feefeffe 3ffe84f4 40100ec1
00:53:51.586 -> <<<stack<<<
00:53:51.620 ->
задержка 2 секунды (строка 84) - непозволительная роскошь для ЕСП, у него скорее всего ватчдог срабатывает.
задержка 2 секунды (строка 84) - непозволительная роскошь для ЕСП, у него скорее всего ватчдог срабатывает.
изменил на 1000, не помогло...
если поменять строчку 62 на 63
то скетч на половину работает, ошибок нет, но данные по нажатию не сохраняет....
В esp ещё commit если я правильно помню после записи вызвать надо. Щас попробую пример найти, недавно на форуме было.
По сути либо коммит либо энд, но пробовал с коммитом тоже, ноль толку...
А почему put а не write используете?
write записывает всего 1 байт (int8_t), число от от -128 до 127.
http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/nodemcu-i-eepr...
Вообще ничего мне не говорит...)
Я в программировании ардуин почти ноль(( делал скетч по образу и подобию....
Опа, что то получилось....
добавил пару строк
EEPROM.put(0, MIN_SENS);
EEPROM.put(4, MAX_SENS);
В void setupAddrEEPROM(){
и заработало, НО не пишет в память по нажатию кнопок в блинке((
#define BLYNK_PRINT Serial #include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> #include <OneWire.h> #include <Wire.h> // период чтения датчиков не менее 2сек(2000UL) //#define READ_DATA 2000UL //uint32_t ms; // Текущее время в милисекундах //датчик температуры пола DS18B20 #define DS D6 //объявляем пин датчика температуры пола DS18B20 как GPIO 12 (D6) OneWire ds1(DS); float tempPol = 99.0; // Текущие показания от датчика теплого пола ds18b20 // датчик влажн почвы #define SENS_HUM A0 //объявляем пин датчика влажн почвы как GPIO 17 (A0) #define But_Min V9 //Виртуальная кнопка колибровки Min значения влажности почвы #define But_Max V10 //Виртуальная кнопка колибровки Max значения влажности почвы // датчик влажн почвы int16_t humIn; // Читаем показания датчика влажности почвы Аналоговый вход int16_t humOut; // Оброботанные показания от датчика влажности почвы 0-100% float MIN_SENS = 480; // Калибровка 0% float MAX_SENS = 210; // Калибровка 100% BlynkTimer timer; ////////////////////////////CONNECT//////////////////////////////////////////////// #define USE_LOCAL_SERVER #ifdef USE_LOCAL_SERVER #define SERVER IPAddress(192, 168, 1, 17) // Свой IP пишите #endif /* Wifi Credentials */ #define WIFI_SSID "***" //Имя точки доступа WIFI VVK AndroidAP #define WIFI_PASS "***" //пароль точки доступа WIFI vtb24admin 1234567890 /* Blynk Auth Code */ #define AUTH "***" /////////////////////////////////////////////////////// // Функции для подключения к Blynk // void ConnectBlynk() { //******************************************************* // Запускаем WiFi if (WiFi.status() != WL_CONNECTED)// Если нет WiFi, то коннектимся { BLYNK_LOG(WIFI_SSID); WiFi.begin(WIFI_SSID, WIFI_PASS); int8_t count=0; while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); Serial.print(WiFi.status()); count++; if (count >= 5){break;Serial.println("WiFi not connected");} } } /* Дисконект - для справки WiFi.disconnect(); // отключаемся от сети Serial.println("Disconnect WiFi."); */ //******************************************************* // Запускаем Blynk if (WiFi.status() == WL_CONNECTED)// Если нет WiFi, то не коннектимся { // CONNECT TO BLYNK #ifdef USE_LOCAL_SERVER // Если используются локальный сервер Blynk.config(AUTH, SERVER, 8080); Blynk.connect(); #else // Иначе конектимся постаринке к блинку Blynk.config(AUTH); Blynk.connect(); #endif } // До бесконечности будем оставаться в цикле while // пока не установим связь с сервером // while (Blynk.connect() == false) {} }//ConnectBlynk() // Реконектимся если обрыв связи void reconnectBlynk() { if (!Blynk.connected()) { BLYNK_LOG("Disconnected now"); ConnectBlynk(); if (Blynk.connected()) { BLYNK_LOG("Reconnected"); } else { BLYNK_LOG("Not reconnected"); } } } ////////////////////////////CONNECT-END////////////////////////////////////////////////// ////////////////////////EEPROM////////////////////////////////////////////////////////// #include <EEPROM.h> // void setupAddrEEPROM(){ EEPROM.begin(8); EEPROM.put(0, MIN_SENS); EEPROM.put(4, MAX_SENS); EEPROM.get(0, MIN_SENS); EEPROM.get(4, MAX_SENS); EEPROM.end(); } ////////////////////////EEPROM-END////////////////////////////////////////////////////// void sendSensor() { // static uint32_t msDHT = 0; byte data1[2]; ds1.reset(); ds1.write(0xCC); ds1.write(0x44); // if (ms - msDHT >= READ_DATA) // { Blynk.virtualWrite(V5, tempPol); Blynk.virtualWrite(V8, humOut); //Blynk.virtualWrite(But_Min, HIGH); //Blynk.virtualWrite(But_Max, HIGH); // Читаем данные с ds18b20 ds1.reset(); ds1.write(0xCC); ds1.write(0xBE); data1[0] = ds1.read(); data1[1] = ds1.read(); tempPol = ((data1[1] << 8) | data1[0]) * 0.0625; // Выводим показания в монитор порта Serial.print("tempPol:"); Serial.println(tempPol); // Читаем показания датчика влажности почвы humIn = analogRead(SENS_HUM); // Обрабатываем показания и представляем в виде от 0 до 100 humOut = map(humIn, int16_t(MIN_SENS), int16_t(MAX_SENS), 0, 100); //humOut = map(humIn, 480, 210, 0, 100); // Выводим показания в монитор порта Serial.print("humIn:"); Serial.println(humIn); Serial.print("MIN_SENS:"); Serial.println(MIN_SENS); Serial.print("MAX_SENS:"); Serial.println(MAX_SENS); Serial.print("humOut:"); Serial.println(humOut); // msDHT = ms; // } } void setup() { // Debug console Serial.begin(9600); // Загружаем данные из EEPROM setupAddrEEPROM(); delay(2000); // Инициализация PIN-ов Arduino pinMode(SENS_HUM, INPUT); delay(50); // Вызываем функцию подключения к Blynk reconnectBlynk(); // Задаем интервальные таймеры timer.setInterval(30000, reconnectBlynk); // Проверяем есть ли связь с сервером timer.setInterval(1500L, sendSensor); // Инициализация датчика OneWire для DS18B20 Wire.begin(); delay(50); } void loop() { //ms = millis(); if( digitalRead(But_Min) == HIGH ) { EEPROM.begin(8); EEPROM.put(0, MIN_SENS); EEPROM.end(); delay(50); } if( digitalRead(But_Max) == HIGH ) { EEPROM.begin(8); EEPROM.put(4, MAX_SENS); EEPROM.end(); delay(50); } // sendSensor(); if (Blynk.connected()){ Blynk.run();} timer.run(); }Сделал!
#define BLYNK_PRINT Serial #include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> #include <OneWire.h> #include <Wire.h> //датчик температуры пола DS18B20 #define DS D6 //объявляем пин датчика температуры пола DS18B20 как GPIO 12 (D6) OneWire ds1(DS); float tempPol = 99.0; // Текущие показания от датчика теплого пола ds18b20 // датчик влажн почвы #define SENS_HUM A0 //объявляем пин датчика влажн почвы как GPIO 17 (A0) #define But_Min V9 //Виртуальная кнопка колибровки Min значения влажности почвы #define But_Max V10 //Виртуальная кнопка колибровки Max значения влажности почвы // датчик влажн почвы int16_t humIn; // Читаем показания датчика влажности почвы Аналоговый вход int16_t humOut; // Оброботанные показания от датчика влажности почвы 0-100% float MIN_SENS = 480; // Калибровка 0% float MAX_SENS = 210; // Калибровка 100% BlynkTimer timer; ////////////////////////////CONNECT//////////////////////////////////////////////// #define USE_LOCAL_SERVER #ifdef USE_LOCAL_SERVER #define SERVER IPAddress(192, 168, 1, 17) // Свой IP пишите #endif /* Wifi Credentials */ #define WIFI_SSID "**" //Имя точки доступа WIFI VVK AndroidAP #define WIFI_PASS "**" //пароль точки доступа WIFI vtb24admin 1234567890 /* Blynk Auth Code */ #define AUTH "**" /////////////////////////////////////////////////////// // Функции для подключения к Blynk // void ConnectBlynk() { //******************************************************* // Запускаем WiFi if (WiFi.status() != WL_CONNECTED)// Если нет WiFi, то коннектимся { BLYNK_LOG(WIFI_SSID); WiFi.begin(WIFI_SSID, WIFI_PASS); int8_t count=0; while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); Serial.print(WiFi.status()); count++; if (count >= 5){break;Serial.println("WiFi not connected");} } } /* Дисконект - для справки WiFi.disconnect(); // отключаемся от сети Serial.println("Disconnect WiFi."); */ //******************************************************* // Запускаем Blynk if (WiFi.status() == WL_CONNECTED)// Если нет WiFi, то не коннектимся { // CONNECT TO BLYNK #ifdef USE_LOCAL_SERVER // Если используются локальный сервер Blynk.config(AUTH, SERVER, 8080); Blynk.connect(); #else // Иначе конектимся постаринке к блинку Blynk.config(AUTH); Blynk.connect(); #endif } // До бесконечности будем оставаться в цикле while // пока не установим связь с сервером // while (Blynk.connect() == false) {} }//ConnectBlynk() // Реконектимся если обрыв связи void reconnectBlynk() { if (!Blynk.connected()) { BLYNK_LOG("Disconnected now"); ConnectBlynk(); if (Blynk.connected()) { BLYNK_LOG("Reconnected"); } else { BLYNK_LOG("Not reconnected"); } } } ////////////////////////////CONNECT-END////////////////////////////////////////////////// ////////////////////////EEPROM////////////////////////////////////////////////////////// #include <EEPROM.h> void setupAddrEEPROM(){ EEPROM.begin(8); EEPROM.get(0, MIN_SENS); EEPROM.get(4, MAX_SENS); if(int16_t(MIN_SENS) == 0) { EEPROM.begin(8); MIN_SENS = 480; EEPROM.put(0, MIN_SENS); EEPROM.end(); } if(int16_t(MAX_SENS) == 0) { EEPROM.begin(8); MAX_SENS = 210; EEPROM.put(4, MAX_SENS); EEPROM.end(); } EEPROM.end(); } ////////////////////////EEPROM-END////////////////////////////////////////////////////// void pressVButton_Min() { EEPROM.begin(8); MIN_SENS = analogRead(SENS_HUM); EEPROM.put(0, MIN_SENS); EEPROM.end(); delay(50); } BLYNK_WRITE(But_Min){ int pinValue = param.asInt(); Serial.print("But_Min: "); Serial.println(pinValue); if(pinValue == 1) { pressVButton_Min(); } } void pressVButton_Max() { EEPROM.begin(8); MAX_SENS = analogRead(SENS_HUM); EEPROM.put(4, MAX_SENS); EEPROM.end(); delay(50); } BLYNK_WRITE(But_Max){ int pinValue2 = param.asInt(); Serial.print("But_Max: "); Serial.println(pinValue2); if(pinValue2 == 1) { pressVButton_Max(); } } void sendSensor() { byte data1[2]; ds1.reset(); ds1.write(0xCC); ds1.write(0x44); Blynk.virtualWrite(V5, tempPol); Blynk.virtualWrite(V8, humOut); // Читаем данные с ds18b20 ds1.reset(); ds1.write(0xCC); ds1.write(0xBE); data1[0] = ds1.read(); data1[1] = ds1.read(); tempPol = ((data1[1] << 8) | data1[0]) * 0.0625; // Выводим показания в монитор порта Serial.print("tempPol:"); Serial.println(tempPol); // Читаем показания датчика влажности почвы humIn = analogRead(SENS_HUM); // Обрабатываем показания и представляем в виде от 0 до 100 humOut = map(humIn, int16_t(MIN_SENS), int16_t(MAX_SENS), 0, 100); // Выводим показания в монитор порта Serial.print("humIn:"); Serial.println(humIn); Serial.print("MIN_SENS:"); Serial.println(MIN_SENS); Serial.print("MAX_SENS:"); Serial.println(MAX_SENS); Serial.print("humOut:"); Serial.println(humOut); } void setup() { // Debug console Serial.begin(9600); // Загружаем данные из EEPROM setupAddrEEPROM(); delay(2000); // Инициализация PIN-ов Arduino pinMode(SENS_HUM, INPUT); delay(50); // Вызываем функцию подключения к Blynk reconnectBlynk(); // Задаем интервальные таймеры timer.setInterval(30000, reconnectBlynk); // Проверяем есть ли связь с сервером timer.setInterval(1500L, sendSensor); // Инициализация датчика OneWire для DS18B20 Wire.begin(); delay(50); } void loop() { if (Blynk.connected()){ Blynk.run();} timer.run(); }Во, а говорили не разбираетесь, оказывается просто необходимо желание :)
Да я вообще не шарю практически, тупо по примерам...вообще случайно похожую строчку нашёл и вставил...так бы сам никогда не догадался.... и то, надо бы чтоб кто-нибудь глянул нормальным глазом, всё ли нормально там по коду...
Ну вы даёте, конечно. Это как случайно дачу построить, а потом кого-нить из строителей позвать, чтобы глянул.
В отличии от дачи, тут всё кристально прозрачно и видно весь код), не надо рыть шурфы, чтоб посмотреть как устроен фундамент))