Go Down

Topic: Fernsteuerung per SMS (Read 11959 times) previous topic - next topic


Meine Idee ist per SMS bestimmte Geräte ein und aus zu schalten. Außerdem soll das möchte ich auch statusmeldungen zurück erhalten. Z.b. Reläs offen oder geschlossen .... so in der art.


Habe in der bucht dieses shield entdeckt.

Hat jemand Erfahrung mit Fernsteuerung per SMS ?

michael_x

Ein hübsches Bild.
Hast du auch einen Link ( evtl. gar auf ein Datenblatt )

Hast du dies schon gesehen ?: http://arduino.cc/en/pmwiki.php?n=Guide/ArduinoGSMShield

Link !

Hast du dies schon gesehen ?: http://arduino.cc/en/pmwiki.php?n=Guide/ArduinoGSMShield
Ja, danke. Bin schon gespannt was alles möglich ist mit dem GSMShield.

Hast Du schon was in dem Bereich gemacht?


michael_x

Na, das sieht doch vielversprechend aus. Erste Schritte, SMS empfangen, SMS senden: alles beschrieben.

Viel Erfolg.

Das gute Stück ist angekommen  :D

Sie ersten versuche: SMS senden - funktioniert schon mal ...

Code: [Select]


#include <SoftwareSerial.h>
SoftwareSerial SIM900(7, 8);

void setup()
{
  SIM900.begin(19200);
  Serial.begin(19200);
  Serial.print(" Start ");
 
  pinMode( 9, OUTPUT ); // software equivalent of pressing the GSM shield "power" button
  digitalWrite(9, HIGH);
  delay(2000);
  digitalWrite(9, LOW);
  Serial.print(" Wait for network ");
  delay(20000);  // give time to log on to network.
}


void sendSMS()
{
  Serial.print(" Send SMS ");
  SIM900.print("AT+CMGF=1\r");                                                        // AT command to send SMS message
  delay(100);
  SIM900.println("AT + CMGS = \"+4612345678\"");                                     // recipient's mobile number, in international format
  delay(100);
  SIM900.println("Arduino Test 3.0");        // message to send
  delay(100);
  SIM900.println((char)26);                       // End AT command with a ^Z, ASCII code 26
  delay(100);
  SIM900.println();
  delay(5000);                                     // give module time to send SMS

}

void loop()
{
  sendSMS();
  do {} while (1);
}





SMS empfangen geht auch schon - mit LED an und aus  :o

Code: [Select]
#include <SoftwareSerial.h>

char inchar; // Will hold the incoming character from the GSM shield
SoftwareSerial SIM900(7, 8);

int led = 10;

void setup()
{
  Serial.begin(19200);
  // set up the digital pins to control
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);

  // wake up the GSM shield
  SIM900.begin(19200);
  pinMode( 9, OUTPUT ); // software equivalent of pressing the GSM shield "power" button
  digitalWrite(9, HIGH);
  delay(2000);
  digitalWrite(9, LOW);
  delay(20000); // give time to log on to network.
  SIM900.print("AT+CMGF=1\r"); // set SMS mode to text
  delay(100);
  SIM900.print("AT+CNMI=2,2,0,0,0\r");
  // blurt out contents of new SMS upon receipt to the GSM shield's serial out
  delay(100);
  Serial.println("Ready...");
}

void loop()
{
  //If a character comes in from the cellular module...
  if(SIM900.available() >0)
  {
    inchar=SIM900.read();
    if (inchar=='#')
    {
      delay(10);

      inchar=SIM900.read();
      if (inchar=='a')
      {
        delay(10);
        inchar=SIM900.read();
        if (inchar=='0')
        {
          digitalWrite(led, LOW);
        }
        else if (inchar=='1')
        {
          digitalWrite(led, HIGH);
        }
        delay(10);
        SIM900.println("AT+CMGD=1,4"); // delete all SMS
      }
    }
  }
}





Hab dann hier was interessantes gefunden Link ! Und hab dann auf dem skript mal aufgebaut.

Code: [Select]

