Gå til innhold

Styring av Arduino med bruk av SIM900


Anbefalte innlegg

Jeg driver med å lage et program til en Arduino Mega 2560 som skal sende batteri spenning og styre en LED når den mottar en sms melding med ordet:

  • "ditt passord" batt.
  • "ditt passord" LEDON.
  • "ditt passord" LEDOFF.

Denne tekst meldingen gir arduinoen ordre og sende batteri spenningen til han som sendte meldingen.

 

PS! "ditt password", her setter du noe du vil ha slik at andre ikke kan få dataen uten å skrive rett passord først.

F.eks "karma batt".

 

Her er koden så langt jeg har kommet til nå. og Motta SMS fra Arduinoen fungerer fint, å styre arduinoen via sms fungerer ikke.

 

LED er koblet til pin 10 og analog spennings måler for batteri er på pin A0.

 

// http://wiki.epalsite.com/index.php?title=SIM900_Quad-Band_GPRS_shield_with_Micro_SD_card_slot#Purchasing_this_module
 
#include <SoftwareSerial.h>
SoftwareSerial Sim900Serial(2, 3);
char inchar;
int Data = 0;
int DataSIM = 0;
const int BUTTONA = 22;
const int BUTTONB = 23;
const int SIM = 40;      // on current Sim900 card the PWM pin 7 controll the PWRKEY to SIM900 chip
const int BUTTONC = 42;  // Manual set SIM900 ON/OFF button
const int LED = 10;      // LED output, controlled by SMS
boolean lastButtonA = LOW;
boolean lastButtonB = LOW;
boolean lastButtonC = LOW;
boolean currentButtonA = LOW;
boolean currentButtonB = LOW;
boolean currentButtonC = LOW;
 
void setup() {
{
 pinMode (BUTTONA, INPUT);
 pinMode (BUTTONB, INPUT); 
 pinMode (BUTTONC, INPUT);
 pinMode (LED, OUTPUT);
 pinMode (SIM, OUTPUT);
}
 
// Starting up SIM900
  delay(2000); // Delay to give the SIM900 time to power up
  digitalWrite(SIM, HIGH);
  delay(3000);
  digitalWrite(SIM, LOW);
  delay(8000);
 
// SIM900 setup  
  Sim900Serial.begin(115200);               // the GPRS baud rate  
  delay(500);
  Sim900Serial.println("AT+IPR=19200");
  delay(500);
  Sim900Serial.begin(19200);               // the GPRS baud rate  
  delay(1000);  
  Sim900Serial.println("AT+CMGD=1,4"); // delete all SMS
  Serial.begin(115200);               // the Hardware serial rate 
  Serial.println("Please type '1 true 3' to send  SMS"); 
}
 
// Button A
boolean debounce(boolean last)
{
  boolean currenta = digitalRead(BUTTONA);
   if (last != currenta)
   {
     delay(5);
     currenta = digitalRead(BUTTONA);
   }
    return currenta;
}
 
// Button B
boolean debounceb(boolean lastb)
{
  boolean currentb = digitalRead(BUTTONB);
   if (lastb != currentb)
   {
     delay(5);
     currentb = digitalRead(BUTTONB);
   }
    return currentb;
}
 
// Button C - ON/OFF
boolean debouncec(boolean lastc)
{
  boolean currentc = digitalRead(BUTTONC);
   if (lastc != currentc)
   {
     delay(5);
     currentc = digitalRead(BUTTONC);
   }
    return currentc;
}
 
void loop()
{
  
  Data=Serial.read();
 
// SMS code nr 1  
  if (Data==0x31)                
  {
       SendTextMessage1();
  }
  currentButtonA = debounce(lastButtonA);
   if (lastButtonA == LOW && currentButtonA == HIGH)
   {
     SendTextMessage1();
   }
   lastButtonA = currentButtonA;
   
// SMS code nr 2
  if (Data==0x32)                
  {
       SendTextMessage2();
  }
  currentButtonB = debounceb(lastButtonB);
   if (lastButtonB == LOW && currentButtonB == HIGH)
   {
     SendTextMessage2();
   }
   lastButtonB = currentButtonB;
 
// SMS code nr 3
  if (Data==0x33)                
  {
       SendTextMessage3();
  }
 
// SIM ON/OFF BUTTON
  currentButtonC = debouncec(lastButtonC);
   if (lastButtonC == LOW && currentButtonC == HIGH)
   {
     digitalWrite (SIM, HIGH);
     delay(3000);
     digitalWrite (SIM, LOW);
   }
   lastButtonC = currentButtonC;
 
   if (Sim900Serial.available())
    Serial.write(Sim900Serial.read());
 
 
 
}
void SendTextMessage1()
{
  Sim900Serial.print("AT+CMGF=1\r");    //Sending the SMS in text mode
  delay(100);
  Sim900Serial.println("AT + CMGS = \"********\"");//The target phone number
  delay(100);
  Sim900Serial.println("Hallo,1");//the content of the message
  delay(100);
  Sim900Serial.println((char)26);//the ASCII code of the ctrl+z is 26
  delay(100);
  Sim900Serial.println();
}
 
