Oleh Muhammad Ilyasaa dalam Tutorial Arduino
Tahap Kesukaran : Pertengahan, Mempunyai Asas Arduino

Tutorial ini adalah kesinambungan daripada >> 9 Sensor Gas Membentuk Sistem Pengesan Kebocoran Gas Arduino

>> penambahbaikan – SISTEM akan menghantar amaran melalui sms <<

Tutorial sebelum ini (9 Sensor Gas….) menerangkan bagaimana Sistem Pengesan Kebocoran Gas Arduino dapat dibangunkan. Sistem ini membantu pengguna untuk memantau kebocoran gas dengan lebih berkesan melalui sistem pesanan ringkas SMS. Dengan sistem pengesan kebocoran gas ini, pengguna mempunyai keupayaan untuk memantau status tahap gas di sesuatu tempat. Pembunyi isyarat juga akan berbunyi untuk memberikan amaran apabila gas melebihi tahap yang ditetapkan. Dengan ini, langkah awal dapat diambil dengan membuka pintu untuk membolehkan gas yang bocor dihalakan ke tempat lain.

Gambar menunjukkan papan Arduino Uno dan modul GSM sahaja tanpa sensor gas.

Ringkasnya, pengguna berupaya untuk memperoleh bacaan sensor samaada dengan melihat pada paparan LCD yang ada pada sistem pengesan kebocoran gas atau dengan menghantar SMS kepada sistem. Jika anda pintar atau telah berjaya membina sistem di tutorial yang lepas, anda tentu akan merasakan ada sesuatu yang belum lengkap.

>> 10 saat untuk anda memikirkan apa kelemahan sistem sebelum ini !!! <<

A’haaa, betul tekaan anda. Sistem sebelum ini hanya akan membunyikan pembunyi isyarat apabila salah satu sensor gas melebihi had bacaan yang telah ditetapkan iaitu 200. Tetapi alangkah lebih baik jika ketika pembunyi isyarat itu berbunyi, pada masa yang sama SMS amaran juga dihantar kepada pengguna. Rasanya sistem sebegini lebih diharapkan oleh pengguna. Jom kita naik tarafkan sistem kita. Litar sambungan masih sama seperti tutorial sebelum ini. Hanya kod sahaja yang sedikit berubah atau ditambah baik dan perlu dimuat naik ke papan Arduino Uno.

>> Kod penuh Sistem Pengesan Kebocoran Gas Arduino Menghantar SMS Amaran <<

/* Programmer : Muhammad Ilyasaa Bin Abdul Rahman
 * More info at https://www.nadieleczone.com.my
 */

// Library
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
#include <String.h>

// LCD
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// GSM
SoftwareSerial gsmSerial(2, 3); // RX, TX
char phoneNumber[100];
int stopper1 = 0;
int stopper2 = 0;

// BUZZER
int BUZZER = 13;

// Gas Sensor
int MQ3 = A1;
int MQ9 = A5;
int MQ3value = 0;
int MQ9value = 0;
int alertSent = 0;
int firstSent = 0;

void setup()
{
  // Prepare buzzer
  pinMode(BUZZER, OUTPUT);
  digitalWrite(BUZZER, LOW);

  // Prepare LCD
  lcd.begin(16, 2);
  lcd.setCursor(0,0); lcd.print("                ");
  lcd.setCursor(0,0); lcd.print("Sistem sedang");  
  lcd.setCursor(0,1); lcd.print("                ");
  lcd.setCursor(0,1); lcd.print("dihidupkan....");          

  // Prepare GSM
  gsmSerial.begin(19200);  //Connect to SIM900  
  Serial.begin(9600);    //Connect to computer 
  delay(20000); //20s
  powerOn();
}
 
void loop()
{

  static unsigned long timer = millis();
  static int deciSeconds = 0;
    
  // GSM Read and Sent SMS
  String temp;

  while (gsmSerial.available())
  {
    char c = gsmSerial.read();
    temp.concat(c);
    delay(10);
  }      

  if (temp.startsWith("\r\n+CMT: "))
  {
    stopper1 = 0;
    stopper2 = 0;  
          
    Serial.println("*** RECEIVED SMS ***");
    memset(phoneNumber, '\0', 100);     
    int len = temp.length();
    for(int counter = 0; counter < len; counter++)
    {
      phoneNumber[counter] = temp[counter];
      if( (temp[counter] == '"') && (stopper1 > 0) )
      {
        stopper2 = counter;
        Serial.print("Stopper2 = ");
        Serial.println(stopper2);
        break;
      }          
      if( (temp[counter] == '"') && (stopper1 == 0) ) 
      {
        stopper1 = counter+1;
        Serial.print("Stopper1 = ");
        Serial.println(stopper1);
      }
    } 
        
    for(int counter = stopper1; counter < stopper2; counter++)
    {
      Serial.print(phoneNumber[counter]);
    } 
    Serial.println();
             
    Serial.println("*** END SMS ***");

    sendTextMessage();
    Serial.println("*** SENT SMS ***");
  }

  // Read Gas Sensor
  MQ3value = analogRead(MQ3);
  Serial.print("MQ3, Alcohol, ethanol dan asap = "); Serial.print(MQ3value); Serial.print("\t");
  MQ9value = analogRead(MQ9);
  Serial.print("MQ9, Carbon monoxide dan gas mudah terbakar = "); Serial.print(MQ9value);
  Serial.print("\tStopper1 = "); Serial.print(stopper1);
  Serial.print("\tStopper2 = "); Serial.print(stopper2); 
  Serial.print("\tdeciSeconds = "); Serial.println(deciSeconds);
  
  lcd.setCursor(0,0); lcd.print("                ");
  lcd.setCursor(0,0); lcd.print("MQ3 = "); lcd.print(MQ3value);  
  lcd.setCursor(0,1); lcd.print("                ");
  lcd.setCursor(0,1); lcd.print("MQ9 = "); lcd.print(MQ9value);        

  // Alarm the buzzer
  if( MQ3value > 200 || MQ9value > 200) 
  {
    digitalWrite(BUZZER, HIGH);
    if( alertSent == 0 && stopper1 > 0 && stopper2 > 0 )
    {
      alertSent = 1;
    }    
  }
  else 
  {
    digitalWrite(BUZZER, LOW);
    alertSent = 0;
    firstSent = 0;    
  }

  if(alertSent == 1 && firstSent == 0)
  {    
      Serial.println("Send Alarm");
      firstSent = 1;
      sendAlarm();    
  }
  else if(alertSent == 1 && firstSent == 1)
  {
    if (millis() - timer >= 100) 
    {
      timer += 100;
      deciSeconds++; // 100 milliSeconds is equal to 1 deciSecond
    
      if (deciSeconds == 5000)   // Reset to 0 after counting for 500 seconds.
      { 
        deciSeconds=0;
        Serial.println("Send Alarm");
        sendAlarm();           
      }
    }
  }    
}

