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

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

Kami persembahkan bacaan di laman NADI Eleczone Solutions ini kepada para pelajar, mahasiswa dan peminat teknologi, demi kepentingan perkembangan ilmu teknologi ilmiah dan amaliah di Malaysia tercinta kita.
Semoga diberkahi dan diredhai Allah Subhanahu wa Ta’ala – Amin!

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

Projek DIY 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 projek DIY 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 projek DIY 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 <<

Kunjungi sekarang kedai Arduino Pulau Pinang di

Nadi Eleczone Solutions
Lot 1667, Tingkat 1, Jalan Teluk Air Tawar, Taman Air Tawar Indah, 13050 Butterworth, Penang
019 – 249 3264

8 ULASAN ULASAN

  1. Salam.. Dimana nak edit coding untuk letak no fon penerima dan modul sim900a tu boleh pakai 5v dari arduinon atau kena another supply.. Kalau kena berpa supply yg diperlukan.. Tq

    • Jika tuan membaca dengan teliti di bahagian tutorial yang sebelum ini, tuan akan mendapati yang tiada keperluan untuk meletakkan nombor telefon di dalam kod.

      Sama juga untuk pertanyaan 5V sim900… Jika tuan membaca dengan teliti tutorial yang sebelumnya, tuan akan mendapati supply 5V sim900 disambungkan pada papan Arduino Uno manakala papan Arduino Uno memerlukan sambungan bekalan kuasa luar.

      Pautan untuk tutorial yang sebelumnya boleh didapati pada baris ayat : Projek DIY ini adalah kesinambungan daripada >> 9 Sensor Gas Membentuk Sistem Pengesan Kebocoran Gas Arduino

        • Di dalam tutorial arduino dan gsm sim900 sahaja, menggunakan kod yang agak asas di mana nombor telefon perlu ditulis di dalam kod arduino itu sendiri.

          Tapi, di dalam projek DIY Sistem Pengesan Kebocoran Gas Arduino Menghantar SMS Amaran, menggunakan kod yang lebih kompleks. Di mana nombor telefon boleh dimasukkan dengan menghantar sms sahaja tanpa perlu memasukkan kod yang baru setiap kali ingin menukar nombor telefon.

    • Apa apa sms sahaja boleh dihantar. Sms kosong pon boleh dihantar ke nombor simkad yang terletak pada sim900 tersebut.

      Konsep nya begini.. Hari ini hari isnin, tuan menghantar apa apa sms menggunakan nombor 012 200 4000 (nombor telefon bimbit tuan sekarang) kepada nombor 019 500 9000 (simkad sim900).

      Sistem sim900 tersebut akan menyimpan 012 200 4000 (nombor telefon bimbit tuan sekarang) ke dalam sistem.

      Nombor 012 200 4000 akan digunakan oleh sistem untuk menghantar mesej amaran.

      Kalau keesokkan harinya nak tukar nombor baru pula, konsep nya begini… Hari esok hari selasa, tuan menghantar apa apa sms menggunakan nombor baru 017 800 7000 (nombor telefon bimbit tuan yang baru) kepada nombor 019 500 9000 (simkad sim900).

      Sistem sim900 tersebut akan menyimpan 017 800 7000 (nombor telefon bimbit tuan yang baru) ke dalam sistem.

      Nombor 017 800 7000 pula akan digunakan oleh sistem untuk menghantar mesej amaran.

      Dalam erti kata lain, nombor yang terakhir menghantar mesej ke simkad sim900 adalah nombor yang akan disimpan di dalam sistem.

TINGGALKAN JAWAPAN BALAS ANDA

Sila masukkan ulasan anda!
Sila masukkan nama anda di sini