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(){
и заработало, НО не пишет в память по нажатию кнопок в блинке((
Сделал!
Во, а говорили не разбираетесь, оказывается просто необходимо желание :)
Да я вообще не шарю практически, тупо по примерам...вообще случайно похожую строчку нашёл и вставил...так бы сам никогда не догадался.... и то, надо бы чтоб кто-нибудь глянул нормальным глазом, всё ли нормально там по коду...
Ну вы даёте, конечно. Это как случайно дачу построить, а потом кого-нить из строителей позвать, чтобы глянул.
В отличии от дачи, тут всё кристально прозрачно и видно весь код), не надо рыть шурфы, чтоб посмотреть как устроен фундамент))