void powerOn()  // To check whether GSM is ON or OFF
{
  int answer=0;
    
  while(1)
  {    
    answer = sendATcommand("AT", "OK", 2000);
    Serial.println();
    if (answer == 0)
    {
      lcd.setCursor(0,0); lcd.print("                ");
      lcd.setCursor(0,0); lcd.print("GSM Tak Dapat");  
      lcd.setCursor(0,1); lcd.print("                ");
      lcd.setCursor(0,1); lcd.print("dihidupkan....");           
    }
    else  break;
  }

  gsmSerial.println("AT+CNMI=2,2,0,0,0");
  delay(2000);

  Serial.println("Succesful ON");
  lcd.setCursor(0,0); lcd.print("                ");
  lcd.setCursor(0,0); lcd.print("GSM Berjaya");  
  lcd.setCursor(0,1); lcd.print("                ");
  lcd.setCursor(0,1); lcd.print("dihidupkan....");        
}

void sendTextMessage() // Send SMS to user
{
  gsmSerial.print("AT+CMGF=1\r");    //Because we want to send the SMS in text mode
  delay(500);
  gsmSerial.print("AT+CMGS=\"");
  for(int counter = stopper1; counter < stopper2; counter++)
  {
    gsmSerial.print(phoneNumber[counter]);
  }   
  gsmSerial.println("\"\r");
  delay(500);
  gsmSerial.print("MQ3 Alcohol, ethanol dan asap = "); gsmSerial.print(MQ3value);
  gsmSerial.print(", MQ9 Carbon monoxide dan gas mudah terbakar = "); gsmSerial.println(MQ9value);
  delay(500);
  gsmSerial.println((char)26);//the ASCII code of the ctrl+z is 26
  delay(500);
}

void sendAlarm() // Send SMS to user
{
  gsmSerial.print("AT+CMGF=1\r");    //Because we want to send the SMS in text mode
  delay(500);
  gsmSerial.print("AT+CMGS=\"");
  for(int counter = stopper1; counter < stopper2; counter++)
  {
    gsmSerial.print(phoneNumber[counter]);
  }   
  gsmSerial.println("\"\r");
  delay(500);
  gsmSerial.print("AMARAN BACAAN MELEBIHI PARAS\n MQ3 Alcohol, ethanol dan asap = "); gsmSerial.print(MQ3value);
  gsmSerial.print(", MQ9 Carbon monoxide dan gas mudah terbakar = "); gsmSerial.println(MQ9value);  
  delay(500);
  gsmSerial.println((char)26);//the ASCII code of the ctrl+z is 26
  delay(500);
}

int8_t sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout) // Send command to gsm
{
  int x=0,  answer=0;
  char response[100];
  unsigned long previous;
  memset(response, '\0', 100);
  delay(500);              
    
  while( gsmSerial.available() > 0) gsmSerial.read();    // Clean the input buffer
  gsmSerial.println(ATcommand);
  Serial.println(ATcommand); 
    
  x = 0;
  previous = millis();
  do  // this loop waits for the answer
  {
    // if there are data in the UART input buffer, reads it and checks for the asnwer
    if(gsmSerial.available() != 0)
    {    
      response[x] = gsmSerial.read();
      Serial.write(response[x]); 
      x++;
      // check if the desired answer is in the response of the module
      if (strstr(response, expected_answer) != NULL)    
      {
        answer = 1;
        Serial.println(); 
        for( int count = 0; count < x ; count++)
        {
          Serial.write(response[count]); 
        }
      }
    }
  // Waits for the asnwer with time out
  }while((answer == 0) && ((millis() - previous) < timeout));    
  return answer;
}

>> Amaran yang berulang ulang kali <<

Selepas muat naik kod di atas ke papan Arduino Uno, anda perlu terlebih dahulu menghantar SMS pertama untuk mendapatkan status bacaan sensor gas. Program yang telah dimasukkan ke papan Arduino Uno akan mengekstrak nombor telefon pengguna dari SMS yang diterima. Selepas itu jika bacaan sensor melebihi had bacaan sensor gas, pengguna akan menerima mesej amaran daripada sistem pengesan kebocoran gas arduino. Jika bacaan sensor gas terus melebihi had, sistem akan menghantar SMS amaran kepada pengguna setiap 8 minit sekali sehinggalah bacaan turun menjadi selamat..

>> Selamat mencuba <<

TINGGALKAN JAWAPAN BALAS ANDA

Sila masukkan ulasan anda!
Sila masukkan nama anda di sini