Salut,
C'est un sujet qui n'a rien à voir avec le sat
Je me lance depuis peu suite à différentes lecture d'instructable sur l'Arduino, vers un future projet de gestion d'arrosage de mes plantations en serre et en extérieur.
Donc pour commencer je me lance sur un truc simple pour l'arrosage d'une partie des plantations de ma serre.
Ceci afin de bien piger le bidule de base.
La configuration est la suivante avec un Wemos D1, un capteur de température ambiante, un capteur d'humidité du sol, un relais et une électro vanne et un afficheur LCD keypad.
A ce jour le programme me permet de connaitre la température et l'humidité ambiante de la serre à titre d'information pour le moment,
j'envisage dans le future de profiter de ces données pour une commande de ventilation/chauffage,
les données du capteur d'humidité du sol sont utilisées pour commander le couple relais/électrovanne d'arrosage.
L'afficheur LCD lui m'informe de ces données, Température °C - Humidité de l'air % et Humidité du sol en %.
Il y a aussi une partie du programme pour un accès à un serveur distant (ThingPeak) me permettant de connaitre l'état des lieux sur mon smartphone et pc.
Jusque ici tout fonctionne bien... et puis je découvre la fonction OTA qui est disponible sur le Wemos D1 avec son esp8266 embarqué.
Du coup je me dis super je vais pouvoir faire les mises à jour du module Wemos D1 à distance.
Effectivement cela fonctionne pour OTA...sauf que j'ai un pépin que je n'arrive pas à solutionner et ne trouve pas de cas similaire sur le web.
Mon pépin et qu'après un flash du programme avec les variables de l'OTA je ne n'ai plus de données de mon capteur DTH, uniquement celle
du capteur de sol.
Si je flash a nouveau en commentant l'accès pour la partie ThingSpeak, les capteurs fonctionnent.
Y a t-il un œil averti dans l'assemblé pour me dire ce qui pêche
/****************************************************************
* ArduPotager
****************************************************************/
#include <ESP8266WiFi.h>
//#include <ESP8266mDNS.h> // for OTA updates uncomment if required
//#include <WiFiUdp.h> // for OTA updates uncomment if required
//#include <ArduinoOTA.h> // for OTA updates uncomment if required
#include <LiquidCrystal.h> // Librairie pour l'écran LCD
LiquidCrystal lcd(D8, D9, D4, D5, D6, D7); // Initialisation de l'écran LCD avec les numéros des pins utilisés
#include <DHT.h> // Include DHT Library
// replace with your channel’s thingspeak API key and your SSID and password
String apiKey = "***************";
const char* ssid = "***********";
const char* password = "*******";
// Sensor definitions
#define DHTPIN D3 // DHT data pin D3
#define DHTTYPE DHT11 // DHT 22 (if your sensor is the DHT 11, only change this line by: #define DHTTYPE DHT11)
const int SOIL_MOIST_1 = A0; // used for Soil Moisture Sensor Input
const int SOIL_MOIST_Power_1 = D14; // used for Soil Moisture Sensor "Power Supply" (VCC)
const int VANNE_RELAIS_1 = D2;
// Variables to be used by Sensor
int soilMoist_1;
float fltHumidity; //Pourcentage d'humidité mesuré
float fltTemperature; //Température mesurée en Celsius
// Initialize the DHT sensor
DHT dht(DHTPIN, DHTTYPE);
WiFiClient client;
/*************************************************************
* ---------------- Define Special Characters-----------------*
* 0=degré sign *
* 1=thermometre *
* 2=goute d'humidité *
* 3=capteur d'humiditér soil moisture *
* 4=pump *
//************************************************************/
const uint8_t charBitmap[][8] =
{
{
// symbole du degré coorespondance char(223)
B00110, // --XX-
B01001, // -X--X
B01001, // -X--X
B00110, // --XX-
B00000, // -----
B00000, // -----
B00000, // -----
B00000 // -----
// 0x6, 0x9, 0x9, 0x6, 0, 0, 0, 0
}
,
{
// thermometre
B00100, // --X--
B01010, // -X-X-
B01010, // -X-X-
B01110, // -XXX-
B01110, // -XXX-
B11111, // XXXXX
B11111, // XXXXX
B01110 // -XXX-
}
,
{
// goute humidité
B00100, // --X--
B00100, // --X--
B01010, // -X-X-
B01010, // -X-X-
B10001, // X---X
B10001, // X---X
B10001, // X---X
B01110 // -XXX-
}
,
{
// capteur humidité
0b00100, // --X--
0b01110, // -XXX-
0b01010, // -X-X-
0b01010, // -X-X-
0b01010, // -X-X-
0b01010, // -X-X-
0b01010, // -X-X-
0b00000 // -----
}
,
{
//pomp
B01010, // -X-X-
B00100, // --X--
B00100, // --X--
B00100, // --X--
B11111, // XXXXX
B11011, // XX-XX
B11111 // XXXXX
}
};
void setup()
{
pinMode(SOIL_MOIST_1, INPUT);
pinMode(SOIL_MOIST_Power_1, OUTPUT);
pinMode(VANNE_RELAIS_1, OUTPUT);
// Initialize Relay
digitalWrite(VANNE_RELAIS_1, HIGH);
// Setup LCD.
lcd.begin(16, 2); //On indique le nombre de colonnes et de lignes de l'écran
//upload defined characters to LCD
int charBitmapSize = (sizeof(charBitmap ) / sizeof (charBitmap[0]));
for ( int i = 0; i < charBitmapSize; i++ )
{
lcd.createChar ( i, (uint8_t *)charBitmap[i] );
}
lcd.clear();
lcd.setCursor(0, 0); //Positionnement du curseur
lcd.print("ArduPotager");
dht.begin();
// Setup serial monitor.
Serial.begin(9600);
Serial.println();
Serial.println();
Serial.println("ArduPotager");
Serial.println();
Serial.print("Connection au réseau ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connecté");
lcd.setCursor(0, 1); //Positionnement du curseur
lcd.print("WiFi connected");
delay(1500);
// ArduinoOTA.begin(); // for OTA updates uncomment if required
}
void loop()
{
// ArduinoOTA.handle(); // for OTA updates uncomment if required
readSensors();
printData();
showDataLCD();
thingspeak();
}
/***************************************************
* Capture de la sonde de température DTH *
***************************************************/
void readSensors(void)
{
fltHumidity = dht.readHumidity();
fltTemperature = dht.readTemperature();
if (isnan(fltHumidity) || isnan(fltTemperature)){
Serial.println( "Lecture impossible !");
}else{
printData();
}
soilMoist_1 = getSoilMoist_1();
}
/***************************************************
* Capture Data du capteur d'humidité *
***************************************************/
int getSoilMoist_1()
{
int sensorValue1 = 0;
digitalWrite(SOIL_MOIST_Power_1,HIGH);
delay(5);
sensorValue1 = analogRead(SOIL_MOIST_1);
Serial.print(" sensorValue1 = ");
Serial.print(sensorValue1);
digitalWrite(SOIL_MOIST_Power_1,LOW);
sensorValue1 = constrain (sensorValue1, 150, 990);
sensorValue1 = map(sensorValue1, 990, 150, 0, 100);
if (sensorValue1 <= 30)
{ digitalWrite(VANNE_RELAIS_1,LOW); }
else
{ digitalWrite(VANNE_RELAIS_1,HIGH); }
return sensorValue1;
}
/***************************************************
* Affichage des informations sur le Serial Monitor *
***************************************************/
void printData(void)
{
Serial.print(" Temp DHT = ");
Serial.print(fltTemperature);
Serial.print("°C Hum DHT = ");
Serial.print(fltHumidity);
Serial.print("% Soil Moisture 1 = ");
Serial.println(soilMoist_1);
}
/*********************************************
* Affichage des informations sur l'écran LCD *
*********************************************/
void showDataLCD(void)
{
lcd.clear(); //On efface tout ce qui se trouve sur l'écran
lcd.setCursor(0, 0); //Positionnement du curseur
lcd.print(char(1)); //Affichage du thermometre
lcd.setCursor(2, 0);
lcd.print(fltTemperature); //Affichage de la température
lcd.setCursor(6, 0);
lcd.print(char(0)); //Affiche le caractère ° (degrés)
lcd.setCursor(7, 0);
lcd.print("C");
lcd.setCursor(9, 0);
lcd.print(char(2)); //Affichage de la goute d'humidité
lcd.setCursor(11, 0);
lcd.print(fltHumidity); //Affichage de l'humidité
lcd.setCursor(15, 0);
lcd.print("%");
lcd.setCursor(0, 1); // position curseur ligne 2
lcd.print(char(3)); // capteur de sol
lcd.setCursor(1, 1);
lcd.print("1");
lcd.setCursor(3, 1);
lcd.print(soilMoist_1);
lcd.setCursor(6, 1);
lcd.print("%");
}
/*********************************************
* Prepare thingspeak *
*********************************************/
void thingspeak(void)
{
if (client.connect("api.thingspeak.com",80)) {
String postStr = apiKey;
postStr +="&field1=";
postStr += String(fltTemperature);
postStr +="&field2=";
postStr += String(fltHumidity);
postStr +="&field3=";
postStr += String(soilMoist_1);
postStr += "\r\n\r\n";
client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(postStr.length());
client.print("\n\n");
client.print(postStr);
delay(100);
Serial.println(" Transmission des Data vers Thingspeak");
client.flush();
client.stop();
}
Serial.println("Patienter 20 secs"); // Thingspeak a besoin d'un délai de 15 secondes entre les mises à jour
delay(20000);
}