// Application pour envoyer des information d'une station météo par SMS // Auteur: Julien LAUNAy // Mail: julien.launay@ac-lyon.fr // Octobre 2022 String recept_sim800=""; String num_tel; String tension_bat,message; bool etat_sms_recu=false; const int anemo_pin = 32; int compteur_anemo=0; unsigned long temps; int pin_girouette_adc=33; int girouette; String vitesse_vent="0"; String direct_girouette; unsigned long f_update_anemo; void IRAM_ATTR detect_anemo() { if ((micros()-temps)>35) { compteur_anemo +=1; } temps=micros(); } void setup() { pinMode(anemo_pin, INPUT); Serial.begin(9600); Serial2.begin(9600); attachInterrupt(anemo_pin, detect_anemo, HIGH); delay(9000); test_sim800_module(); f_update_anemo=millis(); } void updateSerial() { delay(500); while (Serial.available()) { Serial2.write(Serial.read());//Forward what Serial received to Software Serial Port } while (Serial2.available()) { char char_recep=Serial2.read(); recept_sim800 += char_recep; Serial.write(char_recep);//Forward what Software Serial received to Serial Port } if (recept_sim800.indexOf("+CBC:") != -1) { Serial.println("Charge %="+recept_sim800.substring(recept_sim800.indexOf(',')+1,recept_sim800.indexOf(',',recept_sim800.indexOf(',')+1) )); tension_bat=recept_sim800.substring(recept_sim800.lastIndexOf(',')+1,recept_sim800.length()-8); recept_sim800=""; } else if (recept_sim800.indexOf("+CMT:") != -1) { etat_sms_recu=true; } else { recept_sim800=""; } } void test_sim800_module() { Serial2.println("AT"); updateSerial(); Serial2.println("AT+CSQ"); updateSerial(); Serial2.println("AT+CCID"); updateSerial(); Serial2.println("AT+CREG?"); updateSerial(); Serial2.println("ATI"); updateSerial(); Serial2.println("AT+CBC"); updateSerial(); Serial2.println("AT+COPS?"); updateSerial(); Serial2.println("AT+CMGF=1"); updateSerial(); Serial2.println("AT+CNMI=1,2,0,0,0"); updateSerial(); } void loop() { updateSerial(); girouette=analogRead(pin_girouette_adc); delay(500); if (girouette>2700 and girouette<3300) { direct_girouette = "N"; } else if (girouette>1350 and girouette<2040) { direct_girouette = "NE"; } else if (girouette<400) { direct_girouette = "E"; } else if (girouette>400 and girouette<800) { direct_girouette = "SE"; } else if (girouette>800 and girouette<1350) { direct_girouette = "S"; } else if (girouette>2280 and girouette<2480) { direct_girouette = "SO"; } else if (girouette>3750) { direct_girouette = "O"; } else if (girouette>3300 and girouette<3750) { direct_girouette = "NO"; } else { direct_girouette = '?'; } if (millis()-f_update_anemo>2000){ vitesse_vent=String((int)(compteur_anemo/4*2*3.14156535*7.2/2*3600/100000)); Serial.println("vitesse anemo="+vitesse_vent+"km/h"); f_update_anemo=millis(); compteur_anemo=0; Serial.println("Direction vent="+direct_girouette+" "+String(girouette)); } if (etat_sms_recu) { num_tel=recept_sim800.substring(recept_sim800.indexOf("\"")+1,recept_sim800.indexOf("\"",recept_sim800.indexOf("\"")+1)); Serial.println("tel emetteur="+num_tel); String sms_recu=recept_sim800.substring(recept_sim800.lastIndexOf("\"")+3,recept_sim800.length()-2); Serial.println("message="+sms_recu); char commande=sms_recu.charAt(0); Serial.println("comm="+String(commande)); switch (commande) { case 't': message="Tension batterie="; message+=tension_bat; message+="mV"; break; case 'v': message="vitesse vent="; message+=vitesse_vent; message+="km/h"; break; case 'd': message="Direction du vent="; message+=direct_girouette; break; default: message="Tension batterie="; message+=tension_bat; message+="\r\n"; message+="vitesse vent="; message+=vitesse_vent; message+="km/h"; message+="\r\n"; message+="Direction du vent="; message+=direct_girouette; } Serial.println("envoi message="+message); Serial2.println("AT+CMGS=\""+num_tel+"\""); updateSerial(); Serial2.println(message); updateSerial(); Serial2.write(26); updateSerial(); etat_sms_recu=false; recept_sim800=""; } }