#include <SoftwareSerial.h>
SoftwareSerial SIM900(7, 8);

// EN: String buffer for the GPRS shield message
String msg = String("");
// EN: Set to 1 when the next GPRS shield message will contains the SMS message
int SmsContentFlag = 1;

int relay_a=13;                                     //control pins of relay.
int relay_b=12;
int relay_c=11;
int relay_d=10;

void setup()
{
  SIM900.begin(19200);
  Serial.begin(19200);                               // baud rate
  pinMode( 13, OUTPUT );                              // Initialize  PINs
  pinMode( 12, OUTPUT );
  pinMode( 11, OUTPUT );
  pinMode( 10, OUTPUT );
  digitalWrite( 13, HIGH );
  digitalWrite( 12, LOW );
  digitalWrite( 11, LOW );
  digitalWrite( 10, LOW );

  pinMode(9, OUTPUT);                            // software equivalent of pressing the GSM shield "power" button
  digitalWrite(9,LOW);
  delay(1000);
  digitalWrite(9,HIGH);
  delay(2000);
  digitalWrite(9,LOW);
  delay(3000);

  Serial.print(" Wait for network ");
  Serial.println( "AT+CMGF=1" );
  delay(30000);                                     // give time to log on to network.
 
  Serial.print("send SMS");
  SIM900.print("AT+CMGF=1\r");                      // AT command to send SMS message
  delay(100);
  SIM900.println("AT + CMGS = \"+46123456789\"");   // recipient's mobile number, in international format
  delay(100);
  SIM900.println("Arduino relay onlinev.2");           // message to send
  delay(100);
  SIM900.println((char)26);                         // End AT command with a ^Z, ASCII code 26
  delay(1000);
  Serial.print(" SMS send ");
}

void loop()
{

  char SerialInByte;
   if(Serial.available())
   {      
       SerialInByte = (unsigned char)Serial.read();
      delay(5);
      
       // -------------------------------------------------------------------
       // EN: Program also listen to the GPRS shield message.
       // -------------------------------------------------------------------
      // EN: If the message ends with <CR> then process the message
       if( SerialInByte == 13 ){
         // EN: Store the char into the message buffer
         ProcessGprsMsg();
        }
        if( SerialInByte == 10 ){
           // EN: Skip Line feed
        }
        else {
          // EN: store the current character in the message string buffer
          msg += String(SerialInByte);
        }
    }  
}


// EN: Make action based on the content of the SMS.
//     Notice than SMS content is the result of the processing of several GPRS shield messages.
void ProcessSms( String sms ){
 
 if( sms.indexOf("ona") >= 0 ){
   digitalWrite( relay_a, HIGH );
 }
  if( sms.indexOf("onb") >= 0 ){
   digitalWrite(  relay_b, HIGH );
 }
  if( sms.indexOf("onc") >= 0 ){
   digitalWrite(  relay_c, HIGH );
 }
 if( sms.indexOf("ond") >= 0 ){
   digitalWrite(  relay_d, HIGH );
 }
 if( sms.indexOf("offa") >= 0 ){
   digitalWrite(  relay_a, LOW );
 }
 if( sms.indexOf("offb") >= 0 ){
   digitalWrite(  relay_b, LOW );
 }
 if( sms.indexOf("offc") >= 0 ){
   digitalWrite(  relay_c, LOW );
 }
 if( sms.indexOf("offd") >= 0 ){
   digitalWrite(  relay_d, LOW );
 }
}
// EN: Request Text Mode for SMS messaging
void GprsTextModeSMS(){
 Serial.println( "AT+CMGF=1" );
}

void GprsReadSmsStore( String SmsStorePos ){
 Serial.print( "AT+CMGR=" );
 Serial.println( SmsStorePos );
}

// EN: Clear the GPRS shield message buffer
void ClearGprsMsg(){
 msg = "";
}

