Go Down

Topic: envoi réception SMS sur port serie (Read 408 times) previous topic - next topic

nexen

Bonjour,

je souhaite réaliser une passerelle série/sms avec un arduino uno et un shield gsm900 de chez keystudio, je m'explique, mon souhait est "simplement" de transmettre et recevoir des commandes via SMS sur le voie série.
J'arrive a recevoir les sms et les afficher dans le moniteur série, mais je bloque pour l'inverse, c'est a dire entrer un commande dans la console série et la recevoir en un seul sms sur mon téléphone.
Autre petit souci, les sms se stockent sur la carte sim et cette derniere a une capacité limitée, j'aimerai donc pouvoir, de façon automatique, faire un "flush" de messages.

Voici mon code afin que vous puissiez m'aider.

Code: [Select]
#include "SIM900.h"
#include "sms.h"



SMSGSM sms;

int numdata;
long int SMS;
boolean started=false;
char smsbuffer[160];
char n[20];
char sms_position;
char phone_number[20];
char sms_text[100];
int i;



void setup()
{
 
    Serial.begin(9600);
    pinMode(9, OUTPUT);
    digitalWrite(9, HIGH);
    delay(2000);
    digitalWrite(9, LOW);
    Serial.println("boot serveur gsm");
   
    if (gsm.begin(9600))
    {
        Serial.println("\nstatus=READY");
        started=true;
    }
    else
        Serial.println("\nstatus=IDLE");

    if(started)
    {
        if (sms.SendSMS("+336XXXXXXXX", "pret"))
        {
          Serial.println("\nSMS sent OK.");
        }
        else
        {
          Serial.println("\nError sending SMS.");
        }     
    }
};

void loop()
{
    if(started)
    {
        sms_position=sms.IsSMSPresent(SMS_UNREAD);
        if (sms_position)
        {
            sms.GetSMS(sms_position, phone_number, sms_text, 100);
            if (strcmp (phone_number, "+336XXXXXXXXX") == 0) //filtre la reception de mon numero
           
            {
              Serial.print("SMS postion:");
              Serial.println(sms_position,DEC);
              SMS = atol(sms_text);
              Serial.println(sms_text);
             
            }
         }
      }

 
             
        delay(2000);
       
       }



Par avance merci.

Zet67

Code: [Select]


float temp;
int tempPin = A0;
int tempMin = 5;   
int tempMax = 10;   
int GateSpeed = 0;
int delta_t;

#define Gate 10

void setup () {
 
  pinMode(Gate, OUTPUT);

  digitalWrite(Gate, LOW);
  pinMode(tempPin, INPUT);
  Serial.begin(9600);
 
}

void loop() {


  temp = analogRead(tempPin);
  temp = (temp *5.0*100.0)/1024.0;
  Serial.println(temp);
  delay(1000);       


if(temp < tempMin) { 
      GateSpeed = 0;     
      digitalWrite(Gate, LOW);
   
}


 else if((temp > tempMin) && (temp < tempMax)){
   //GateSpeed = 32;
   //digitalWrite(Gate, HIGH);
   delta_t = tempMax - tempMin;
     GateSpeed = round(255*temp/delta_t);
     analogWrite(Gate, GateSpeed);
     
      Serial.println(GateSpeed);
     
 }

else {
   GateSpeed = 255;
   digitalWrite(Gate, HIGH);
 }

}





nexen

@Zet67

heuuuu, es-tu certain que ce code est pour moi ???

nexen

Bon, j'ai résolu une petite partie de mon problème, celui de supprimer les sms de la mémoire SIM avec la commande  "sms.DeleteSMS(1);" bon j'ai fais 5 lignes ( en changeant le numéro entre parenthèses) pour supprimer les 5 premiers sms, ce qui doit bien suffire puisque c'est a chaque récéption d'un sms que cela se fait.

reste le partie serial --> send sms, et la je sèche .

une âme charitable ??

supercc

Bonjour,

si j'ai bien compris tu cherches à faire ce pseudo code :

Code: [Select]

