General

How to use interrupt in Arduino uno ?

userHead Uning Elka 2014-12-29 21:50:07 3807 Views4 Replies
i have project water level for irrigation system. but the program is separate. i want to combine it. i think it will work with interrupt system, but i dont understand it. actually i confused in attach Interrupt, volatile , void loop and pin 2 & 3 for int... somebody help me please ....
and check my coding..
Code: Select all
#include <SoftwareSerial.h>
SoftwareSerial gsmSerial(5,6);  //(rx,tx)

float temp;
int tempPin = A1;


#define FLEX_TOO_HI 400 //limit up
#define FLEX_TOO_LOW 250 //limit down
#define ONBOARD_LED 2 //for pump
#define FLEX_SENSOR 0 //for capacity sensor
int ledpin = 3; 

volatile int update = false;

char inchar;
int SMS_location_number;
const unsigned int MAX_INPUT = 165; // 160 maksimal kirim sms
static unsigned int input_pos = 0;
int bend_value = 0;   //NILAI SENSOR
byte smsON = 0;     //pengunci telepon on
byte smsOFF=0;    //pengunci telepon off
byte bend_state = 0;  // nilai motor
int stat = 0;          //pengunci nilai motor

int pompas=0;
int lock=0;


void setup()
{

Serial.begin(9600);
pinMode(ONBOARD_LED, OUTPUT);
delay(200);
 pinMode(3, OUTPUT); 
 delay(10);                  //10ms delay
gsmSerial.begin(9600);      //baud rate port serial 
delay(10);                  //10ms delay
GSM_Startup();              //GSM diaktifkan
digitalWrite(3, HIGH);
attachInterrupt(1, tc35i, FALLING);
//attachInterrupt(0, pompa, FALLING);


}



void SendWaterAlert(int bend_value, int bend_state){ 
digitalWrite(ONBOARD_LED, bend_state ? HIGH : LOW);}

 void esemes ()
 {
         
    gsmSerial.print("AT+CMGS=089610795984\r"); //coba kirim feedback
    delay(100);
    if ( gsmSerial.read()!= 2,LOW);
    {
    gsmSerial.print ("Motor ON ");
    Serial.println ("Motor ON ");
    gsmSerial.print("\x1A"); //ctrl + z
    delay (5000);}
    if (gsmSerial.read()!= 2,HIGH);
    {
    gsmSerial.print ("Motor OFF ");
    Serial.println ("Motor OFF ");
    gsmSerial.print("\x1A"); //ctrl + z
    delay (5000);
    }
   }


  
void pompa()
{
delay(1000);
bend_value = analogRead(FLEX_SENSOR);
//Serial.print("bend_value=");
//Serial.println(bend_value);
  {
   if (bend_value >= FLEX_TOO_HI)
    {
    stat = 1;
    SendWaterAlert(bend_value, bend_state);
    }
    
   if (bend_value < FLEX_TOO_LOW)
   {
    stat = 0; 
   } 

   if (stat==0 && bend_value <FLEX_TOO_LOW)
    {
    bend_state=1;
    SendWaterAlert(bend_value, bend_state);
    gsmSerial.print ("Motor ON ");
    Serial.println ("Motor ON");
    while(smsON!=1){
    esemes();
    smsON=1;
    smsOFF=0;
    }
    }
    
    if (stat==1){
    bend_state=0;
    SendWaterAlert(bend_value, bend_state);
        gsmSerial.print ("Motor OFF ");
    Serial.println ("Motor OFF ");
    while(smsOFF!=1){
    esemes();
    smsON=0;
    smsOFF=1;
    }
    }
    }
  }
    
  void tc35i()
{
  static char input_line [MAX_INPUT];    //static unsigned int input_pos = 0;
  if (gsmSerial.available () > 0) // 
  {
    while (gsmSerial.available () > 0) 
    {
      char inByte = gsmSerial.read ();
      switch (inByte)
      {

      case '\n':   // end of text
        input_line [input_pos] = 0;  // mengakhiri null byte
        process_data (input_line);//proses input_line 
        input_pos = 0; //reset buffer bos 
        break;
      case '\r':   
        break;
      default:
        if (input_pos < (MAX_INPUT - 1))
          input_line [input_pos++] = inByte;
        break;
      }  
    }  
  }  
}  
//---------------------------- process_data --------------------------------

