Capteur de vibration verification coupure de courant + GSM

Bonjour à tous,

Je suis entrain de bosser sur un projet personnel qui permettrait de m'envoyer un message sms quand ma pompe de piscine s'éteint.

J'utiliser une Arduino Uno, un capteur de vibration S-520D et un module gsm SIM 900 tout ceci alimenté grace à une batterie externe.

J'ai réussi à faire fonctionné tout les composant séparément mon problème est au niveau du code.
Je souhaiterais faire une boucle qui vérifie tant que mon capteur vibre donc qu'il fait passer le courant ou non cela signifie que ma pompe est allumée et que tout ce passe bien.

Lorsqu'il y a une coupure de courant mon capteur de vibration ne bouge plus donc il renvoi une valeur 1 par exemple pendant plus de 20-40 secondes, ceci declanche l'envoie d'un sms.

Puis il faudrait juste vérifie si cette valeur reste sur 1 ne pas renvoyer de sms toute les 20 sec cependant si la valeur recommence a changer cela signifierait que le courant est de retour et que le code peu reprendre du debut.

Je ne sais pas si quelqu'un pourrait m'aider à réaliser cette boucle j'ai un peu de mal a traduire mon idée en programme fonctionnel. ^^

Voici ce que j'ai pour le moment mais ne renvoie que les valeur ON quand le capteur ne fait pas passer le courant et OFF quand il le fait passer.

Merci à l'avance pour votre aide.

#include <SoftwareSerial.h>   
SoftwareSerial sim900(7,8);  
String Data_SMS;
int vib_pin = 12;         
int val = 0;
const int ledPin = 13;

void setup()
{
  pinMode(ledPin,OUTPUT);
  pinMode(12,INPUT_PULLUP);
  sim900.begin(19200);   
  Serial.begin(19200); 
  Serial.println("Pompe on SN XXXX");
}

void loop() { 
  delay(2000);// plus
  val = digitalRead(vib_pin);  
  if (val==1) {
    Serial.println("Pomp on");
    delay(2000);// plus 0 
  }
  else {
    Serial.println("Pompe off XXXX");
    delay(2000);// plus 0 
    if (val==1) {
     Serial.println("Pompe on XXXX");
    }
    else {
      SendMessage();
    }
  }
} 

void SendMessage() {
  Serial.println("Sending Pompe state...");     //Displays on the serial monitor
  sim900.print("AT+CMGF=1\r");          // Set the shield to SMS mode
  delay(1000);
  sim900.print("AT+CMGS=\"+33*********\"\r");  
  delay(500);
  sim900.print("Pompe off 57214");  
  delay(500);
  sim900.print((char)26);//(required according to the datasheet)
  delay(500);
  sim900.println();
  Serial.println("Data Sent.");
  delay(500);
}

Voici la reponse:

Pompe on
Pompe off XXXX
Sending Pompe state...
Data Sent.
Pompe on
Pompe on
Pompe off XXXX
Sending Pompe state...
Data Sent.
Pompe off XXXX
Sending Pompe state...
Data Sent.

envisager

#undef MyHW
#ifdef MyHW
const byte vibPin = A1;

#else
# include <SoftwareSerial.h>
SoftwareSerial sim900 (7,8);
const byte vibPin = 12;
#endif

const int ledPin  = 13;
enum { LED_OFF = HIGH, LED_ON = LOW };

enum { ST_RUN, ST_PEND, ST_OFF };
int state;

const unsigned long TIMEOUT =   20000;
const unsigned long BLINK   =   500;

unsigned long  timeMsec;
unsigned long  blinkMsec;

// -----------------------------------------------------------------------------
void setup ()
{
    pinMode (ledPin, OUTPUT);

    pinMode (vibPin, INPUT_PULLUP);
    if (HIGH == digitalRead (vibPin))
        state =  ST_RUN;
    else
        state =  ST_OFF;

#ifndef MyHW
    sim900.begin (19200);
#endif
    Serial.begin (19200);
    Serial.println ("Pompe on SN XXXX");
}

// -----------------------------------------------------------------------------
void loop () {
    unsigned long msec = millis ();
    int val = digitalRead (vibPin);

    switch (state)  {
    case ST_RUN:
        digitalWrite (ledPin, LED_ON);
        if (LOW == val)  {
            blinkMsec = timeMsec = msec;
            state = ST_PEND;
            Serial.println (" -> pend");
        }
        break;

    case ST_PEND:
        if ( (msec - blinkMsec) > BLINK)  {
            blinkMsec = msec;
            digitalWrite (ledPin, ! digitalRead (ledPin));
        }

        if (HIGH == val)  {
            state = ST_RUN;
            Serial.println (" -> run");
        }
        else  {
            if ( (msec - timeMsec) > TIMEOUT)  {
                state = ST_OFF;
                SendMessage ();
                Serial.println (" -> off");
            }
        }
        break;

    case ST_OFF:
    default:
        digitalWrite (ledPin, LED_OFF);
        if (HIGH == val)  {
            state = ST_RUN;
            Serial.println (" -> run");
        }
        break;
    }
}

// -----------------------------------------------------------------------------
void SendMessage () {
    Serial.println ("Sending Pompe state...");     //Displays on the serial monitor
#ifndef MyHW
    sim900.print ("AT+CMGF=1\r");          // Set the shield to SMS mode
    delay (1000);
    sim900.print ("AT+CMGS=\"+33*********\"\r");
    delay (500);
    sim900.print ("Pompe off 57214");
    delay (500);
    sim900.print ( (char)26);// (required according to the datasheet)
    delay (500);
    sim900.println ();
    Serial.println ("Data Sent.");
#endif
}
1 Like

Genial je viens d'essayer ça fonctionne à merveille! Vous avez été très rapide et efficace :scream: merci pour tout vous êtes mon sauveur

La réponse du system:

run
-> pend
-> run
-> pend
Sending Pompe state...
Data Sent.
-> off
-> run
-> pend