void SendTextMessage2()
{
int sensor1 = analogRead(A0);  
float power = sensor1 * (5 / 1023.0) * 2;   
  
  Sim900Serial.print("AT+CMGF=1\r");    //Sending the SMS in text mode
  delay(100);
  Sim900Serial.println("AT + CMGS = \"********\"");//The target phone number
  delay(100);
  Sim900Serial.print("Dette er en automatisk melding. ");
  Sim900Serial.println("Batteri spenningen er lav.");
  Sim900Serial.print("Battery spenning: ");
  Sim900Serial.print(power, 2);
  Sim900Serial.println(" Vdc");
  delay(100);
  Sim900Serial.println((char)26);//the ASCII code of the ctrl+z is 26
  delay(100);
  Sim900Serial.println();
}
 
void SendTextMessage3()
{
  Sim900Serial.print("AT+CMGF=1\r");    //Sending the SMS in text mode
  delay(100);
  Sim900Serial.println("AT + CMGS = \"********\"");//The target phone number
  delay(100);
  Sim900Serial.println("Hallo,3");//the content of the message
  delay(100);
  Sim900Serial.println((char)26);//the ASCII code of the ctrl+z is 26
  delay(100);
  Sim900Serial.println();
}
 
void ReceiveTextMessage1()
{
 // Code here
}
 
void ReceiveTextMessage2()
{
 // Code here
}
 
Endret av Kimlorentz
Lenke til kommentar
Videoannonse
Annonse

Knappene skal bort. De er der bare i test fasen.

Har gjort mye forbedringer på kodingen, men mangler fortsatt send sms ved mottatt sms til samme avsender.

 

Har du noen eksempler på

 

Arduino mottar sms: "passord ledpå"

Arduino sender til avsender viss passord er rett og ordet ledpå ligger etterpå: "Led på"

og slår på LED på pin f.eks 10.

 

Arduino mottar sms: "passord ledav"

Arduino sender til avsender viss passord er rett og ordet ledav ligger etterpå: "Led av"

og slår av LED på samme pinne som ledpå.

Lenke til kommentar

Her er nåværende kode

 

// http://wiki.epalsite.com/index.php?title=SIM900_Quad-Band_GPRS_shield_with_Micro_SD_card_slot#Purchasing_this_module
 
// Code for using Hardware Serial, use 1 true 3, Arduino Mega2560/DUE
#define Sim900Serial Serial1
 
// Code for using Software Serial, pin 2 RX and pin 3 TX
//#include <SoftwareSerial.h>
//SoftwareSerial Sim900Serial(2, 3);
 
boolean LOWVOLT = true;     // Used to stop arduino to send many sms during low voltage levels
char inchar;
int Data = 0;
int DataSIM = 0; 
const int SIM = 40;          // on current Sim900 card the PWM pin 7 controll the PWRKEY to SIM900 chip
const int LED = 10;          // LED output, controlled by SMS
const int LED2 = 9;          // LED output, controlled by SMS
 
 
 
 
void setup() {
{
 pinMode (LED, OUTPUT);
 pinMode (SIM, OUTPUT);
}
 
// Starting up SIM900
  delay(2000); // Delay to give the SIM900 time to power up
  digitalWrite(SIM, HIGH);
  delay(3000);
  digitalWrite(SIM, LOW);
  delay(8000);
 
// SIM900 setup  
  Sim900Serial.begin(115200);               // the GPRS baud rate  
  delay(500);
  Sim900Serial.println("AT+IPR=19200");
  delay(500);
  Sim900Serial.begin(19200);               // the GPRS baud rate  
  delay(1000);  
  Sim900Serial.println("AT+CNMI=2,2,0,0,0\r");
  delay(1000);
  Sim900Serial.println("AT+CMGD=1,4"); // delete all SMS
  Serial.begin(115200);               // the Hardware serial rate 
  Serial.println("Please type '1 true 3' to send  SMS"); 
}
 
