//FONTION RECEVANT LES COMMANDES DE LA PART DU SERVEUR DISTANT SOUS FORME idACTION;val1,val2
int receiveCMD(char reply[] = "OK"){
delay(50);
// if there's data available, read a packet
int packetSize = Udp.available(); // note that this includes the UDP header
if(packetSize)
{
packetSize = packetSize - 8; // subtract the 8 byte header
//Serial.println(packetSize); // Taille du paquet
memset(packetBuffer, 0, UDP_TX_PACKET_MAX_SIZE);
// read the packet into packetBufffer and get the senders IP addr and port number
Udp.readPacket(packetBuffer,UDP_TX_PACKET_MAX_SIZE, remoteIp, remotePort);
Udp.sendPacket( reply, remoteIp, remotePort); // Envoi d'une réponse
char *p = packetBuffer;
char *str;
int cpt = 0;
while ((str = strtok_r(p, ";", &p)) != NULL){
cpt = cpt+1;
if(cpt == 1){
cmd = atoi(str);
// Serial.println(cmd);
}
else if(cpt == 2){
val1 = atof(str);
// Serial.println(val1);
}
else if(cpt == 3){
val2 = atof(str);
// Serial.println(val2);
}
}
//ON EXECUTE LA COMMANDE
switch(cmd){
case 1:
actualisation();
break;
case 2:
if(val1 == 1){
mode = 1;
}
else if(val1 == 0){
mode = 0;
}
break;
case 3:
if(val1 == 1 && mode == 1){
digitalWrite(rel6, HIGH);
etatRel6 = HIGH;
}
else if(val1 == 0 && mode == 1){
digitalWrite(rel6, LOW);
etatRel6 = LOW;
}
break;
case 4:
if(val1 == 1 && mode == 1){
digitalWrite(rel0, HIGH);
etatRel0 = HIGH;
}
else if(val1 == 0 && mode == 1){
digitalWrite(rel0, LOW);
etatRel0 = LOW;
}
break;
case 5:
if(val1 == 1 && mode == 1){
digitalWrite(rel3, HIGH);
etatRel3 = HIGH;
}
else if(val1 == 0 && mode == 1){
digitalWrite(rel3, LOW);
etatRel3 = LOW;
}
break;
case 6:
if(val1 == 1 && mode == 1){
digitalWrite(rel2, HIGH);
etatRel2 = HIGH;
}
else if(val1 == 0 && mode == 1){
digitalWrite(rel2, LOW);
etatRel2 = LOW;
}
break;
case 7:
temp1_min = val1;
temp1_max = val2;
break;
case 8:
temp2_min = val1;
temp2_max = val2;
break;
case 9:
hygro1_min = val1;
hygro1_max = val2;
break;
case 10:
break;
case 11:
co2_min = val1;
co2_max = val2;
break;
case 12:
if(val1 == 1 && mode == 1){
digitalWrite(rel1, HIGH);
etatRel1 = HIGH;
}
else if(val1 == 0 && mode == 1){
digitalWrite(rel1, LOW);
etatRel1 = LOW;
}
break;
case 13:
interval_refresh = val1;
previousMillis_refresh = 0;
break;
case 14:
if(val1 == 1 && mode == 1){
digitalWrite(rel4, HIGH);
etatRel4 = HIGH;
}
else if(val1 == 0 && mode == 1){
digitalWrite(rel4, LOW);
etatRel4 = LOW;
}
break;
case 15:
if(val1 == 1 && mode == 1){
digitalWrite(rel5, HIGH);
etatRel5 = HIGH;
}
else if(val1 == 0 && mode == 1){
digitalWrite(rel5, LOW);
etatRel5 = LOW;
}
break;
case 19:
timerBrassage = val1;
break;
case 20:
timerPompeEau = val1;
break;
case 21:
timerPompeAir = val1;
break;
case 22:
temp3_min=val1;
temp3_max=val2;
break;
case 23:
temp4_min=val1;
temp4_max=val2;
break;
case 24:
break;
case 25:
isInitialised=val1;
break;
}
return true;
}
}
//BOUCLE SANS FIN
void loop(){
if(isInitialised == 0 && tentativeHttp <= 5){
sendCMD("cmd=init");
tentativeHttp++;
}else if(isInitialised == 0 && tentativeHttp >= 6){
resetFunc();
}
//RELEVES CAPTEURS + TRANSMISSION + ACTIONS CORRECTRICES
unsigned long currentMillis_refresh = millis();
if(currentMillis_refresh - previousMillis_refresh > interval_refresh) {
previousMillis_refresh = currentMillis_refresh;
getDataSensor(); //ON RECUPERE LA VALEUR DES DIFFERENTS CAPTEURS
if(mode == 0){
actionsCorrectives(); //EN MODE AUTO SEULEMENT, LE MODULE VA ESSAYER DE CORRIGER LES VALEURS
}
actualisation(); //ENVOI DONNEES SERVEUR DISTANT
}
//Extraction d'air
unsigned long currentMillis_timerExtraction = millis();
if(((currentMillis_timerExtraction - previousMillis_timerExtraction > timerExtraction || previousMillis_timerExtraction == 0) && mode == 0) || (timerExtraction == 0 && mode == 0)) {
if(etatRel0 == LOW){
if(co2 <= co2_min || (temp1 <= temp1_min || temp2 <= temp2_min)){
digitalWrite(rel0, LOW);
etatRel0 = LOW;
}else {
digitalWrite(rel0, HIGH);
etatRel0 = HIGH;
digitalWrite(rel3, LOW);
etatRel3 = LOW;
}
}else if(etatRel0 == HIGH){
if(co2 >= co2_max || (temp1 >= temp1_max || temp2 >= temp2_max)){
digitalWrite(rel0, HIGH);
etatRel0 = HIGH;
}else {
digitalWrite(rel0, LOW);
etatRel0 = LOW;
}
}
previousMillis_timerExtraction = currentMillis_timerExtraction;
}
//Brassage d'air
unsigned long currentMillis_timerBrassage = millis();
if(((currentMillis_timerBrassage - previousMillis_timerBrassage > timerBrassage || previousMillis_timerBrassage == 0) && mode == 0) || (timerBrassage == 0 && mode == 0)) {
previousMillis_timerBrassage = currentMillis_timerBrassage;
if(etatRel2 == LOW){
digitalWrite(rel2, HIGH);
etatRel2 = HIGH;
}
else if(etatRel2 == HIGH){
digitalWrite(rel2, LOW);
etatRel2 = LOW;
}
}
//Pompe Eau
unsigned long currentMillis_timerPompeEau = millis();
if(((currentMillis_timerPompeEau - previousMillis_timerPompeEau > timerPompeEau || previousMillis_timerPompeEau == 0) && mode == 0) || (timerPompeEau == 0 && mode == 0)) {
previousMillis_timerPompeEau = currentMillis_timerPompeEau;
if(etatRel4 == LOW && temp3 <= temp3_max){ // N'allume la pompe que si la température de l'eau est correct.
digitalWrite(rel4, HIGH);
etatRel4 = HIGH;
}
else if(etatRel4 == HIGH){
digitalWrite(rel4, LOW);
etatRel4 = LOW;
}
}
//Pompe Air
unsigned long currentMillis_timerPompeAir = millis();
if(((currentMillis_timerPompeAir - previousMillis_timerPompeAir > timerPompeAir || previousMillis_timerPompeAir == 0) && mode == 0) || (timerPompeAir == 0 && mode == 0)) {
previousMillis_timerPompeAir = currentMillis_timerPompeAir;
if(etatRel5 == LOW){
digitalWrite(rel5, HIGH);
etatRel5 = HIGH;
}
else if(etatRel5 == HIGH){
digitalWrite(rel5, LOW);
etatRel5 = LOW;
}
}
receiveCMD();
}
String intToChar(float fl){
char tampon[32];
long fl1 = (fl - (long)fl) * 100;
sprintf(tampon,"%0ld.%0ld", (long)fl, fl1);
return tampon;
}
String floatToChar(float a){
char charBuf[32];
dtostrf(a, 2, 2, charBuf);
return charBuf;
}
int actualisation(){
sendCMD("cmd=update&val="+floatToChar(temp1)+","+floatToChar(temp2)+","+floatToChar(temp3)+","+floatToChar(temp4)+","+floatToChar(temp5)+","+floatToChar(co2)+","+floatToChar(hygro1)+","+floatToChar(nivEau)+","+intToChar(etatRel6)+","+intToChar(etatRel0)+","+intToChar(etatRel1)+","+intToChar(etatRel3)+","+intToChar(etatRel2)+","+intToChar(etatRel4)+","+intToChar(etatRel5)+","+intToChar(mode)+","+intToChar(isJour1)+"");
}
int sendCMD(String val){
Client client(server, 80);
if (client.connect()) {
// Make a HTTP request:
client.print("GET /receive.php?");
client.print(val);
client.println(" HTTP/1.0");
client.println("HOST: www.****.fr");
client.println();
tentativeHttp = 0;
isInitialised = 1;
client.stop();
return true;
}else {
tentativeHttp =tentativeHttp+1;
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Probleme HTTP !");
delay(1000);
isInitialised = 0;
client.stop();
return false;
}
}
float getAnalogTemp(int sensorPin)
{
float sensorVal = analogRead(sensorPin);
return map((int)(sensorVal*1000),
438000,573000,26000,37000)/1000;
}
void getDataSensor(){
isJour();
temp1 = ds18b20p_temp1.read();
temp2 = ds18b20p_temp2.read();
temp3 = ds18b20p_temp3.read();
temp4 = getAnalogTemp(TEMP4_PIN);
temp5 = ds18b20p_temp5.read();
hygro1 = dht1.readHumidity();
nivEau = ultrasonic.Ranging(CM);
int raw = analogRead(CO2_PIN);
float val = fmap(raw, 0, 1023, 0.0, 5.0);
co2 = val*5000/2.5;
showLCD();
}