0
votes
#include <SoftwareSerial.h>

SoftwareSerial SIM900(7, 8);

String outMessage1 = "Hello Arduino";
String outMessage2 = "Arduino2";

volatile int NbTopsFan; //measuring the rising edges of the signal
int Calc;                               
int hallsensor = 2;    //The pin location of the sensor
int condition_1 = LOW; 
int condition_2 = LOW;
int gsm_condition_1 = HIGH; 
int gsm_condition_2 = HIGH;
String destinationNumber = "+6014681xxxx";

void rpm ()     //This is the function that the interupt calls 
{ 
    NbTopsFan++;  //This function measures the rising and falling edge of            the hall effect sensors signal
} 
// The setup() method runs once, when the sketch starts
void setup() //
{ 
    Serial.begin(9600); //This is the setup function where the serial port   is initialised,
    SIM900.begin(19200); 
    SIM900power();
    delay(20000);

    pinMode(hallsensor, INPUT); //initializes digital pin 2 as an input
    pinMode(13, OUTPUT);

     attachInterrupt(0, rpm, RISING); //and the interrupt is attached
} 
// the loop() method runs over and over again,
// as long as the Arduino has power

void SIM900power()
{
    digitalWrite(9,HIGH);
    delay(1000);
    digitalWrite(9,LOW);
    delay(5000);
}


void sendSMS1()
{
    gsm_condition_2 = HIGH;
    SIM900.print("AT+CMGF=1\r");    //AT command to send SMS message
    delay(100);
    SIM900.println("AT + CMGS = \"" + destinationNumber +"\"");    //recipient's mobile number, in international format
    delay(100);
    SIM900.println(outMessage1);    //message to send
    delay(100);
    SIM900.println((char)26);   //End AT command with a^Z, ASCII code 26 or  ctrl+z
    delay(100);
}

void sendSMS2()
{
    gsm_condition_1 = HIGH;
    SIM900.print("AT+CMGF=1\r");    //AT command to send SMS message
    delay(100);
    SIM900.println("AT + CMGS = \"" + destinationNumber +"\"");        //recipient's mobile number, in international format
    delay(100);
    SIM900.println(outMessage2);    //message to send
    delay(100);
    SIM900.println((char)26);   //End AT command with a^Z, ASCII code 26 or   ctrl+z
    delay(100);
}


void gsm_check()
{
    if (condition_1 == HIGH && gsm_condition_1 == HIGH) {

        condition_1 = LOW;
        gsm_condition_1 = LOW;
        sendSMS1();
    }
    else if ( condition_2 == HIGH && gsm_condition_2 == HIGH) {
        condition_2 = LOW;
        gsm_condition_2 = LOW;
        sendSMS2();
    }
}

void water_rate()
{
     NbTopsFan = 0;      //Set NbTops to 0 ready for calculations
     sei();            //Enables interrupts
     delay (1000);      //Wait 1 second
     cli();            //Disable interrupts
     Calc = (NbTopsFan * 60 / 7.5); //(Pulse frequency x 60) / 7.5Q, = flow   rate in L/hour 
     Serial.print (Calc, DEC); //Prints the number calculated above
     Serial.print (" L/hour\r\n"); //Prints "L/hour" and returns a  new line
}

void loop ()    
{
    water_rate();

    if ( Calc > 100 ) {
        digitalWrite(13, HIGH);
        condition_1 = HIGH;
    } 
    else {
        digitalWrite(13, LOW);
        condition_2 = HIGH;
    }
    gsm_check();
}

I cannot use water flow rate sensor and GSM(SIM900) together. Once I use both then GSM will not work at all. I have tried a lot of methods to solve it but still not succeeded. Hope you guys can give me some help.

1
Explain your scheme of connections to the Arduino. May be a power issue.bluefog

1 Answers

1
votes

I was having the same problem. The solution is to stop the time 2 interrupt from running to send the message.

The edit of your code:

void sendSMS2()
{
 cli();
   gsm_condition_1 = HIGH;
   SIM900.print("AT+CMGF=1\r");    //AT command to send SMS message
   delay(100);
   SIM900.println("AT + CMGS = \"" + destinationNumber +"\"");           
   delay(100);
   SIM900.println(outMessage2);    //message to send
   delay(100);
   SIM900.println((char)26);   //End AT command with a^Z, ASCII code 26 or     ctrl+z
   delay(100);
   sei();
   }

The problem is that the sensor can only read using the interrupt, but your sim900 will not function when the interrupt is active. So you'll have to temporarily disable the interrupt and then carry on. Also, SIM900.print("AT+CMGF=1\r"); should be in void loop. The last problem is that your sim 900 will not send integer. So you'll have to send it as a string. Please follow this example for that: http://microembarcado.blogspot.com.au/p/wr-bridge-send-sms-with-temperature.html

I sat for about 4 hours to figure it out. Hope this makes things a little simplier for you.