void loop()
{
 
  // This line is for debug, // out when not used
  if (Sim900Serial.available() >0)
  Serial.write(Sim900Serial.read());
 
  
  Data=Serial.read();
  
  if (Data==0x31)        // type 1 on serial monitor
  {
       SendTextMessage1();
  }
   
  if (Data==0x32)         // Type 2 on serial monitor 
  {
       SendTextMessage2();
  }
 
  if (Data==0x33)         // Type 3 on serial monitor
  {
       SendTextMessage3();
  }
 
 
////// Battery monitor code //////
int sensor1 = analogRead(A0);  
float power = sensor1 * (5 / 1023.0) * 2;
 
// When battery is lover then 7.00vdc
  if (power <= 7.00) {
    digitalWrite(LED, HIGH);
    if (LOWVOLT)
        SendTextMessage2();
        LOWVOLT = false;    
  }
  else 
  {
    digitalWrite(LED, LOW);
  }
  
// When the battery is above 9.00vdc Set LOWVOLT to True
  if (power >= 9.00)
  {
    if(!LOWVOLT)
        SendTextMessage3();
        LOWVOLT = true;    
  }
////// End of Battery monitor code //////
 
 
}
void SendTextMessage1()
{
  Sim900Serial.print("AT+CMGF=1\r");    //Sending the SMS in text mode
  delay(100);
  Sim900Serial.println("AT + CMGS = \"********\"");//The target phone number
  delay(100);
  Sim900Serial.println("Hallo,1");//the content of the message
  delay(100);
  Sim900Serial.println((char)26);//the ASCII code of the ctrl+z is 26
  delay(100);
  Sim900Serial.println("AT+CMGD=1,4");
}
 
void SendTextMessage2()
{
  Sim900Serial.print("AT+CMGF=1\r");    //Sending the SMS in text mode
  delay(100);
  Sim900Serial.println("AT + CMGS = \"********\"");//The target phone number
  delay(100);
  Sim900Serial.println("Batteri spenningen er lav. Vennligst lad din enhet");
  delay(100);
  Sim900Serial.println((char)26);//the ASCII code of the ctrl+z is 26
  delay(100);
  Sim900Serial.println("AT+CMGD=1,4");
}
 
void SendTextMessage3()
{
  Sim900Serial.print("AT+CMGF=1\r");    //Sending the SMS in text mode
  delay(100);
  Sim900Serial.println("AT + CMGS = \"********\"");//The target phone number
  delay(100);
  Sim900Serial.println("Batteri pakken er ferdig ladet");//the content of the message
  delay(100);
  Sim900Serial.println((char)26);//the ASCII code of the ctrl+z is 26
  delay(100);
  Sim900Serial.println("AT+CMGD=1,4");
}
 
void ReceiveTextMessage1()
{
 digitalWrite (LED, HIGH);
 delay(1000);
 digitalWrite (LED, LOW);
}
 
void ReceiveTextMessage2()
{
 digitalWrite (LED2, HIGH);
 delay(1000);
 digitalWrite (LED2, LOW);
}
 
void ReceiveTextMessage3()
{
 digitalWrite (LED, HIGH);
 delay(1000);
 digitalWrite (LED, LOW);
 delay(1000);
 digitalWrite (LED, HIGH);
 delay(1000);
 digitalWrite (LED, LOW);
}
 
Endret av Kimlorentz
Lenke til kommentar

Her f.eks er en oppgave som skal gjøres.

Hva passer så best, La den stå som den er eller bruk av switch case.

og viss bruk av switch case, hvordan vil det se ut?

 

 
int LOG1 = 100;          // 100 = 1 seconds
int LOG2 = 500;         // 500 = 5 seconds
int count = 0;
int count2 = 0;
const int LED = 10;
const int LED2 = 9;
 
 
void setup()
{
 pinMode (LED, OUTPUT);
 pinMode (LED2, OUTPUT);
 digitalWrite(LED, LOW);
 digitalWrite(LED2, LOW); 
}
 
 
void ledlog()
    {
      digitalWrite(LED, HIGH);
      delay(1000);
      digitalWrite(LED, LOW);
      delay(1000);
      count = 0;
    }
 
void ledlog2()
    {
      digitalWrite(LED2, HIGH);
      delay(1000);
      digitalWrite(LED2, LOW);
      delay(1000);
      count2 = 0;
    }
 
 
/******************** MAIN LOOP ********************************
****************************************************************/
 