loop() {
   if(smsDisponible() {
      sms=recupererSms();
      Serial.println(sms);
   }

   if(ligneDisponibleSurLePortSérie()) {
      clearSimSms();
      ligne=ligneDuPortSerie();
      envoyerSms(ligne);
   }
}



Et tu as tout sauf ligneDisponibleSurLePortSérie(), c'est ça ?

nexen

oui c'est cela mais le souci est sur le type de message, j'ai réussi pendant mes tests a envoyer ce qui etait lu sur le port serie mais lettre par lettre, ce qui est tout de même fort peu pratique. de plus, lorsque j'essaie de faire des conversions de type (var, char, int, ...) j'ai des erreurs a la compilation.


cordialement.

supercc

#6
May 25, 2019, 01:29 pm Last Edit: May 25, 2019, 01:35 pm by supercc
Ok, alors regardes peut-être cette solution :
https://forum.arduino.cc/index.php?topic=528447.msg3602531#msg3602531

L'idée est de lire une ligne entière puis de la décoder puis l'envoyer au SMS après, c'est en général plus simple que d'avoir à lire les caractères 1 par 1 et de les traiter individuellement.

Donnes nous peut-être un exemple de ligne récupérée sur le port série et un exemple de chaînes de caractères qui doit être envoyée à la fonction sms pour voir si le passage de l'un à l'autre est compliqué.

PS : je n'ai jamais joué avec des sms émis (indirectement) par l'arduino...


nexen

Je vais essayé d'effectuer quelques tests avec le lien fourni voir si c'est applicable a mes besoins.


Je vais être un peu plus explicite, mon but est de realiser une interface de communication sms avec un raspberry pi (avec node-red) afin de pouvoir envoyer des commandes par sms et de recevoir des infos du systeme, genre lors de l'activation du mode "alarme", recevoir un sms me prevenant qu'une fenetre est restée ouverte, donc les messages envoyés seront du genre "fenêtre de la cuisine ouverte".

le fait de communiquer via un arduino sur le port série est un choix.


merci de ton aide.

supercc

#8
May 25, 2019, 02:11 pm Last Edit: May 25, 2019, 02:30 pm by supercc
Pour que la solution que je te propose fonctionne je pense qu'il faut juste que ton application (je ne connais pas Node-Red) sépare les messages par un caractère délimiteur précis (retour à la ligne ('\n') comme dans l'exemple ou autre).

Edit : en fait ce n'est même pas nécessaire puisque readBytesUntil utilise un timeout. Il faut juste que tes messages n'arrive pas à une cadence supérieure à la seconde (valeur par défaut qui peut être changée par setTimeout).

nexen

pour l'instant mettons de coté node-red, ce n'est pas pertinent pour le moment.

bon, j'ai essayé d'intégrer une partie de ce qui est proposé dans ton lien, sans succès, lorsque je rentre un mot dans la console serie, ça m'écrit la même chose mais caractère aprés caractère avec un saut de ligne a chaque fois, de plus, je reçois autant de sms que de lettre et ce sont des messages vides et/ou avec point d'interrogation.

il n'existe donc aucun moyen simple de transmettre un chaine de caractères telle qu'elle est entrée sur la voie série ??

supercc

Je pense que pour la réception non bloquante (puisque tu veux également surveiller la réception de SMS) d'une ligne il n'y a pas plus simple que ce que je te propose mais je peux me tromper.

Si tu veux, simplifie temporairement ton code pour ne garder que la partie série puis poste le.

supercc

#11
May 25, 2019, 03:18 pm Last Edit: May 25, 2019, 03:25 pm by supercc
Pour illustrer l'exemple, avec le moniteur série, le code suivant affiche hello toutes les secondes, mais si on tape une ligne il la capte et l'affiche aussi. Au passage on peut voir l'effet du timeout évoqué plus haut si la ligne est émise sans retour à la ligne.
 

Code: [Select]

void setup() {
    Serial.begin(9600);
    while (!Serial);
}

void loop() {
    char buffer[17];
    int size;

    Serial.println("Hello");

    size = Serial.readBytesUntil('\n', buffer, 16);
    buffer[size]=0;   
    if(size) Serial.println((String)"LU :"+buffer);

    delay(1000);
}

Go Up