Go Down

Topic: Impianto di irrigazione comandato da sim800l (Read 1 time) previous topic - next topic

Patrick_M

questo pezzo se mandi on accende e spegne
                     se mandi off accende e spegne

Code: [Select]

        if (strcmp(smsbuffer, "On") == 0) {
            digitalWrite(pinOnOffdigitale, HIGH); // Attiva il RELE
            delay (500);
            digitalWrite (pinOnOffdigitale, LOW);
            delay (500);
         } else if (strcmp(smsbuffer, "Off") == 0) {
            digitalWrite(pinOnOffdigitale, HIGH); // Attiva il RELE
            delay (500);
            digitalWrite (pinOnOffdigitale, LOW);
            delay (500);


è questo quello che vuoi?
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

salvatore_paterna

#16
May 22, 2018, 04:47 pm Last Edit: May 22, 2018, 05:22 pm by salvatore_paterna
praticamente io in questo momento ho aggiunto quella parte di codice che eccita un relè con un sms per simulare il pulsante premuto portandolo verso gnd ho collegato il negativo come NA quindi non mi sta sempre premuto ma l'impulso non è sufficiente a farmi cambiare lo stato del pulsante gli ho dato un delay (1600);   , e quindi non riesco a fare avviare il ciclo creato precedentemente cioe la parte postata sotto , non so se e proprio corretto anche perché adesso vorrei inserire in questa parte di codice sotto che mi dovrebbe inviare un messaggio quando si conclude il ciclo della vasca vuota e vasca piena spero di essermi spiegato

Code: [Select]

OnOff = digitalRead (pinOnOff);  
  if (OnOff != lastOnOff) {
    if (OnOff == LOW) {
     statoOnOff = !statoOnOff ;
    }
    delay(75);
  }
  lastOnOff = OnOff;
digitalWrite(pinstatoimpianto, statoOnOff);
  if (statoOnOff == LOW) {
    digitalWrite(pompa, LOW);
    Serial.print ("Pompa pozzo spenta  -  ");
    digitalWrite(vasca, LOW);
    Serial.println ("Pompa vasca SPENTA ");
}
 
  if (statoOnOff == HIGH) {
    
    MIN = digitalRead (gallmin);
    MAX = digitalRead (gallmax);

    if (MAX == HIGH && MIN == HIGH)  { //VASCA VUOTA
      digitalWrite(pompa, HIGH);
      Serial.print ("Pompa pozzo accesa  -  ");
      digitalWrite(vasca, LOW);
      Serial.println ("Pompa vasca spenta ");
    }

    if (MAX == LOW && MIN == LOW )  {//VASCA PIENA
      digitalWrite(pompa, LOW);
      Serial.print ("Pompa pozzo spenta  -  ");
      digitalWrite(vasca, HIGH);
      Serial.println ("Pompa vasca accesa");
    }
   }

    
}


Patrick_M

 
Quote
spero di essermi spiegato
no :D

il pezzo che ti ho mostrato come è collegato al pezzo che hai postato tu?
 non mi dirai che la chiusura del relè (pinOnOffdigitale) comanda pinOnOff... ?
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

brunello22

Quote
ho aggiunto quella parte di codice che eccita un relè con un sms per simulare il pulsante premuto
Beh, posso capire.... ma anche se tu non sai programmare, ragiona un po'....
Tu attivi il rele' per un Tot e poi lo spegni... secondo te, quando il programma arriva al punto in cui controlla se il tasto è premuto, come lo trova ... premuto o no ?

brunello22


Code: [Select]


