Sim900 sms en boucle

Bonjour.
Je suis en train de concevoir un scketch pour une alarme avec un envoi SMS via une carte SIM900.
Le scketch fonctionne, j'envoi le message SMS mais celui-ci est envoyé en boucle, non-stop, comment éviter ça ???
Merci.
// *****************************************

  if (digitalRead(IMA) == LOW) // COMMANDE M/A
  {
    // MESSAGE GSM MISE EN MARCHE ALARME
    mySerial.println("AT+CMGS=\"+33xxxxxxxxx\""); mySerial.println("MISE EN MARCHE ALARME"); mySerial.write(26);
    if ( LEDState == HIGH )
    {
      LEDState == HIGH;
      if ( (millis() - rememberTime) >= onDuration)
      {
        LEDState = LOW;
        rememberTime = millis();
      }
    }
    else
    {
      if ( (millis() - rememberTime) >= offDuration)
      {
        LEDState = HIGH;
        rememberTime = millis();
      }
    }
    digitalWrite(LEDpin, LEDState);
    // **************************************** GESTION DES ALARMES
    // MULTIPLEXEUR 74HC165
    for ( byte i = 1; i < NUM_OF_74HC165 ; i++ )
    {
      if ( previous[i] != received[i] )
      {
        previous[i] = received[i];
        lcd.setCursor(0, 0); lcd.print(i, DEC); lcd.print(" "); lcd.print(received[i], DEC); lcd.print("   ");
        if (received[i] == 1)
        {
          mySerial.println("AT+CMGS=\"+33xxxxxxxxx\""); mySerial.println("ALARME ZONE 1"); mySerial.write(26);
        }
     // et la suite jusqu'à ce que received[i] == 7


      }
    }
    // ********************


  }
  else
  {
    lcd.setCursor(0, 0); lcd.print("      ");
    mySerial.println("AT+CMGS=\"+33xxxxxxxxx\""); mySerial.println("MISE A L'ARRET ALARME"); mySerial.write(26);
  }
  // FIN M/A

Ne postez pas de question dans la zone dédiée aux tutos ➜ j’ai déplacé votre post

Si Elle est déjà HIGH pourquoi la remettre HIGH?

c’est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

J'ai masqué ton numéro de téléphone qui apparaissait en clair dans le code

Oups !!!! Merci.

Merci mais où est il maintenant ???
Je ne connais pas le forum .

Il est là où vous avez répondu, dans le forum francophone principal

Postez tout le code

Bonjour JML.
Comme demandé:

// **************************************** MEMOIRE EEPROM
#include "Arduino.h"
#include <EEPROM.h>
// **************************************** DISPLAY LCD I2C
#include <LiquidCrystal_I2C.h>
int CO = 20, LI = 4;
LiquidCrystal_I2C lcd(0x27, CO, LI);
// **************************************** HORLOGE TEMPS REEL
#include "RTClib.h"
RTC_DS3231 ds3231;
// **************************************** GSM SMS GPRS
#include <SoftwareSerial.h> // https://www.moussasoft.com/
SoftwareSerial mySerial(3, 4); // 3 ARDUINO = TX (GSMT) -/- 4 ARDUINO = RX (GSMR)
// **************************************** ENTREES MULTIPLEXEES
// 74HC165
int LATCH = 11;
int CLOCK = 10;
int DATA = 9;
#define NUM_OF_74HC165 2
byte received[NUM_OF_74HC165];
byte previous[NUM_OF_74HC165];
// **************************************** FLASHEUR LED M/A
const int LEDpin = 2;
const long onDuration = 50;// OFF time for LED
const long offDuration = 1000;// ON time for LED
int LEDState = LOW; // initial state of LED
long rememberTime = 0; // this is used by the code
int IMA = 5; // COMMANDE M/A
// **************************************** VARIABLES DIVERSES
int a; // ALARME
int b; // TEMOINS ALARMES
int c, d, e, f;

