grzegorzch

SIM900

Jan 25th, 2015
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.86 KB | None | 0 0
  1. #include <SoftwareSerial.h>
  2. #include <Event.h>
  3. #include <Timer.h>
  4. #include <avr/pgmspace.h>
  5.  
  6. Timer t;
  7. int EVENT_LED;
  8. int EVENT_SEND_AT;
  9.  
  10. enum
  11. {
  12.    CMD_SIM900_NONE,
  13.    CMD_SIM900_START,
  14.    CMD_SIM900_SENDSMS
  15. };
  16.  
  17. SoftwareSerial SIM900(7, 8);
  18. byte resultbyte;
  19. bool isSIM900on = false;
  20. bool isSIM900starting = false;
  21. byte SIM900_sendCMD = CMD_SIM900_NONE;
  22.  
  23. const char respond[] PROGMEM = {'O', 'K', 13, 10};
  24. byte respID = 0;
  25.  
  26. #define PIN_SIM900_ONOFF 9
  27. #define PIN_LED 2
  28.  
  29. void setup()
  30. {
  31.   Serial.begin(9600);
  32.  
  33.   pinMode(PIN_SIM900_ONOFF, OUTPUT);
  34.   digitalWrite(PIN_SIM900_ONOFF, LOW);
  35.  
  36.   pinMode(PIN_LED, OUTPUT);
  37.   digitalWrite(PIN_LED, LOW);
  38.  
  39.   SIM900powerON();
  40. }
  41.  
  42. void SIM900powerON()
  43. {
  44.   digitalWrite(PIN_SIM900_ONOFF, HIGH);
  45.   t.after(2000, SIM900power2);
  46.   EVENT_LED = t.oscillate(PIN_LED, 300, HIGH);
  47.   EVENT_SEND_AT = t.after(20000L, SIM900startingSendAT);
  48.   isSIM900starting = true;
  49. }
  50.  
  51. void SIM900powerOFF()
  52. {
  53.   if(isSIM900starting)
  54.   {
  55.     t.stop(EVENT_LED);
  56.     t.stop(EVENT_SEND_AT);
  57.     isSIM900starting = false;
  58.   }
  59.   digitalWrite(PIN_SIM900_ONOFF, HIGH);
  60.   t.after(2000, SIM900power2);
  61.   isSIM900on = false;
  62.   digitalWrite(PIN_LED, LOW);
  63.   SIM900.end();
  64. }
  65.  
  66. void SIM900power2()
  67. {
  68.   digitalWrite(PIN_SIM900_ONOFF, LOW);
  69. }
  70.  
  71. void SIM900startingSendAT()
  72. {
  73.   SIM900.begin(19200);
  74.   delay(100);
  75.   SIM900_sendCMD = CMD_SIM900_START;
  76.   SIM900.print(F("AT\r"));
  77. }
  78.  
  79. void SIM900started()
  80. {
  81.   isSIM900on = true;
  82.   isSIM900starting = false;
  83.   t.stop(EVENT_LED);
  84.   digitalWrite(PIN_LED, HIGH);
  85. }
  86.  
  87. void SIM900sendSMS(int state)
  88. {
  89.   SIM900.print(F("AT+CMGF=1\r"));
  90.   delay(100);
  91.   SIM900.println(F("AT+CMGS=\"501239XXX\""));
  92.   delay(100);
  93.   if(state == 1) SIM900.println(F("AKTYWACJA ALARMU"));
  94.   else SIM900.println(F("DEAKTYWACJA ALARMU"));
  95.   delay(100);
  96.   SIM900.println((char)26);
  97.   delay(100);
  98.   SIM900_sendCMD = CMD_SIM900_SENDSMS;
  99.   SIM900.println();
  100. }
  101.  
  102. void loop()
  103. {
  104.   t.update();
  105.   while(SIM900.available())
  106.   {
  107.     resultbyte = SIM900.read();
  108.     if((resultbyte != 0) && (resultbyte != 0xFF))
  109.     {
  110.       if(SIM900_sendCMD != CMD_SIM900_NONE)
  111.       {
  112.         if(resultbyte == pgm_read_byte(&respond[respID])) respID++;
  113.         else respID = 0;
  114.         if(respID == 4)
  115.         {
  116.           if(isSIM900starting)
  117.           {
  118.             SIM900started();
  119.           }
  120.           else if(SIM900_sendCMD == CMD_SIM900_SENDSMS)
  121.           {
  122.             Serial.println(F("SMS wyslany"));
  123.           }
  124.           SIM900_sendCMD = CMD_SIM900_NONE;
  125.         }
  126.       }
  127.     }
  128.   }
  129.   while(Serial.available())
  130.   {
  131.     resultbyte = Serial.read();
  132.     if(resultbyte == 'c')
  133.     {
  134.       SIM900powerOFF();
  135.     }
  136.     else if(resultbyte == 'o')
  137.     {
  138.       SIM900powerON();
  139.     }
  140.     else if(resultbyte == 's')
  141.     {
  142.       Serial.println(F("wysylanie SMS..."));
  143.       SIM900sendSMS(1);
  144.     }
  145.   }
  146.  
  147. }
Advertisement
Add Comment
Please, Sign In to add comment