Paste Search Dynamic
SoftwareSerial sim800
  1. #include <SoftwareSerial.h>
  2.  
  3. #define pinRicard 5
  4. #define pinEau 19
  5. #define maxDoses 10 //pour que le verre soit plein
  6.  
  7. //Create software serial object to communicate with SIM800L
  8. SoftwareSerial sim800(16, 17); //SIM800L Tx & Rx is connected to Arduino
  9.  
  10. void setup()
  11. {
  12.   //Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
  13.   Serial.begin(9600);
  14.  
  15.   //Begin serial communication with Arduino and SIM800L
  16.   sim800.begin(9600);
  17.  
  18.   Serial.println("Initializing...");
  19.   delay(15000); //15 sec pour laisser le temps d'accrocher le réseau
  20.  
  21.   sim800.println("AT"); //Once the handshake test is successful, it will back to OK
  22.   updateSerial();
  23.   sim800.println("AT+CMGF=1"); // Configuring TEXT mode
  24.   updateSerial();
  25.  
  26.   sim800.println("AT+CNMI=1,2,0,0,0"); // Decides how newly arrived SMS messages should be handled
  27.   updateSerial();
  28.  
  29.   envoyerSMS("+33633476732", "Syst\xe8me OK");
  30.   updateSerial();
  31.  
  32.   pinMode(pinRicard, OUTPUT);
  33.   pinMode(pinEau, OUTPUT);
  34.  
  35. }
  36.  
  37.  
  38. bool nvSMSRecu = 0;
  39. string retourSim;
  40. string SMSrecu;
  41. string numero;
  42. string message; //pour le contenu des messages générés
  43. int etape = 1;
  44.  
  45. void loop()
  46. {
  47.  
  48.  if (verifierSMS())
  49.  {
  50.   nvSMSRecu = true;
  51.  
  52.   string SMSrecuTMP = explode(retourSim,'\n',2);
  53.   SMSrecu = SMSrecuTMP.substring(0,SMSrecuTMP.length()-2); //on supprime les derniers carractères retour Chariot
  54.  
  55.   numero = explode(retourSim, '"',1);
  56.   Serial.println("nouveau SMS : "+numero+" : "+SMSrecu);
  57.  
  58.  }
  59.  
  60.  
  61. if (nvSMSRecu)
  62. {
  63.   nvSMSRecu = false;
  64.  
  65.   switch (etape) {
  66.    
  67.   case 1 :
  68.   {
  69.   if (SMSrecu == "vidange" || SMSrecu == "Vidange" || SMSrecu == "Vidanger" || SMSrecu == "vidanger")
  70.   {
  71.     message = "Quelle vanne vidanger ? \n[1-2]";
  72.     envoyerSMS(numero, message);
  73.     etape = 99;
  74.     break;
  75.   }
  76.  
  77.   if (SMSrecu == "stop" || SMSrecu == "Stop")
  78.   {
  79.     stopVidanger();
  80.     message = "OK, vidange termin\xe9e";
  81.     envoyerSMS(numero, message);
  82.     etape = 1;
  83.     break;
  84.   }
  85.  
  86.   else
  87.   {
  88.   message = "Bonjour "+SMSrecu+" :-) \nTu peux passer commande !\nCombien de dose de Ricard ?\n[1-5] ou [Annuler]";
  89.   envoyerSMS(numero, message);
  90.   etape = 2;
  91.   break;
  92.   }
  93.   }
  94.   case 2 : //on a récupéré le nombre de dose, on traite
  95.    {
  96.     if (SMSrecu == "Annuler" || SMSrecu == "annuler")
  97.     {
  98.       message = "OK, dommage, \xe0 la prochaine !";
  99.       envoyerSMS(numero, message);
  100.       etape =1;
  101.       break;
  102.     }
  103.   int nbrDose =SMSrecu.toInt();
  104.  
  105.     if (nbrDose > 1 && nbrDose < 6)
  106.     {
  107.      message = "OK pour "+SMSrecu+" doses de Ricard. \nLa pr\xe9paration est en cours...";
  108.      envoyerSMS(numero,message);
  109.      if (verser (nbrDose))
  110.       {
  111.       message = "Pr\xe9paration termin\xe9""e !\nBonne d\xe9gustation ! :-)";
  112.       envoyerSMS(numero,message);
  113.       }
  114.      etape = 1;
  115.      break;
  116.     }
  117.  
  118.     if (nbrDose >= 6)
  119.     {
  120.     message = "C'est trop !\nOn a dit entre [1-5] doses, ou [Annuler]";
  121.     envoyerSMS(numero, message);
  122.     etape = 2;
  123.     break;
  124.     }
  125.  
  126.     if (nbrDose == 1)
  127.     {
  128.     message = "OK pour "+SMSrecu+" dose de Ricard. \nLa pr\xe9paration est en cours...";
  129.     envoyerSMS(numero, message);
  130.       if (verser (nbrDose))
  131.       {
  132.       message = "Pr\xe9paration termin\xe9""e !\nBonne d\xe9gustation ! :-)";
  133.       envoyerSMS(numero,message);
  134.       }
  135.     etape = 1;
  136.     break;
  137.     }
  138.  
  139.     else
  140.     {
  141.     message = "Je n'ai pas pas compris ta demande boby !\nCombien de dose ? [1-5] ou [Annuler]";
  142.     envoyerSMS(numero, message);
  143.     etape = 2;
  144.     break;
  145.     }
  146.    }  
  147.  
  148.   case 99 :
  149.  {
  150.   int numVidange = SMSrecu.toInt();
  151.   message = "Vidange de la vanne "+SMSrecu+" en cours...\n[Stop] pour terminer";
  152.   vidanger(numVidange);
  153.   envoyerSMS(numero, message);
  154.   etape = 1;
  155.   break;
  156.  }
  157.  
  158.   }
  159.  
  160.  
  161.  
  162.  
  163.  
  164.  
  165.  
  166. }
  167.  
  168. }//finduloop
  169.  
  170.  
  171. void updateSerial()
  172. {
  173.   delay(500);
  174.   while (Serial.available())
  175.   {
  176.     sim800.write(Serial.read());//Forward what Serial received to Software Serial Port
  177.   }
  178.   while(sim800.available())
  179.   {
  180.     Serial.write(sim800.read());//Forward what Software Serial received to Serial Port
  181.   }
  182. }
  183.  
  184. /////////////////////////
  185.  
  186.  string explode(string input, char separator, int index)
  187. {
  188.   int found = 0;
  189.   int strIndex[] = {0, -1};
  190.   int maxIndex = input.length()-1;
  191.  
  192.   for(int i=0; i<=maxIndex && found<=index; i++){
  193.     if(input.charAt(i)==separator || i==maxIndex){
  194.         found++;
  195.         strIndex[0] = strIndex[1]+1;
  196.         strIndex[1] = (i == maxIndex) ? i+1 : i;
  197.     }
  198.   }
  199.  
  200.   return found>index ? input.substring(strIndex[0], strIndex[1]) : "";
  201. }
  202.  
  203. void envoyerSMS(string numero, string contenu)
  204. {
  205.   delay (1000);
  206.   sim800.println("AT+CMGS=\""+numero+"\"");
  207.   delay(500);
  208.   sim800.print(contenu); //text content
  209.   delay(500);
  210.   sim800.write(26); //combinaison CTRL+Z
  211.  
  212.   Serial.println("Message env. au "+numero+" : "+contenu);
  213. }
  214. ///////////////
  215.  
  216. bool verifierSMS()
  217. {
  218.  
  219.   while(sim800.available())
  220.   {
  221.   retourSim = sim800.readString();
  222.   }
  223.  
  224.   string typeRetour = retourSim.substring(2, 6); // pour ne récupérer que l'entête
  225.  
  226.  
  227.   if(typeRetour == "+CMT")
  228.   {
  229.     //Serial.println("Nouveau message !");
  230.   return 1;
  231.   }
  232.  
  233.   else
  234.   {
  235.   return 0;
  236.   }
  237.  
  238. }
  239.  
  240. bool verser(int dose)
  241. {
  242.   int iDose = 0;
  243.    
  244.  
  245.   while (iDose < dose)
  246.   {
  247.     Serial.println(iDose+1);
  248.     digitalWrite(pinRicard,HIGH);
  249.     delay (2500);
  250.     digitalWrite(pinRicard,LOW);
  251.     delay(250);
  252.     iDose ++;
  253.   }
  254.  
  255.   iDose = 0;
  256.  
  257.    while (iDose < maxDoses-dose)
  258.     Serial.println(iDose+1);
  259.   {
  260.     digitalWrite(pinEau,HIGH);
  261.     delay (2500);
  262.     digitalWrite(pinEau,LOW);
  263.     delay(250);
  264.     iDose ++;
  265.   }
  266.  
  267.   return true;
  268. }
  269.  
  270. ///////////////
  271.  
  272. void vidanger(int vanne)
  273. {
  274.   int pinVanne = 0;
  275.  
  276.   switch (vanne){
  277.   case 1 :
  278.   pinVanne = pinRicard;
  279.   break;
  280.  
  281.   case 2 :
  282.   pinVanne = pinEau;
  283.   break;
  284.  }
  285.  
  286.  digitalWrite(pinVanne,HIGH);
  287. }
  288. ////////////////
  289.  
  290. void stopVidanger()
  291. {
  292.  digitalWrite(pinRicard,LOW);
  293.  digitalWrite(pinEau,LOW);
  294. }
  295. Apporter
Parsed in 0.033 seconds