SPAX
Member
Всем привет.
Сразу скажу, я новичок, в программировании ардуин очень мало шарю, создавал скетч по образу и подобию с разных других проектов...
Хочу сделать вайфай контроллер за наблюдением температуры и влажности почвы через приложение Blynk.
Имеется NodeMCU v3, DS18B20 и ёмкостной датчик влажности почвы.
Хочу сделать калибровку (мин/макс) датчика влажности почвы путём нажатия кнопок в приложении. Но при добавлении кода еепром в скетч, перестало работать, если убрать весь код с еепром и считывать только показания датчиков, то всё работает...
Сразу скажу, я новичок, в программировании ардуин очень мало шарю, создавал скетч по образу и подобию с разных других проектов...
Хочу сделать вайфай контроллер за наблюдением температуры и влажности почвы через приложение Blynk.
Имеется NodeMCU v3, DS18B20 и ёмкостной датчик влажности почвы.
Хочу сделать калибровку (мин/макс) датчика влажности почвы путём нажатия кнопок в приложении. Но при добавлении кода еепром в скетч, перестало работать, если убрать весь код с еепром и считывать только показания датчиков, то всё работает...
Код:
#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 = 0.0; // Калибровка 0%
float MAX_SENS = 0.0; // Калибровка 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>
#include "EEPROMAnything.h" // http://playground.arduino.cc/Code/EEPROMWriteAnything
bool Recorded = false;
int addr = 0;
int a[3];
enum n_addr {a_Recorded,a_MIN_SENS, a_MAX_SENS};
void setupAddrEEPROM(){
a[a_Recorded]=addr; addr+=sizeof(Recorded);
a[a_MIN_SENS]=addr; addr+=sizeof(MIN_SENS);
a[a_MAX_SENS]=addr; addr+=sizeof(MAX_SENS);
}
// Читаем все сохраненные настройки из EEPROM
void setupEEPROM()
{
EEPROM.begin(512);
EEPROM_readAnything(a[a_Recorded], Recorded); // Прочитаем из EEPROM состониие переменной Recorded
// Если в переменной Recorded ненаходится слова true то запишем в EEPROM базовые настройки
if (Recorded == false){
Recorded=true;
EEPROM_writeAnything(a[a_Recorded], Recorded);
EEPROM_readAnything(a[a_MIN_SENS], MIN_SENS);
EEPROM_readAnything(a[a_MAX_SENS], 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, 360, 760, 0, 100);
// Выводим показания в монитор порта
Serial.print("humIn:");
Serial.println(humIn);
Serial.print("MIN_SENS:");
Serial.println(MIN_SENS,2);
Serial.print("MAX_SENS:");
Serial.println(MAX_SENS,2);
Serial.print("humOut:");
Serial.println(humOut);
msDHT = ms;
}
}
void setup()
{
// Загружаем данные из EEPROM
setupAddrEEPROM();
setupEEPROM();
delay(2000);
// Debug console
Serial.begin(9600);
// Инициализация PIN-ов Arduino
pinMode(SENS_HUM, INPUT);
delay(50);
// Вызываем функцию подключения к Blynk
reconnectBlynk();
// Задаем интервальные таймеры
timer.setInterval(30000, reconnectBlynk); // Проверяем есть ли связь с сервером
// Инициализация датчика OneWire для DS18B20
Wire.begin();
delay(50);
}
void loop()
{
ms = millis();
if( digitalRead(But_Min) == HIGH )
{
EEPROM.begin(512);
EEPROM_writeAnything(a[a_MIN_SENS], MIN_SENS);
EEPROM.end();
delay(50);
}
if( digitalRead(But_Max) == HIGH )
{
EEPROM.begin(512);
EEPROM_writeAnything(a[a_MAX_SENS], MAX_SENS);
EEPROM.end();
delay(50);
}
sendSensor();
if (Blynk.connected()){ Blynk.run();}
timer.run();
}