Go Down

Topic: Gestion à distance avec Arduino UNO + quadband Libélium (Read 991 times) previous topic - next topic

casper22

Mar 29, 2012, 07:41 am Last Edit: Mar 29, 2012, 11:27 am by Jean-François Reason: 1
Bonjour à toutes et à tous

Je travaille actuellement sur un projet de gestion d'un système de pompage alimenté par panneau solaire en site isolé

J'aimerais utiliser un Arduino pour envoyer des messages en cas de panne ou de tentative de vol (  eh oui, on m'a piqué le premier système que j'avais installé), mais aussi pour pouvoir le commander à distance par SMS

Voici ci-dessous le code en cours de développement,  et qui fonctionne pour la partie envoi SMS

matériel utilisé: Arduino UNO , logiciel 1.0

comme conseillé sur leur site: ajout d'un condo 220ùF
ajout d'un speaker 8ohm qui aide beaucoup à la mise en route car le modem n'est plus tout à fait passif
Arduino alimenté en 12 V 800 mA  (attention si vous voulez alimenter directement le libélium , si vous inversez le Grnd et le 5V  il explose ( expérience vécue, heureusement j'en avait commandé 2).
fonctionnement impeccable

Par contre, je n'arrive pas à développer la parie commande à distance

Quelqu'un pourrait-il m'aider pour réaliser la partie concernant la lecture du SMS

Je suppose qu'il faut lire le SMS, le mettre en mémoire, en faire quelque chose, et ensuite vider la mémoire

merci d'avance pour votre aide
voici le code
Code: [Select]

//Ce programme consiste en une automatisation d'un système de pompage en site isolé alimenté par un panneau solaire
//réalisation:   version 27mars 2012






unsigned long  start1 ,fin1 ,start2 ,fin2 ,tempo1 ,tempoS1, tempo2 ,tempoS2 ,compt ;
long previousMillis = 0;
int analogPin11 = 11;
int analogPin12 = 12;
const int relais = 9;
const int LEDR = 8;





////////////////
//partie gestion SMS
//////////////////
int led = 13;
int onModulePin = 2;        // the pin to switch on the module (without press on button)

int timesToSend = 2;        // Numbers of SMS to send
int count = 0;


char phone_number[]="**********";  // ********* Numero à réaliser pour envoi SMS

void switchModule()
{
   digitalWrite(onModulePin,HIGH);
   digitalWrite(8,HIGH);   // ledR
   delay(2000);
   digitalWrite(onModulePin,LOW);
  digitalWrite(8,LOW);   // ledR
}
////////////////////////////////////////////////
//////////////////////////////////////////////////
void setup()
{
 Serial.begin(9600);
 pinMode(11,INPUT);
 pinMode(12,INPUT);
 pinMode(9,OUTPUT);
 pinMode(8,OUTPUT);
 pinMode(led, OUTPUT);
 pinMode(onModulePin, OUTPUT);
 switchModule();                    // switches the module ON
 
 for (int i=0;i< 5;i++){
       delay(5000);
   }

   Serial.println("AT+CMGF=1");         // sets the SMS mode to text
   delay(100);
}
////////////////////////////////
///////////////////////////////

void displayResult1()//affichage de la tempo en secondes
{
 tempo1=fin1-start1;
 tempoS1=tempo1/1000;
}
void displayResult2()//affichage de la tempo en secondes
{
 tempo2=start2;
 tempoS2=tempo2/1000;
}

void loop()
{    
 delay(1000); // temps d'attente
 int FLOTTEURNB = digitalRead(11);
 int BP1 = digitalRead(12);

 int LEDR = digitalRead(8);
 int relais= digitalRead(9);

 Serial.print("\ttempoS1\t ");
 Serial.print(tempoS1);
 Serial.print("\tcount\t ");
 Serial.print(count);

 Serial.print("\tFLOTTEURNB:\t");
 Serial.print(FLOTTEURNB);
 Serial.print("\tBP1:\t");
 Serial.print(BP1);
 Serial.print("\trelais:\t");
 Serial.println(relais);

 ///////////////////////////////
 //gestion tempo 1
 //////////////////////////////
 if (digitalRead(11)==LOW)
 {
   start1=millis();
   delay(200); // for debounce
 }
 if (digitalRead(11)==HIGH)
 {
   fin1=millis();
   delay(200); // for debounce
   displayResult1();
 }
 ////////////////////////////
 //fin gestion tempo1
 ////////////////////////////

 ///////////////////////////////
 //gestion compteur fonctionnement de la pompe
 //////////////////////////////

 if (relais==HIGH)
 {
   start2=millis();
   delay(200); // for debounce
   tempoS2 = compt;
   displayResult2();
   
 }
 //if (relais==LOW)
 
   //fin2=millis();
   //delay(200); // for debounce
  // displayResult2();
 
 ////////////////////////////
 //fin gestion tempo2
 ////////////////////////////



 if (tempoS1 > 5&FLOTTEURNB==1)//temps d'attente de NH + flotteur en niv bas
 {
   digitalWrite(9,HIGH);   // relais pompe
   delay(100); // for debounce
 }
 else
 {
   digitalWrite(9,LOW);   // relais pompe

 }
 if (tempoS2 > 10)//comptage de temps de pompage
 {
   digitalWrite(8,HIGH);   // ledR
   digitalWrite(13,HIGH);   // led13
   delay(100); // for debounce
 }
 else
 {
   digitalWrite(8,LOW);   // led13digitalWrite(10,HIGH);   // ledR
   digitalWrite(13,LOW);   // led13
   //delay(1000); // for debounce
 }
 /////////////////////////////
 //envois SMS
 ////////////////////
 if (tempoS1 > 15 & count<timesToSend)//temps d'attente avant envoi alarme de temps niveau bas trop long
     {
       delay(500);
       Serial.print("AT+CMGS=\""); // send the SMS number
       Serial.print(phone_number);
Serial.println("\"");
       delay(1500);      
       Serial.print("alarme niveau bas trop long");     // message à envoyer
       delay(500);
       Serial.write(0x1A);       //sends ++
       Serial.write(0x0D);
       Serial.write(0x0A);
       count++;
     }
           if (digitalRead(12)==1)
   
           count=0;  

}        










barbudor

Tu utilises la même liaison série pour afficher des traces sur le PC et pour communiquer avec le module ?

Si c'est le cas, tu arrive a envoyer des commandes au module en même temps qu'au terminal série du PC.
par contre dans l'autre sens il y a conflit entre la liaison série venant du PC et celle venant du module.

Pour ce qui est de lire les SMS, il y a normalement des commandes AT mais il faut que tu puisse recevoir les réponses.

Donc si je ne me suis pas trompé ci-dessus, il fa falloir que tu utilises une autre liaison série pour communiquer avec le module.
Comme l'Arduino n'a qu'un seul port série hardwaure, il faut utiliser une lib de port série software.
Par exemple:  SoftwareSerial

Après la doc du module devrait te donner les codes AT pour recupérer les SMS.
C'est quel module que tu utilises exactement ?

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

casper22

Bonjour Barbudor

Je suis heureux  d'avoir une réaction, car je me sentais une peu abandonné

pour répondre à ta première question , oui j'utilise le même port série , et bizarrement, cela fonctionne

il faut noter que le système est destiné à travailler en Standalone, donc sans le PC , sauf durant le développement

d'autre part, quand j'appelle le module , je reçois bien la trace sur mon PC " Ring voice", donc je devrais aussi voir l'arrivée d'un message

J'utilise le module GSM GPRS  Quadband de Libélium, et les commandes AT sont disponibles dans la documentation

j'ai aussi trouver un superbe projet ci-dessous, mais il à été réalisé avec une version antérieure, et je n'arrive pas à le compiler en 1.0. Apparemment,certaines commandes ont changés

http://www.casanogaldelasbrujas.com/blog/2010/07/20/sms-generator-control-with-arduino/

Il utilise la commande "serial.avialble pour lire ce qui est sur le port série , mais il faudrait approfondir

je vais aussi approfondir l'histoire du second port série

Encore merci de ton aide





barbudor

Ton histoire de câblage m'inquiète.
Tu pourrais faire un petit croquis pour que je comprenne quel TX est relié à quel RX et vice-versa ?

Tiens, un peu de google et je trouve çà:

C'est çà ton module : http://www.cooking-hacks.com/index.php/arduino-gprs-module.html
Ils ont un tuto ici : http://www.cooking-hacks.com/index.php/documentation/tutorials/arduino-gprs-quadband
Et çà sur leur forum : http://www.cooking-hacks.com/forum/viewtopic.php?f=29&t=552&start=0

Tu avais déjà ces liens ?

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

casper22

#4
Apr 04, 2012, 03:07 pm Last Edit: Apr 04, 2012, 07:23 pm by Jean-François Reason: 1
Salut

En effet, c'est bien ce module là de chez Libélium et j'ai utilisé leur Tuto pour l'installation ( je l'ai d'ailleurs acheté chez eux car introuvable en Belgique et le  service à été  impeccable)

par contre leur programme pour envoi de SMS est basé sur un version 0022 alors que je travaille sur 1.0
Au final , j'ai été cherche le programme de leur nouveau modèle http://www.cooking-hacks.com/index.php/3g-gprs-shield-for-arduino-3g-gps.html], et ça fonctionne très bien

au niveau câblage , pas grand chose à dire
Le brochage est tout fait en plaçant le modem sur l'Arduino   TX et RX sur les broches 0 et 1 de l'Arduino UNO et la broche 2 pour l'activer
utilisation du port USB de la UNO vers mon PC

Voici ci dessous le programme que j'ai bidoullé , mais ne fonctionne toujours pas pour lire les SMS
Apparamment, les commandes AT genre Serial.println("AT+CMGL=REC UNREAD");doivent être intégrées dans le début du programme ( avant le setup) ce qui paraît bizarre , vu qu'on n'est pas dans la boucle

j'ai fait un essai avec la commande AT  et j'ai OK en retour sur mon port série   ou même la commande AT+CCLK? , et j'ai la date et l'heure en retour

Code: [Select]


#include <SoftwareSerial.h>

SoftwareSerial mySerial(12, 13); // RX, TX

unsigned long  start1 ,fin1 ,start2 ,fin2 ,tempo1 ,tempoS1, tempo2 ,tempoS2 ,compt ;
long previousMillis = 0;
int analogPin10 = 10;
int analogPin11 = 11;
const int relais = 9;
const int LEDR = 8;

////////////////
//partie gestion SMS
//////////////////

int onModulePin = 2;        // the pin to switch on the module (without press on button)

int timesToSend = 2;        // Numbers of SMS to send
int count = 0;


char phone_number[]="+32496573695";  // ********* Numero à réaliser pour envoi SMS

void switchModule()
{
   digitalWrite(onModulePin,HIGH);
   digitalWrite(8,HIGH);   // ledR
   delay(2000);
   digitalWrite(onModulePin,LOW);
  digitalWrite(8,LOW);   // ledR
}

////////////////////////////////////////////////
//////////////////////////////////////////////////
void setup()
{
 Serial.begin(9600);
 pinMode(10,INPUT);
 pinMode(11,INPUT);
 pinMode(9,OUTPUT);
 pinMode(8,OUTPUT);
 pinMode(onModulePin, OUTPUT);
 switchModule();                    // switches the module ON
 
 for (int i=0;i< 5;i++)
 Serial.print("AT+CMGF=1");         // sets the SMS mode to text
 delay(100);
   
}
////////////////////////////////
///////////////////////////////

void displayResult1()//affichage de la tempo en secondes
{
 tempo1=fin1-start1;
 tempoS1=tempo1/1000;
}
void displayResult2()//affichage de la tempo en secondes
{
 tempo2=start2;
 tempoS2=tempo2/1000;
}

void loop()
{
 delay(5000); // temps d'attente
 int FLOTTEURNB = digitalRead(10);
 int BP1 = digitalRead(11);

 int LEDR = digitalRead(8);
 int relais= digitalRead(9);

 //Serial.print("\ttempoS1\t ");
 //Serial.print(tempoS1);
 //Serial.print("\tcount\t ");
 //Serial.print(count);

 //Serial.print("\tFLOTTEURNB:\t");
 //Serial.print(FLOTTEURNB);
 //Serial.print("\tBP1:\t");
 //Serial.print(BP1);
 //Serial.print("\trelais:\t");
 //Serial.println(relais);

 ///////////////////////////////
 //gestion tempo 1
 //////////////////////////////
 if (digitalRead(10)==LOW)
 {
   start1=millis();
   delay(200); // for debounce
 }
 if (digitalRead(10)==HIGH)
 {
   fin1=millis();
   delay(200); // for debounce
   displayResult1();
 }
 ////////////////////////////
 //fin gestion tempo1
 ////////////////////////////

 ///////////////////////////////
 //gestion compteur fonctionnement de la pompe
 //////////////////////////////

 if (relais==HIGH)
 {
   start2=millis();
   delay(200); // for debounce
   tempoS2 = compt;
   displayResult2();
   
 }
 //if (relais==LOW)
 
   //fin2=millis();
   //delay(200); // for debounce
  // displayResult2();
 
 ////////////////////////////
 //fin gestion tempo2
 ////////////////////////////



 if (tempoS1 > 5&FLOTTEURNB==1)//temps d'attente de NH + flotteur en niv bas
 {
   digitalWrite(9,HIGH);   // relais pompe
   delay(100); // for debounce
 }
 else
 {
   digitalWrite(9,LOW);   // relais pompe

 }
 if (tempoS2 > 10)//comptage de temps de pompage
 {
   digitalWrite(8,HIGH);   // ledR
   
   delay(100); // for debounce
 }
 else
 {
   digitalWrite(8,LOW);     // ledR
 
   //delay(1000); // for debounce
 }
 /////////////////////////////
 //envois SMS
 ////////////////////
 if (tempoS1 > 15 & count<timesToSend)//temps d'attente avant envoi alarme de temps niveau bas trop long
     {
       delay(500);
       Serial.print("AT+CMGS=\""); // send the SMS number
       Serial.print(phone_number);
Serial.println("\"");
       delay(1500);      
       Serial.print("alarme niveau bas trop long");     // message à envoyer
       delay(500);
       Serial.write(0x1A);       //sends ++
       Serial.write(0x0D);
       Serial.write(0x0A);
       count++;
     }
           if (digitalRead(11)==1)
   
           count=0;
          {
 if (Serial.available())
  Serial.println("AT+CMGL=REC UNREAD");
 Serial.write(Serial.read());
          }
}        
           
   



Edit de Jean-François : merci de mettre le code entre les balises

Go Up