// EN: interpret the GPRS shield message and act appropiately
void ProcessGprsMsg() {
 if( msg.indexOf( "Call Ready" ) >= 0 ){
   Serial.print( "*** GPRS Shield registered on Mobile Network ***" );
    GprsTextModeSMS();
 }
 
 // EN: unsolicited message received when getting a SMS message
 if( msg.indexOf( "+CMTI" ) >= 0 ){
 Serial.print( "*** SMS Received ***" );
    // EN: Look for the coma in the full message (+CMTI: "SM",6)
    //     In the sample, the SMS is stored at position 6
    int iPos = msg.indexOf( "," );
    String SmsStorePos = msg.substring( iPos+1 );
 Serial.print( "SMS stored at " );
 Serial.println( SmsStorePos );    
    // EN: Ask to read the SMS store
    GprsReadSmsStore( SmsStorePos );
 }
 
 // EN: SMS store readed through UART (result of GprsReadSmsStore request)  
 if( msg.indexOf( "+CMGR:" ) >= 0 ){
   // EN: Next message will contains the BODY of SMS
   SmsContentFlag = 1;
   // EN: Following lines are essentiel to not clear the flag!
   ClearGprsMsg();
   return;
 }
 
 // EN: +CMGR message just before indicate that the following GRPS Shield message
 //     (this message) will contains the SMS body
 if( SmsContentFlag == 1 ){
  Serial.println( "*** SMS MESSAGE CONTENT ***" );
  Serial.println( msg );
  Serial.println( "*** END OF SMS MESSAGE ***" );
   ProcessSms( msg );
 }
 
 ClearGprsMsg();
 // EN: Always clear the flag
 SmsContentFlag = 0;
}



Der Arduino schickt brav eine Mitteilung das er an ist, aber irgendwie reagiert er nicht auf die SMS die ich schicke.

Im orginal sketch wird pin 4 bis 7 für die relays verwendet und softwareserial auf pin 7 und 8. Das muss sich doch beißen ...



Hab das vorherige Skript komplett verworfen und hab was eigenes gestrickt  :smiley-draw:

So schaut das fertige projekt aus. Das Relay-shield hab ich modifiziert damit die pins passen.



Code: [Select]

// Control of a Ralay shield - Last update: AndreasVan 2015-04-04 Version 1.01   
// Micro controller = Arduino UNO - GSM Shield
// this code is public domain, enjoy!

#include <SoftwareSerial.h>
char inchar;                          //Will hold the incoming character from the Serial Port.
SoftwareSerial SIM900(7,8);           // Software Serial Pin7 is Rx pin, pin 8 is Tx pin.

int relay01 = 10;
int relay02 = 11;
int relay03 = 12;
int relay04 = 13;
int led = 2;

void setup()
{
 
  pinMode(relay01, OUTPUT);              // prepare the digital output pins
  pinMode(relay02, OUTPUT);
  pinMode(relay03, OUTPUT);
  pinMode(relay04, OUTPUT);
  pinMode(led, OUTPUT);                 
  digitalWrite(relay01, LOW);
  digitalWrite(relay02, LOW);
  digitalWrite(relay03, LOW);
  digitalWrite(relay04, LOW);

  pinMode(9, OUTPUT );                  // software equivalent of pressing the GSM shield "power" button
  digitalWrite(9, HIGH);
  delay(2000);
  digitalWrite(9, LOW);
 
  SIM900.begin(19200);                 // Initialize GSM module serial port for communication.
  delay(30000);                        // give time for GSM module to register on network etc.
  SIM900.print("AT+CMGF=1\r");         // set SMS mode to text
  delay(200);
  SIM900.print("AT+CNMI=2,2,0,0,0\r"); // set module to send SMS data to serial out upon receipt
  delay(200);
  digitalWrite(led, HIGH);             // GSM Shield ready
  delay(500);
  digitalWrite(led, LOW);
  delay(500);
  digitalWrite(led, HIGH);
}