void loop()
{
 
if (count >= LOG1)
    {
      ledlog();
    }
    
  count++;
  delay(10);
  
if (count2 >= LOG2)
    {
      ledlog2();
    }
    
  count2++;
  delay(10);
 
}
 
Lenke til kommentar

Ble en del bugs i det programmet jeg lagde, så startet fra en annen vinkel.

Under her ser du så langt jeg har kommet til nå, det er kun gps loggingen som er i drift nå, den har ingen forsinkelse enda men det kommer.

 

Arduinoen er satt opp til å skrive i 2 filer.
Fil nr1 - logfile, den lagrer GGA og RMC raw data.
Fil nr2 - logfileGPS, lagrer spesial oppsett som også passer for bruk til Excel.
Analoge A0 pinnen er Power Voltage er inn spenningen til Arduinoen.
Analog A1 pinnen er Battery Voltage er backup batteriet som er montert inn i GPS modulen.
Filens størrelse på Arduinoen er(Arduino Mega 2560):
8% of program storage space
23% of dynamic storage space
Endret av Kimlorentz
Lenke til kommentar

Hei Kimlorentz,

Jeg har fulgt litt med på tråden her og er interessert i å anskaffe SIM900-modulen.

Er denne å få kjøpt i norge eller skaffet du den via epalsite?

 

Et annet spørsmål: Kan du beskrive bedre hva det er du prøver å oppnå med prosjektet ditt?

Etter det jeg ser av koden du har lagt ut til nå, så varierer det veldig med hvilke komponenter du tar i bruk (GSM/GPRS, spenningsmåler, SD-kort, GPS).

Skal du bruke alle komponentene i prosjektet ditt eller er det bare en måte å teste ut forskjellige teorier/metoder på?

 

Sceptic

Lenke til kommentar

Hei, koden varierer litt nå på grunn av testing.

Jeg tester en og en del av koder og tester noen teorier før jeg setter det sammen til en kode.

 

Prosjektet går ut på GPS tracking av hund, men muligheter til andre oppgaver også.

Spenningsmålingen er for at programmet kan se at spenningen på halsbandet blir for lavt og gir deg beskjed via sms, du kan og spørre etter batteri spenningen via sms.

SD kortet er et alternativ for de som ønsker å bruke halsbandet til tur logging og ikke kun gps tracking av hunden. Den kan og f.eks få i oppgave og logge hundens prosisjon hver time, en gang om dagen osv.

 

Utstyr i bruk nå:

SIM900 skaffet jeg fra ebay - SIM900 GSM

GPS enheten skaffet jeg fra adafruit - Ultimate GPS

SD kort enheten skaffet jeg fra adafruit - MicroSD

Alt er styrt via:

Arduino Mega2560 - Mega2560

eller

Arduino DUE - DUE

 

Jeg valgte disse komponentene på grunn av pris og god levering. Adafruit er ganske rask og veldig hjelpsome så det er vert å ta en titt der.

 

 

Driver fortsatt med tester og for å få litt valg muligheter ser det ut som jeg kommer til å bruke DUE kortet på grunn av multitaskingen.

Skal også endre mye av kodingen som sitter i SRAM til å bli flyttet over til Flash, dette er for å spare plass på SRAM som jeg trenger.

Lenke til kommentar

Kommet veldig langt nå og mye fungerer. Men nå sitter jeg litt fast når det gjelder bruk av counters jeg gjør nok noe feil for jeg får ikke counter systemet til å fungere.

Noen som kan litt om bruk av counters

 

Her er koden - Denne ligger i void loop(); :

if (GPSLOG = true);
  {
   readGPS();
   
    if(GPS.fix==1) { //Only save data if we have a fix
      GPSlog();
      GPSLOG = false;
      count = 0;
    } 
  }
if (count >= GPSLOGDATA) 
  {
   GPSLOG = true; 
  }
count++;

Har følgende oppsett ved oppstart av arduino kortet:

 

GPSLAG = true;

int GPSLOGDATA = 100000;
int count = 0;
Så hva er det jeg bommer på?
Endret av Kimlorentz
Lenke til kommentar

den er bare true første gang for å få GPS i fix. etter det går den i false og så må den vente på count har kommet opp til ønsket nivå før den utfører jobben igjen.

Glemte å sette inn, etter GPSLOG = false i if GPS.fix skal den sende Standby code til GPS modulen.

Og i count >= GPSLOGDATA skal jeg sette inn GPS awake code til GPS enhet og så fortsette med GPSLOG = true

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...