#include <SoftwareSerial.h>
#define pinRicard 5
#define pinEau 19
#define maxDoses 10 //pour que le verre soit plein
//Create software serial object to communicate with SIM800L
SoftwareSerial sim800(16, 17); //SIM800L Tx & Rx is connected to Arduino
void setup()
{
//Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(9600);
//Begin serial communication with Arduino and SIM800L
sim800.begin(9600);
Serial.println("Initializing...");
delay(15000); //15 sec pour laisser le temps d'accrocher le réseau
sim800.println("AT"); //Once the handshake test is successful, it will back to OK
updateSerial();
sim800.println("AT+CMGF=1"); // Configuring TEXT mode
updateSerial();
sim800.println("AT+CNMI=1,2,0,0,0"); // Decides how newly arrived SMS messages should be handled
updateSerial();
envoyerSMS("+33633476732", "Syst\xe8me OK");
updateSerial();
pinMode(pinRicard, OUTPUT);
pinMode(pinEau, OUTPUT);
}
bool nvSMSRecu = 0;
string retourSim;
string SMSrecu;
string numero;
string message; //pour le contenu des messages générés
int etape = 1;
void loop()
{
if (verifierSMS())
{
nvSMSRecu = true;
string SMSrecuTMP = explode(retourSim,'\n',2);
SMSrecu = SMSrecuTMP.substring(0,SMSrecuTMP.length()-2); //on supprime les derniers carractères retour Chariot
numero = explode(retourSim, '"',1);
Serial.println("nouveau SMS : "+numero+" : "+SMSrecu);
}
if (nvSMSRecu)
{
nvSMSRecu = false;
switch (etape) {
case 1 :
{
if (SMSrecu == "vidange" || SMSrecu == "Vidange" || SMSrecu == "Vidanger" || SMSrecu == "vidanger")
{
message = "Quelle vanne vidanger ? \n[1-2]";
envoyerSMS(numero, message);
etape = 99;
break;
}
if (SMSrecu == "stop" || SMSrecu == "Stop")
{
stopVidanger();
message = "OK, vidange termin\xe9e";
envoyerSMS(numero, message);
etape = 1;
break;
}
else
{
message = "Bonjour "+SMSrecu+" :-) \nTu peux passer commande !\nCombien de dose de Ricard ?\n[1-5] ou [Annuler]";
envoyerSMS(numero, message);
etape = 2;
break;
}
}
case 2 : //on a récupéré le nombre de dose, on traite
{
if (SMSrecu == "Annuler" || SMSrecu == "annuler")
{
message = "OK, dommage, \xe0 la prochaine !";
envoyerSMS(numero, message);
etape =1;
break;
}
int nbrDose =SMSrecu.toInt();
if (nbrDose > 1 && nbrDose < 6)
{
message = "OK pour "+SMSrecu+" doses de Ricard. \nLa pr\xe9paration est en cours...";
envoyerSMS(numero,message);
if (verser (nbrDose))
{
message = "Pr\xe9paration termin\xe9""e !\nBonne d\xe9gustation ! :-)";
envoyerSMS(numero,message);
}
etape = 1;
break;
}
if (nbrDose >= 6)
{
message = "C'est trop !\nOn a dit entre [1-5] doses, ou [Annuler]";
envoyerSMS(numero, message);
etape = 2;
break;
}
if (nbrDose == 1)
{
message = "OK pour "+SMSrecu+" dose de Ricard. \nLa pr\xe9paration est en cours...";
envoyerSMS(numero, message);
if (verser (nbrDose))
{
message = "Pr\xe9paration termin\xe9""e !\nBonne d\xe9gustation ! :-)";
envoyerSMS(numero,message);
}
etape = 1;
break;
}
else
{
message = "Je n'ai pas pas compris ta demande boby !\nCombien de dose ? [1-5] ou [Annuler]";
envoyerSMS(numero, message);
etape = 2;
break;
}
}
case 99 :
{
int numVidange = SMSrecu.toInt();
message = "Vidange de la vanne "+SMSrecu+" en cours...\n[Stop] pour terminer";
vidanger(numVidange);
envoyerSMS(numero, message);
etape = 1;
break;
}
}
}
}//finduloop
void updateSerial()
{
delay(500);
while (Serial.available())
{
sim800.write(Serial.read());//Forward what Serial received to Software Serial Port
}
while(sim800.available())
{
Serial.write(sim800.read());//Forward what Software Serial received to Serial Port
}
}
/////////////////////////
string explode(string input, char separator, int index)
{
int found = 0;
int strIndex[] = {0, -1};
int maxIndex = input.length()-1;
for(int i=0; i<=maxIndex && found<=index; i++){
if(input.charAt(i)==separator || i==maxIndex){
found++;
strIndex[0] = strIndex[1]+1;
strIndex[1] = (i == maxIndex) ? i+1 : i;
}
}
return found>index ? input.substring(strIndex[0], strIndex[1]) : "";
}
void envoyerSMS(string numero, string contenu)
{
delay (1000);
sim800.println("AT+CMGS=\""+numero+"\"");
delay(500);
sim800.print(contenu); //text content
delay(500);
sim800.write(26); //combinaison CTRL+Z
Serial.println("Message env. au "+numero+" : "+contenu);
}
///////////////
bool verifierSMS()
{
while(sim800.available())
{
retourSim = sim800.readString();
}
string typeRetour = retourSim.substring(2, 6); // pour ne récupérer que l'entête
if(typeRetour == "+CMT")
{
//Serial.println("Nouveau message !");
return 1;
}
else
{
return 0;
}
}
bool verser(int dose)
{
int iDose = 0;
while (iDose < dose)
{
Serial.println(iDose+1);
digitalWrite(pinRicard,HIGH);
delay (2500);
digitalWrite(pinRicard,LOW);
delay(250);
iDose ++;
}
iDose = 0;
while (iDose < maxDoses-dose)
Serial.println(iDose+1);
{
digitalWrite(pinEau,HIGH);
delay (2500);
digitalWrite(pinEau,LOW);
delay(250);
iDose ++;
}
return true;
}
///////////////
void vidanger(int vanne)
{
int pinVanne = 0;
switch (vanne){
case 1 :
pinVanne = pinRicard;
break;
case 2 :
pinVanne = pinEau;
break;
}
digitalWrite(pinVanne,HIGH);
}
////////////////
void stopVidanger()
{
digitalWrite(pinRicard,LOW);
digitalWrite(pinEau,LOW);
}
Apporter