void process_data (char * data)
{
  if(strstr(data, "smsdelete"))
  {
    delete_All_SMS();
  }

  if(strstr(data, "^SMGO: 2")) //peringatan kalau sim card nya full
  { 
    delete_All_SMS();           // delete all SMS
  }

  if(strstr(data, "+CMTI:"))//sms telah tiba.. sms telah tiba
  {    
    char* copy = data + 12;      // baca posisi sms
    SMS_location_number = (byte) atoi(copy);  // konfersi ascii ke int
    gsmSerial.print("AT+CMGR=");
    gsmSerial.println(SMS_location_number);  
  }                                          

 if(strstr(data, "on"))
  {
    digitalWrite(3, HIGH );    // led nya off
    delay(100);      
    gsmSerial.print("AT+CMGS=089610795984\r"); //coba kirim feedback
    delay(100);
    gsmSerial.print("SELENOID IS ON"); 
    delay(10);
    gsmSerial.print("\x1A"); //ctrl + z
    delay(10);
    delete_one_SMS(); 
  }

  if(strstr(data, "off"))
  {
    digitalWrite(3, LOW);    // led nya off
    delay(100);      
    gsmSerial.print("AT+CMGS=089610795984\r"); //coba kirim feedback
    //gsmSerial.println("AT+CMGS=089652363282\r"); //coba kirim feedback
    delay(100);
    gsmSerial.print("SELENOID IS off"); 
    //gsmSerial.println("LED IS off"); 
    delay(10);
    gsmSerial.print("\x1A"); //ctrl + z
    delay(10);
    delete_one_SMS(); 
  }
   if(strstr(data, "cek suhu"))
  {
      temp = analogRead(tempPin);
    temp = temp * 0.0306;    // led nya off
  
    delay(100);      
    gsmSerial.print("AT+CMGS=089610795984\r"); //coba kirim feedback
    delay(100);
    gsmSerial.print("suhu =");
    gsmSerial.print (temp);
   gsmSerial.print ("*C" );
    delay(10);
    gsmSerial.print("\x1A"); //ctrl + z
    delay(10);
    delete_one_SMS(); 
    
  }

}  //--------------------------- end of process_data ---------------------------

void delete_one_SMS()
{
  Serial.write("deleting SMS ");
  Serial.print("1");
  gsmSerial.print("AT+CMGD=");
  gsmSerial.println("1");
  delay(1000);
}

void delete_All_SMS()
{
  for(int i = 1; i <= 10; i++) {
    gsmSerial.print("AT+CMGD=");
    gsmSerial.println(i);
    Serial.println("deleting SMS ");
    Serial.print(i);
    delay(500);
  }
}

void GSM_Startup()
{
  gsmSerial.print("AT+CMGF=1\r");
  delay(100);
  gsmSerial.print("AT+CNMI=2,1,0,0,1\r");
  delay(100);  
  delete_All_SMS();
}


void loop ()
{
  if (update){
  analogWrite(update, true);
  pompa();
  }
  analogWrite(update, false);

 }
  
void suhu()
{
  temp = analogRead(tempPin);
  temp = temp * 0.0306;
  delay(1000);
  process_data ("cek suhu" );


}


2014-12-30 18:01:49 So the water level measurement keeps working all the time, it only collects water level information. It is not a trigger.
The irrigation system is really controlled by your SMS. It doesn't need any external interruption.
userHeadPic Grey.CC
2014-12-30 16:20:51 for irrigation system i want to control ON or OFF by  SMS.. so if water level automatic working, and i need to control ON irrigation system, i have to interrupt water level.. is it right ? userHeadPic Uning Elka
2014-12-30 05:59:41 Yeah, I think so,
If the trigger is sensor value, it doesn't need interrupt.
userHeadPic Grey.CC
2014-12-29 23:39:52 Before you go down that road, you should ask yourself why you think you need to implement a special interrupt. If the event is triggered by sensor feedback, and appropriate hysteresis is assigned, then one's typical control software will address this accordingly. Irrigation systems have slow time constants so doubt you need to implement special interrupt polling and triggering (above and beyond sensor FB control), but of course I do not know your objectives. Just my 2 cents. Hope this helps... userHeadPic walkabout