void loop()
{
  //If a character comes in from the SIM900ular module...
  if(SIM900.available() >0)
  {
    inchar=SIM900.read();
    if (inchar=='#')
    {
      delay(10);
      inchar=SIM900.read();
      if (inchar=='a')
      {
        delay(10);
        inchar=SIM900.read();
        if (inchar=='0')
        {
          digitalWrite(relay01, LOW);
        }
        else if (inchar=='1')
        {
          digitalWrite(relay01, HIGH);
        }
        delay(10);
        inchar=SIM900.read();
        if (inchar=='b')
        {
          inchar=SIM900.read();
          if (inchar=='0')
          {
            digitalWrite(relay02, LOW);
          }
          else if (inchar=='1')
          {
            digitalWrite(relay02, HIGH);
          }
          delay(10);
          inchar=SIM900.read();
          if (inchar=='c')
          {
            inchar=SIM900.read();
            if (inchar=='0')
            {
              digitalWrite(relay03, LOW);
            }
            else if (inchar=='1')
            {
              digitalWrite(relay03, HIGH);
            }
            delay(10);
            inchar=SIM900.read();
            if (inchar=='d')
            {
              delay(10);
              inchar=SIM900.read();
              if (inchar=='0')
              {
                digitalWrite(relay04, LOW);
              }
              else if (inchar=='1')
              {
                digitalWrite(relay04, HIGH);
              }
              delay(10);
            }
          }
          SIM900.println("AT+CMGD=1,4"); // delete all SMS
        }
      }
    }
  }
}





Chris72622

#9
Apr 04, 2015, 07:41 pm Last Edit: Apr 04, 2015, 07:41 pm by Chris72622
Und funktioniert's auch wie angedacht?  ;)

Gruß Chris
Bilnk wtiohut daley.

nix_mehr_frei

Hallo Andreas,

ich wundere mich, das dein Aufbau so funktioniert am USB Port.
Das GSM Modul kann beim Senden kurzzeitig schon mal Spitzen von 2A ziehen, die USB nicht liefern kann und den Arduino zum Absturz bringt. Zumal die Relais ja auch noch mit dranhängen. Dafür hat das GSM Modul eine eigene Klinkenbuchse zur Stromversorgung und einen eigenen Spannungsregler, rechts vorne unten auf der Platine zu erkennen. Ich habe so ein GSM Board seit über einem Jahr rumliegen, bin aber noch nicht dazu gekommen, damit mal was zu machen. Werde wohl mal ein paar Payback Treuepunkte einlösen und mir zum Spielen eine SIM-Karte schicken lassen  ;)
Angedacht ist ja, das das Ganze mal ein Anti Klau GPS Tracker wird, der per Geo-Fence, nach Hause telefoniert, bzw. SMSt, wenn jemand meine Bienenvölker mitgehen läßt.
rot ist blau und Plus ist Minus


Hallo Andreas,

ich wundere mich, das dein Aufbau so funktioniert am USB Port.
Das GSM Modul kann beim Senden kurzzeitig schon mal Spitzen von 2A ziehen, die USB nicht liefern kann und den Arduino zum Absturz bringt. Zumal die Relais ja auch noch mit dranhängen. Dafür hat das GSM Modul eine eigene Klinkenbuchse zur Stromversorgung und einen eigenen Spannungsregler, rechts vorne unten auf der Platine zu erkennen. Ich habe so ein GSM Board seit über einem Jahr rumliegen, bin aber noch nicht dazu gekommen, damit mal was zu machen. Werde wohl mal ein paar Payback Treuepunkte einlösen und mir zum Spielen eine SIM-Karte schicken lassen  ;)
Angedacht ist ja, das das Ganze mal ein Anti Klau GPS Tracker wird, der per Geo-Fence, nach Hause telefoniert, bzw. SMSt, wenn jemand meine Bienenvölker mitgehen läßt.
Für meine Bienen hab ich mir was fertiges gekauft (30USD) sitzt gut versteckt unterm Trailer.

Hab zum Testbetrieb das ganze an einer USB Batterie, die kann da ab ...


Bei geschalteten Relays liegt die Stromaufnahme bei 200mA.

Später im Wohnwagen wird dann beides Separat mit 12V versorgt.



Jetzt wäre es interessant heraus zu bekommen wie ich den relays status per SMS abfragen kann.
Eine abfrage der Raumtemperatur soll auch noch integriert werden.

Wer kann mir da behilflich sein ?


Go Up