#include "SIM900.h"
#include <SoftwareSerial.h>
SoftwareSerial  Sim900Serial(2, 3);// rx, tx
#include "sms.h"
#include <Wire.h>
SMSGSM sms;
int numdata;
boolean started = false;
char smsbuffer[160];
char Mittente[20];
char mittenteregistrato [13] = "+3932+++"; // numero del mittente registrato (conosciuto)
char nomemittente [16] = "Impianto ULIVETO";
char sedicicrt [16]; // zona di memorizzazione dei primi sedici caratteri del messaggio ricevuto
int i = 0; // indice utilizzato nei cicli di for
int semaforo = 0; // semaforo riconoscimento numero telefono: o = numero riconosciuto;
// 1 = numero sconosciuto
const byte pompa = 4 ;// Il Pin 4 è quello connesso al relè1 della pompa del pozzo
const byte vasca = 5 ;// Il Pin 5 è quello connesso al relè 2 della pompa della vasca di rilancio
const byte gallmax = 6; // Il Pin 6 è quello connesso al galleggiante che segna la vasca piena
const byte gallmin = 12 ;// Il Pin 8 è quello connesso al galleggiante che segna la vasca vuota
const byte pinOnOff = 10; // Il Pin 10 è quello connesso al tasto ON
const byte pinstatoimpianto = 11;// il pin 11 si accende quando l'impianto e on o off
const byte pinOnOffsim = 9;// Il Pin 9 è quello connesso al TASTO CHE GESTISCE SOLO LA POMPA
//GALLEGGIANTI
byte MAX = 0 ; //VARIABILE CHE MEMORIZZA LO STATO DEL GALLEGGIANTE A LIVELLO MASSIMO CAPACITA'
byte MIN = 0; //VARIABILE CHE MEMORIZZA LO STATO DEL GALLEGGIANTE A LIVELLO MINIMA CAPACITA'
//-----------------------------------------------------------------------------------------------
//stato pulsante on off
byte OnOff = 0 ; //VARIABILE CHE MEMORIZZA LO STATO DEL PULSANTE SUL PIN 10
byte statoOnOff = 0 ;//Se sistema acceso o spento (HIGH = Acceso)
byte lastOnOff = 0 ;
//-----------------------------------------------------------------------------------------------

void setup()
{
  pinMode(pinOnOff, INPUT_PULLUP);   // imposta il pin 10 come pin di INPUT.
  pinMode(pompa, OUTPUT);   // imposta il pin 4 come pin di OUTPUT.
  digitalWrite(pompa, HIGH); // spegne inizialmente il relè, uso High perchè questi relè altrimenti appena accessa la scheda da subito un input e si chiude il contatto
  pinMode(vasca, OUTPUT);   // imposta il pin 5 come pin di OUTPUT.
  digitalWrite(vasca, HIGH); // spegne inizialmente il relè, uso High perchè questi relè altrimenti appena accessa la scheda da subito un input e si chiude il contatto
  pinMode(gallmax, INPUT_PULLUP);   // imposta il pin 6 come pin di OUTPUT.
  pinMode(gallmin, INPUT_PULLUP);   // imposta il pin 8 come pin di OUTPUT.
  pinMode(pinstatoimpianto, OUTPUT);   // indicatore impianto spento o acceso
  pinMode(pinOnOffsim, OUTPUT);
  digitalWrite(pinstatoimpianto, statoOnOff);// indicatore acceso alto

  //Serial connection.
  Serial.begin(9600);
  // GSM setup
  digitalWrite(pinOnOffsim, HIGH);
  delay(1500);  // > 1 secondo
  digitalWrite(pinOnOffsim, LOW);
  delay(2500); // > 2.2 secondi
  Serial.println("SIM900 setup...");
  if (gsm.begin(2400)) {
    Serial.println("SIM900 Pronta");
    started = true;
  }
  else
    Serial.println(" SIM900 ko");
}

void loop()
{
  char inSerial[50];
  char position;
  if (started)
  {
    position = sms.IsSMSPresent(SMS_ALL);// legge i messaggi in coda
    if (position) {
      sms.GetSMS(position, Mittente, smsbuffer, 160);// Leggo il messaggio ed il mittente
      Serial.print("sms in arrivo da");
      Serial.println("Tel.:" + String( Mittente));
      Serial.println("Content: " + String(smsbuffer));
      semaforo = 0;
      for (i = 0; i <= 12; i++)
      {
        if (!(Mittente[i] == mittenteregistrato [i]))
          semaforo = 1;
      }
      if (semaforo == 0)
        Serial.print (nomemittente);
      else
        Serial.print (Mittente);
      // attende tre secondi per consentire la lettura su lcd del mittente
      Serial.print ("testo sms:");
      for (i = 0; i <= 15; i++)
        sedicicrt [i] = smsbuffer [i]; // memorizzo i primi 16 caratteri del messaggio ricevuto
      Serial.print (sedicicrt); // espongo su lcd il messaggio ricevuto
      if (strcmp(smsbuffer, "On") == 0)
      {
        statoOnOff = true ;
      }
      else if (strcmp(smsbuffer, "Off") == 0)
      {
        statoOnOff = false ;
      }
      else if (strcmp(smsbuffer, "Stato") == 0)
      {
        if (digitalRead(statoOnOff) )
        {
          sms.SendSMS(Mittente, "STATUS: impianto Attivo"); // restituisce true se invia l'SMS
        }
        else
        {
          sms.SendSMS(Mittente, "STATUS: impianto disattivo"); // restituisce true se invia l'SMS
        }
      }
      else
      {
        Serial.println ("sms non valido");
      }
      // attende tre secondi per consentire la lettura del messaggio
      sms.DeleteSMS(position); // Elimina l'SMS appena analizzato
    }
    // attende 5 secondi per consentire la lettura del display
  }

  OnOff = digitalRead (pinOnOff);
  if (OnOff != lastOnOff) {
    if (OnOff == LOW) {
      statoOnOff = !statoOnOff ;
    }
    delay(75);
  }
  lastOnOff = OnOff;
  digitalWrite(pinstatoimpianto, statoOnOff);

  // se lo stato dal pulsante è vero oppure  se lo stato da SMS è vero
  if (statoOnOff ) {
    MIN = digitalRead (gallmin);
    MAX = digitalRead (gallmax);
    if (MAX == HIGH && MIN == HIGH)  { //VASCA VUOTA
      digitalWrite(pompa, HIGH);
      Serial.print ("Pompa pozzo accesa  -  ");
      digitalWrite(vasca, LOW);
      Serial.println ("Pompa vasca spenta ");
    }
    if (MAX == LOW && MIN == LOW )  {//VASCA PIENA
      digitalWrite(pompa, LOW);
      Serial.print ("Pompa pozzo spenta  -  ");
      digitalWrite(vasca, HIGH);
      Serial.println ("Pompa vasca accesa");
    }
  }
  else {
    digitalWrite(pompa, LOW);
    Serial.print ("Pompa pozzo spenta  -  ");
    digitalWrite(vasca, LOW);
    Serial.println ("Pompa vasca SPENTA ");
  }

}