void setup()
{
  lcd.begin(CO, LI);
  // **************************************** HORLOGE TEMPS REEL
  if (!ds3231.begin())
  {
    Serial.println("[ERREUR] Impossible de se connecter au module DS3231 (câblage incorrect, peut-être ?)");
    Serial.flush();
    while (1);
  }
  ds3231.adjust(DateTime(F(__DATE__), F(__TIME__)));
  // **************************************** GSM SMS GPRS
  mySerial.begin(9600);
  mySerial.println("AT");
  mySerial.println("AT+CMGF=1");
  // **************************************** ENTREES MULTIPLEXEES 74HC165
  pinMode(LATCH, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  pinMode(DATA, INPUT);
  digitalWrite(CLOCK, LOW);
  digitalWrite(LATCH, LOW);
  // **************************************** FLASHEUR LED M/A
  pinMode(LEDpin, OUTPUT); // define LEDpin as output
  digitalWrite(LEDpin, LEDState); // set initial state
  pinMode(IMA, INPUT_PULLUP);
}

void loop()
{
  // **************************************** ENTRÉES MULTIPLEXÉES
  digitalWrite(LATCH, HIGH);
  for ( byte i = 1; i < NUM_OF_74HC165 ; i++ )
  {
    received[i] = shiftInMSBFirst(DATA, CLOCK);
  }
  digitalWrite(LATCH, LOW);
  // **************************************** HORLOGE
  DateTime DTDS = ds3231.now();
  lcd.setCursor(2, 3);
  lcd.print(FV2CH(DTDS.day()));
  lcd.print("/");
  lcd.print(FV2CH(DTDS.month()));
  lcd.print("/");
  lcd.print(FV2CH(DTDS.year()));
  lcd.print(" ");
  lcd.print(FV2CH(DTDS.hour()));
  lcd.print(":");
  lcd.print(FV2CH(DTDS.minute()));
  // **************************************** LED FLASHEUR
  if (digitalRead(IMA) == LOW) // COMMANDE M/A
  {
    // MESSAGE GSM MISE EN MARCHE ALARME
    mySerial.println("AT+CMGS=\"+33xxxxxxxxxx\""); mySerial.println("MISE EN MARCHE ALARME"); mySerial.write(26);
    if ( LEDState == HIGH )
    {
      if ( (millis() - rememberTime) >= onDuration)
      {
        LEDState = LOW;
        rememberTime = millis();
      }
    }
    else
    {
      if ( (millis() - rememberTime) >= offDuration)
      {
        LEDState = HIGH;
        rememberTime = millis();
      }
    }
    digitalWrite(LEDpin, LEDState);
    // **************************************** GESTION DES ALARMES
    // MULTIPLEXEUR 74HC165
    for ( byte i = 1; i < NUM_OF_74HC165 ; i++ )
    {
      if ( previous[i] != received[i] )
      {
        previous[i] = received[i];
        lcd.setCursor(0, 0); lcd.print(i, DEC); lcd.print(" "); lcd.print(received[i], DEC); lcd.print("   ");
        if (received[i] == 1)
        {
          mySerial.println("AT+CMGS=\"+33xxxxxxxxxx\""); mySerial.println("ALARME ZONE 1"); mySerial.write(26);
        }
      }
    }
    // ********************
  }
  else
  {
    lcd.setCursor(0, 0); lcd.print("      ");
    mySerial.println("AT+CMGS=\"+33xxxxxxxxxx\""); mySerial.println("MISE A L'ARRET ALARME"); mySerial.write(26);
  }
  // FIN M/A

} // END LOOP



// SUITE HORLOGE
String FV2CH(int nombre)
{
  if (nombre < 10)
    return "0" + String(nombre);
  else
    return String(nombre);
}
// SUITE 74HC165
byte shiftInMSBFirst(byte dataPin, byte clockPin)
{
  byte value = 0;
  for (byte i = 0; i < 8; ++i)
  {
    value = value | digitalRead(dataPin) << (7 - i);
    digitalWrite(clockPin, HIGH);
    digitalWrite(clockPin, LOW);
  }
  return value;
}

Les indices des tableaux vont de 0 à n-1 si n est la taille du tableau. Vous ne débordez pas parce que vous avez utilisé < mais vous ne traitez pas le 0

La gestion des activations ne contient pas de traitement anti rebond ni d’attente de fin d’appui. Qu’est-ce qui est connecté au bout des 74HC165?

En ce qui concerne le 0 c'est juste une erreur de ma part.
En ce qui concerne les entrées sur le 74HC165, se sont des contacts secs tel que ILS ou BP.

Vous devriez traquer les changements d'état pour détecter un appui, pas uniquement regarder si la broche est HIGH ou LOW

Merci pour tout, je pense que je vais changer de fonctionnement, comme je n'ai que 6 détections + 2 autoprotections, je pense que je vais m'orienter vers une détection directe sur le UNO avec 6 détections et une seule autoprotection regroupant l'ensemble des 6 entrées ainsi que celle du coffret.
Encore Merci.

Dans ce cas vous pouvez utiliser directement les pins arduino si ce sont des contacts secs avec une simple bibliothèque de boutons

C'est ce que je vais faire avec un petit delai pour l'anti-rebond.
Encore Merci et bonne soirée.

[quote="jsbc24, post:15, topic:1336028"]
avec un petit delai pour l'anti-rebond.
Les bibliothèques pour Les boutons gèrent l’anti rebond pour vous

Il y a du choix…. la bibliothèque Button dans easyRun de @bricoleau ou OneButton de Matthias Hertel ou encore Toggle de @dlloyd (et pleins d’autres)

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.