salvatore_paterna

brunello22 grazie mille !
praticamente con il comando sms cambio lo stato del pin una cosa semplice la stavo facendo diventare complicata .
Quindi se voglio inserire l'invio di un messaggio quando la vasca e piena il comando gsm

 es. non posso inserirlo in nel ?
" if (MAX==LOW&&MIN==LOW) {
sms.SendSMS(Mittente, "STATUS: vasca vuota) ;

spero che non l'ho sparata grossa!


grazie ancora grazie 

brunello22

Si che puoi inserirlo, pero' occhio, così come hai fatto lo spedisce tutte le volte che entra nell' IF
Devi usare una variabile come flag per sapere che lo hai gia' inviato e resettarla ( la variabile ) quando credi di poterne inviare un'altro


salvatore_paterna

ciao brunello si in effetti mi invia di continuo messaggi ma la variabile dovrei memorizzare lo stato dell'invio dell'sms ? tipo

" if (MAX==LOW&&MIN==LOW) {
sms.SendSMS(Mittente, "STATUS: vasca vuota) ;

inviosms = true; // naturalmente e dichiarata prima del setup  "bool inviosms = false;

ma dove resetto la variabile ! mi sono perso

brunello22

Code: [Select]
if (inviosms == true ) {
      sms.SendSMS(Mittente, "STATUS:vasca vuota");
      inviosms = false;
      etc  etc
    }


e la rimetti true quando si verifica un'altra condizione

salvatore_paterna

immaginavo che dovevo mettere un if che verificava la condizione sei veramente un grande Brunello top
grazie grazie

salvatore_paterna

#25
May 24, 2018, 12:02 am Last Edit: May 24, 2018, 12:11 am by salvatore_paterna
Brunello scusa un'altra cosa ma se voglio inserire la lettura di un terzo galleggiante dove non comanda le pompe ma invia solo un messaggio di allarme anomalia impianto se lo inserisco in questo modo dovrebbe funzionare quando il ciclo e su on e non mi invia nessun messaggio .
Quindi se io voglio proseguire nel ciclo statoOnOff in maniera tale che se voglio inserire altri input lo posso fare
ancora grazie
ciao  
Code: [Select]



  // se lo stato dal pulsante è vero oppure  se lo stato da SMS è vero
  if (statoOnOff ) {
    MIN = digitalRead (gallmin);
    MAX = digitalRead (gallmax);
    
    SUPERPIENO = digitalRead (superpieno);
    if (SUPERPIENO == LOW )  {  
      Serial.println(SUPERPIENO);
       if (inviosms == true ) {
      sms.SendSMS(mittenteregistrato, "STATUS:ANOMALIA IMPIANTO");
      inviosms = false;  }
  }
    if (MAX == HIGH && MIN == HIGH)  { //VASCA VUOTA
       if (inviosms == true ) {
      sms.SendSMS(Mittente, "STATUS:Vasca vuota PompaON,VascaOFF");
      inviosms = false;  }
      digitalWrite(pompa, HIGH);
      Serial.print ("Pompa pozzo accesa  -  ");
      digitalWrite(vasca, LOW);
      Serial.println ("Pompa vasca spenta ");
       }
    if (MAX == LOW && MIN == LOW)  {//VASCA PIENA
      if (inviosms == true ) {
      sms.SendSMS(Mittente, "STATUS:Vasca vuota PompaON,VascaOFF");
      inviosms = false;  }
      digitalWrite(pompa, HIGH);
      Serial.print ("Pompa pozzo accesa  -  ");
      digitalWrite(vasca, HIGH);
      Serial.println ("Pompa vasca accesa");
    }
  
  }
 else {
    digitalWrite(pompa, LOW);
    Serial.print ("Pompa pozzo spenta  -  ");
    digitalWrite(vasca, LOW);
    Serial.println ("Pompa vasca SPENTA ");
  }

 }

 




Se invece lo metto in questo modo mi invia il messaggio ma lo stato del pulsante non è su on !

Code: [Select]

void loop()
{
  
  char inSerial[50];
  char position;
  if (started)
  {
    position = sms.IsSMSPresent(SMS_ALL);// legge i messaggi in coda
    if (position) {
      sms.GetSMS(position, Mittente, smsbuffer, 160);// Leggo il messaggio ed il mittente
      Serial.print("sms in arrivo da");
      Serial.println("Tel.:" + String( Mittente));
      Serial.println("Content: " + String(smsbuffer));
      semaforo = 0;
      for (i = 0; i <= 12; i++)
      {
        if (!(Mittente[i] == mittenteregistrato [i]))
          semaforo = 1;
      }
      if (semaforo == 0)
        Serial.print (nomemittente);
      else
        Serial.print (Mittente);
      // attende tre secondi per consentire la lettura su lcd del mittente
      Serial.print ("testo sms:");
      for (i = 0; i <= 15; i++)
        sedicicrt [i] = smsbuffer [i]; // memorizzo i primi 16 caratteri del messaggio ricevuto
      Serial.print (sedicicrt); // espongo su lcd il messaggio ricevuto
      if (strcmp(smsbuffer, "On") == 0)
      {
        statoOnOff = true ;
      }
      else if (strcmp(smsbuffer, "Off") == 0)
      {
        statoOnOff = false ;
      }
      else if (strcmp(smsbuffer, "Stato") == 0)
      {
        if (digitalRead(statoOnOff) )
        {
          sms.SendSMS(Mittente, "STATUS: impianto SPENTO"); // restituisce true se invia l'SMS
        }
        else
        {
          sms.SendSMS(Mittente, "STATUS: impianto ACCESO"); // restituisce true se invia l'SMS
        }
      }
      else
      {
        Serial.println ("sms non valido");
      }
      // attende tre secondi per consentire la lettura del messaggio
      sms.DeleteSMS(position); // Elimina l'SMS appena analizzato
    }
    SUPERPIENO = digitalRead (superpieno);
    if (SUPERPIENO == LOW )  {  
      Serial.println(SUPERPIENO);
       if (inviosms == true ) {
      sms.SendSMS(mittenteregistrato, "STATUS:ANOMALIA IMPIANTO");
      inviosms = false;  }
  }
    }
  
  
  OnOff = digitalRead (pinOnOff);
  if (OnOff != lastOnOff) {
    if (OnOff == LOW) {
      statoOnOff = !statoOnOff ;
    }
    delay(75);
  }
  lastOnOff = OnOff;
  digitalWrite(pinstatoimpianto, statoOnOff);

  // se lo stato dal pulsante è vero oppure  se lo stato da SMS è vero
  if (statoOnOff ) {
    MIN = digitalRead (gallmin);
    MAX = digitalRead (gallmax);
    
    if (MAX == HIGH && MIN == HIGH)  { //VASCA VUOTA
       if (inviosms == true ) {
      sms.SendSMS(Mittente, "STATUS:Vasca vuota PompaON,VascaOFF");
      inviosms = false;  }
      digitalWrite(pompa, HIGH);
      Serial.print ("Pompa pozzo accesa  -  ");
      digitalWrite(vasca, LOW);
      Serial.println ("Pompa vasca spenta ");
       }
    if (MAX == LOW && MIN == LOW)  {//VASCA PIENA
      if (inviosms == true ) {
      sms.SendSMS(Mittente, "STATUS:Vasca vuota PompaON,VascaOFF");
      inviosms = false;  }
      digitalWrite(pompa, HIGH);
      Serial.print ("Pompa pozzo accesa  -  ");
      digitalWrite(vasca, HIGH);
      Serial.println ("Pompa vasca accesa");
    }
  
  }
 else {
    digitalWrite(pompa, LOW);
    Serial.print ("Pompa pozzo spenta  -  ");
    digitalWrite(vasca, LOW);
    Serial.println ("Pompa vasca SPENTA ");
  }

 }

 


brunello22

Code: [Select]
if (digitalRead(statoOnOff) )
        {
          sms.SendSMS(Mittente, "STATUS: impianto SPENTO"); // restituisce true se invia l'SMS
       


Sono di corsa e quindi non riesco a capire cosa stai facendo, ma statoOnOff non è un pin di cui puoi fare il difùgitalRead()

salvatore_paterna

#27
May 24, 2018, 12:17 am Last Edit: May 24, 2018, 12:03 pm by salvatore_paterna Reason:
no ho aggiunto un galleggiante di sicurezza con SUPERPIENO = digitalRead(superpieno) che è un galleggiante collegato al pin 8 ; la sua funzione non e quella di accendere o spegnere le pompe ma solo avvisarmi che vi è un anomalia .
comunque si e fatto tardi a domani grazie buona notte ciaoo

Scusa nel frattempo  ho pensato  ad un'altra soluzione vediamo se è giusto

If ( statoOnOff == true && MAX == HIGH & & MIN = = HIGH )
{
 if (inviosms = = true) {
sms.SendSMS (mittenteregistrato,"  VASCA VUOTA "
inviosms = false; }
}

Lo stesso procedimento lo inserisco per tutti i messaggi di cambi di stato dei vari galleggianti,
Lo inserirei  prima dell' if (statoOnOff) ecc ecc
Come arrivo a  casa provo

salvatore_paterna

ciao brunello ho appena fatto la prova cosi e l sms nell' if ( MAX == LOW && MIN == LOW && SUPERPIENO == LOW ) lo invia non solo uno ogni volte che cambia stato ma di continuo !
Come faccio a salvare il cambio di stato dell'if

Code: [Select]

#include "SIM900.h"
#include <SoftwareSerial.h>
SoftwareSerial  Sim900Serial(2, 3);// rx, tx
#include "sms.h"
#include <Wire.h>
SMSGSM sms;
int numdata;
boolean started = false;
char smsbuffer[160];
char Mittente[20];
char mittenteregistrato [13] = "+393890000222" ; // numero del mittente registrato (conosciuto)
char nomemittente [16] = "Impianto ULIVETO";
char sedicicrt [16]; // zona di memorizzazione dei primi sedici caratteri del messaggio ricevuto
int i = 0; // indice utilizzato nei cicli di for
int semaforo = 0; // semaforo riconoscimento numero telefono: o = numero riconosciuto;
// 1 = numero sconosciuto
const byte pompa = 4 ;// Il Pin 4 è quello connesso al relè1 della pompa del pozzo
const byte vasca = 5 ;// Il Pin 5 è quello connesso al relè 2 della pompa della vasca di rilancio
const byte gallmax = 6; // Il Pin 6 è quello connesso al galleggiante che segna la vasca piena
const byte gallmin = 12 ;// Il Pin 12 è quello connesso al galleggiante che segna la vasca vuota
const byte superpieno = 8 ;// Il Pin 8 è quello connesso al galleggiante che segna la vasca troppo piena ANOMALIA
const byte pinOnOff = 10; // Il Pin 10 è quello connesso al tasto ON
const byte pinstatoimpianto = 11;// il pin 11 si accende quando l'impianto e on o off
const byte pinOnOffsim = 9;// Il Pin 9 è quello connesso al TASTO CHE GESTISCE SOLO LA POMPA
//GALLEGGIANTI
byte MAX = 0 ; //VARIABILE CHE MEMORIZZA LO STATO DEL GALLEGGIANTE A LIVELLO MASSIMO CAPACITA'
byte MIN = 0; //VARIABILE CHE MEMORIZZA LO STATO DEL GALLEGGIANTE A LIVELLO MINIMA CAPACITA'
byte SUPERPIENO = 0;//VARIABILE CHE MEMORIZZA LO STATO DEL GALLEGGIANTE A LIVELLO SUPERPIENO
//-----------------------------------------------------------------------------------------------
//stato pulsante on off
byte OnOff = 0 ; //VARIABILE CHE MEMORIZZA LO STATO DEL PULSANTE SUL PIN 10
byte statoOnOff = 0 ;//Se sistema acceso o spento (HIGH = Acceso)
byte lastOnOff = 0 ;
//-----------------------------------------------------------------------------------------------
bool inviosms = false ;
void setup()
{
  pinMode(pinOnOff, INPUT_PULLUP);   // imposta il pin 10 come pin di INPUT.
  pinMode(pompa, OUTPUT);   // imposta il pin 4 come pin di OUTPUT.
  digitalWrite(pompa, HIGH); // spegne inizialmente il relè, uso High perchè questi relè altrimenti appena accessa la scheda da subito un input e si chiude il contatto
  pinMode(vasca, OUTPUT);   // imposta il pin 5 come pin di OUTPUT.
  digitalWrite(vasca, HIGH); // spegne inizialmente il relè, uso High perchè questi relè altrimenti appena accessa la scheda da subito un input e si chiude il contatto
  pinMode(gallmax, INPUT_PULLUP);   // imposta il pin 6 come pin di OUTPUT.
  pinMode(gallmin, INPUT_PULLUP);   // imposta il pin 12 come pin di OUTPUT.
  pinMode(superpieno, INPUT_PULLUP);// imposta il pin 8 come pin di OUTPUT.
  pinMode(pinstatoimpianto, OUTPUT);   // indicatore impianto spento o acceso
  pinMode(pinOnOffsim, OUTPUT);
  digitalWrite(pinstatoimpianto, statoOnOff);// indicatore acceso alto

  //Serial connection.
  Serial.begin(9600);
  // GSM setup
  digitalWrite(pinOnOffsim, HIGH);
  delay(1500);  // > 1 secondo
  digitalWrite(pinOnOffsim, LOW);
  delay(2500); // > 2.2 secondi
  Serial.println("SIM900 setup...");
  if (gsm.begin(2400)) {
    Serial.println("SIM900 Pronta");
    started = true;
  }
  else
    Serial.println(" SIM900 ko");
}

void loop()
{
 
  char inSerial[50];
  char position;
  if (started)
  {
    position = sms.IsSMSPresent(SMS_ALL);// legge i messaggi in coda
    if (position) {
      sms.GetSMS(position, Mittente, smsbuffer, 160);// Leggo il messaggio ed il mittente
      Serial.print("sms in arrivo da");
      Serial.println("Tel.:" + String( Mittente));
      Serial.println("Content: " + String(smsbuffer));
      semaforo = 0;
      for (i = 0; i <= 12; i++)
      {
        if (!(Mittente[i] == mittenteregistrato [i]))
          semaforo = 1;
      }
      if (semaforo == 0)
        Serial.print (nomemittente);
      else
        Serial.print (Mittente);
      // attende tre secondi per consentire la lettura su lcd del mittente
      Serial.print ("testo sms:");
      for (i = 0; i <= 15; i++)
        sedicicrt [i] = smsbuffer [i]; // memorizzo i primi 16 caratteri del messaggio ricevuto
      Serial.print (sedicicrt); // espongo su lcd il messaggio ricevuto
      if (strcmp(smsbuffer, "On") == 0)
      {
        statoOnOff = true ;
      }
      else if (strcmp(smsbuffer, "Off") == 0)
      {
        statoOnOff = false ;
      }
      else if (strcmp(smsbuffer, "Stato") == 0)
      {
        if (digitalRead(statoOnOff) )
        {
          sms.SendSMS(Mittente, "STATUS: impianto SPENTO"); // restituisce true se invia l'SMS
        }
        else
        {
          sms.SendSMS(Mittente, "STATUS: impianto ACCESO"); // restituisce true se invia l'SMS
        }
      }
      else
      {
        Serial.println ("sms non valido");
      }
      // attende tre secondi per consentire la lettura del messaggio
      sms.DeleteSMS(position); // Elimina l'SMS appena analizzato
    }
   
    }
   
   
   
  OnOff = digitalRead (pinOnOff);
  if (OnOff != lastOnOff) {
    if (OnOff == LOW) {
      statoOnOff = !statoOnOff ;
    }
    delay(75);
  }
  lastOnOff = OnOff;
  digitalWrite(pinstatoimpianto, statoOnOff);

  // se lo stato dal pulsante è vero oppure  se lo stato da SMS è vero
 if (statoOnOff ) {
    MIN = digitalRead (gallmin);
    MAX = digitalRead (gallmax);
    SUPERPIENO = digitalRead (superpieno);
 if (MAX == HIGH && MIN == HIGH)  { //VASCA VUOTA
       if (inviosms == true ) {
      sms.SendSMS(Mittente, "STATUS:Vasca vuota PompaON,VascaOFF");
      inviosms = false;  }
      digitalWrite(pompa, HIGH);
      Serial.print ("Pompa pozzo accesa  -  ");
      digitalWrite(vasca, LOW);
      Serial.println ("Pompa vasca spenta ");
       }
  if (MAX == LOW && MIN == LOW)  {//VASCA PIENA
      if (inviosms == true ) {
      sms.SendSMS(Mittente, "STATUS:Vasca vuota PompaON,VascaOFF");
      inviosms = false;  }
      digitalWrite(pompa, HIGH);
      Serial.print ("Pompa pozzo accesa  -  ");
      digitalWrite(vasca, HIGH);
      Serial.println ("Pompa vasca accesa");
    }
  if ( MAX == LOW && MIN == LOW && SUPERPIENO == LOW )
{
Serial.print ("anomalia  -  ");
 if (inviosms == false) {
sms.SendSMS (mittenteregistrato,"STATUS:  ANOMALIA  ");
inviosms = true; }
}
  }
 else {
    digitalWrite(pompa, LOW);
    Serial.print ("Pompa pozzo spenta  -  ");
    digitalWrite(vasca, LOW);
    Serial.println ("Pompa vasca SPENTA ");
  }

 }

 


brunello22

Code: [Select]


#include "SIM900.h"
#include <SoftwareSerial.h>
SoftwareSerial  Sim900Serial(2, 3);// rx, tx
#include "sms.h"
#include <Wire.h>
SMSGSM sms;
int numdata;
boolean started = false;
char smsbuffer[160];
char Mittente[20];
char mittenteregistrato [13] = "+393890000222" ; // numero del mittente registrato (conosciuto)
char nomemittente [16] = "Impianto ULIVETO";
char sedicicrt [16]; // zona di memorizzazione dei primi sedici caratteri del messaggio ricevuto
int i = 0; // indice utilizzato nei cicli di for
int semaforo = 0; // semaforo riconoscimento numero telefono: o = numero riconosciuto;
// 1 = numero sconosciuto
const byte pompa = 4 ;// Il Pin 4 è quello connesso al relè1 della pompa del pozzo
const byte vasca = 5 ;// Il Pin 5 è quello connesso al relè 2 della pompa della vasca di rilancio
const byte gallmax = 6; // Il Pin 6 è quello connesso al galleggiante che segna la vasca piena
const byte gallmin = 12 ;// Il Pin 12 è quello connesso al galleggiante che segna la vasca vuota
const byte superpieno = 8 ;// Il Pin 8 è quello connesso al galleggiante che segna la vasca troppo piena ANOMALIA
const byte pinOnOff = 10; // Il Pin 10 è quello connesso al tasto ON
const byte pinstatoimpianto = 11;// il pin 11 si accende quando l'impianto e on o off
const byte pinOnOffsim = 9;// Il Pin 9 è quello connesso al TASTO CHE GESTISCE SOLO LA POMPA
//GALLEGGIANTI
byte MAX = 0 ; //VARIABILE CHE MEMORIZZA LO STATO DEL GALLEGGIANTE A LIVELLO MASSIMO CAPACITA'
byte MIN = 0; //VARIABILE CHE MEMORIZZA LO STATO DEL GALLEGGIANTE A LIVELLO MINIMA CAPACITA'
byte SUPERPIENO = 0;//VARIABILE CHE MEMORIZZA LO STATO DEL GALLEGGIANTE A LIVELLO SUPERPIENO
//-----------------------------------------------------------------------------------------------
//stato pulsante on off
byte OnOff = 0 ; //VARIABILE CHE MEMORIZZA LO STATO DEL PULSANTE SUL PIN 10
byte statoOnOff = 0 ;//Se sistema acceso o spento (HIGH = Acceso)
byte lastOnOff = 0 ;
//-----------------------------------------------------------------------------------------------
bool inviosms = true ;
bool inviosmsSuperpieno = true ;

void setup()
{
  pinMode(pinOnOff, INPUT_PULLUP);   // imposta il pin 10 come pin di INPUT.
  pinMode(pompa, OUTPUT);   // imposta il pin 4 come pin di OUTPUT.
  digitalWrite(pompa, HIGH); // spegne inizialmente il relè, uso High perchè questi relè altrimenti appena accessa la scheda da subito un input e si chiude il contatto
  pinMode(vasca, OUTPUT);   // imposta il pin 5 come pin di OUTPUT.
  digitalWrite(vasca, HIGH); // spegne inizialmente il relè, uso High perchè questi relè altrimenti appena accessa la scheda da subito un input e si chiude il contatto
  pinMode(gallmax, INPUT_PULLUP);   // imposta il pin 6 come pin di OUTPUT.
  pinMode(gallmin, INPUT_PULLUP);   // imposta il pin 12 come pin di OUTPUT.
  pinMode(superpieno, INPUT_PULLUP);// imposta il pin 8 come pin di OUTPUT.
  pinMode(pinstatoimpianto, OUTPUT);   // indicatore impianto spento o acceso
  pinMode(pinOnOffsim, OUTPUT);
  digitalWrite(pinstatoimpianto, statoOnOff);// indicatore acceso alto

  //Serial connection.
  Serial.begin(9600);
  // GSM setup
  digitalWrite(pinOnOffsim, HIGH);
  delay(1500);  // > 1 secondo
  digitalWrite(pinOnOffsim, LOW);
  delay(2500); // > 2.2 secondi
  Serial.println("SIM900 setup...");
  if (gsm.begin(2400)) {
    Serial.println("SIM900 Pronta");
    started = true;
  }
  else
    Serial.println(" SIM900 ko");
}

void loop()
{

  char inSerial[50];
  char position;
  if (started)
  {
    position = sms.IsSMSPresent(SMS_ALL);// legge i messaggi in coda
    if (position) {
      sms.GetSMS(position, Mittente, smsbuffer, 160);// Leggo il messaggio ed il mittente
      Serial.print("sms in arrivo da");
      Serial.println("Tel.:" + String( Mittente));
      Serial.println("Content: " + String(smsbuffer));
      semaforo = 0;
      for (i = 0; i <= 12; i++)
      {
        if (!(Mittente[i] == mittenteregistrato [i]))
          semaforo = 1;
      }
      if (semaforo == 0)
        Serial.print (nomemittente);
      else
        Serial.print (Mittente);
      // attende tre secondi per consentire la lettura su lcd del mittente
      Serial.print ("testo sms:");
      for (i = 0; i <= 15; i++)
        sedicicrt [i] = smsbuffer [i]; // memorizzo i primi 16 caratteri del messaggio ricevuto
      Serial.print (sedicicrt); // espongo su lcd il messaggio ricevuto
      if (strcmp(smsbuffer, "On") == 0)
      {
        statoOnOff = true ;
      }
      else if (strcmp(smsbuffer, "Off") == 0)
      {
        statoOnOff = false ;
      }
      else if (strcmp(smsbuffer, "Stato") == 0)
      {
        if (digitalRead(statoOnOff) )
        {
          sms.SendSMS(Mittente, "STATUS: impianto SPENTO"); // restituisce true se invia l'SMS
        }
        else
        {
          sms.SendSMS(Mittente, "STATUS: impianto ACCESO"); // restituisce true se invia l'SMS
        }
      }
      else
      {
        Serial.println ("sms non valido");
      }
      // attende tre secondi per consentire la lettura del messaggio
      sms.DeleteSMS(position); // Elimina l'SMS appena analizzato
    }

  }



  OnOff = digitalRead (pinOnOff);
  if (OnOff != lastOnOff) {
    if (OnOff == LOW) {
      statoOnOff = !statoOnOff ;
    }
    delay(75);
  }
  lastOnOff = OnOff;
  digitalWrite(pinstatoimpianto, statoOnOff);

  // se lo stato dal pulsante è vero oppure  se lo stato da SMS è vero
  if (statoOnOff ) {
    MIN = digitalRead (gallmin);
    MAX = digitalRead (gallmax);
    SUPERPIENO = digitalRead (superpieno);
    if (MAX == HIGH && MIN == HIGH)  { //VASCA VUOTA
      if (inviosms == true ) {
        sms.SendSMS(Mittente, "STATUS:Vasca vuota PompaON,VascaOFF");
        inviosms = false;
      }
      digitalWrite(pompa, HIGH);
      Serial.print ("Pompa pozzo accesa  -  ");
      digitalWrite(vasca, LOW);
      Serial.println ("Pompa vasca spenta ");
    }
    else if (MAX == LOW && MIN == LOW)  {  //VASCA PIENA
      if ( SUPERPIENO == LOW )
      {
        Serial.print ("anomalia  -  ");
        if (inviosmsSuperpieno == true) {
          Serial.println ("STATUS:  ANOMALIA  ");
          inviosmsSuperpieno = false;
        }
      }
      else
      {
        if (inviosms == true ) {
          sms.SendSMS(Mittente, "STATUS:Vasca vuota PompaON,VascaOFF");
          inviosms = false;
        }
        digitalWrite(pompa, HIGH);
        Serial.print ("Pompa pozzo accesa  -  ");
        digitalWrite(vasca, HIGH);
        Serial.println ("Pompa vasca accesa");
      }
    }
    else {
      digitalWrite(pompa, LOW);
      Serial.print ("Pompa pozzo spenta  -  ");
      digitalWrite(vasca, LOW);
      Serial.println ("Pompa vasca SPENTA ");
      inviosms = true;
      inviosmsSuperpieno = true ;

    }
  }
}

Go Up