#include "HardwareSerial.h"
#include "string.h"
#include "Arduino.h"
#define numberOfPumps 1 // Number of pumps connected - Always start from pump 1 and increment.
#define cellphoneNumber "004560649717" // The phone to send sms to.
#define debugFlag 0 // This enables debug sms and serial data
#define relayPinStart 39 // Pin number of the digital pin right before first relay pin.
String inputString = ""; // a string to hold incoming data
boolean stringComplete = false; // whether the string is complete
boolean moduleReady = false; // Is GSM module ready?
volatile unsigned int globalCounter = 0; // Global time counter.
volatile unsigned int nextPhase = 1; // Where in the startstop process are we.
// Function for sending SMS.
void sendSMS(char * phone, char * msg) {
// Serial1.println("AT+CMGF=1"); // This line is needed if GSM module is not configured to use text instead of PDU (can be saved to non volatile memory with AT&W command)
// delay(200);
Serial1.flush();
Serial1.print("AT+CMGS=");
Serial1.write(34); // ASCII equivalent of "
Serial1.print(phone); // Use international format: 0045xxxxxxxx with ""
Serial1.write(34); // ASCII equivalent of "
Serial1.write((byte)13);
Serial1.write((byte)10);
#if debugFlag == 1
Serial.print("AT+CMGS=");
Serial.write((byte)34); // ASCII equivalent of "
Serial.print(phone); // Use international format: 0045xxxxxxxx with ""
Serial.write((byte)34); // ASCII equivalent of "
Serial.write((byte)34); // ASCII equivalent of "
Serial.print(phone); // Use international format: 0045xxxxxxxx with ""
Serial.write((byte)34); // ASCII equivalent of "
Serial.println();
#endif
delay(250); // Give the module some thinking time
Serial1.print(msg); // The sms message in ""
Serial1.write((byte)26); // ASCII equivalent of Ctrl-Z, tell the GSM module we finished the message
delay(250);
Serial1.println();
}
// Initializing.
void setup() {
//Initialize serial ports for communication.
Serial.begin(9600);
Serial.println("Hello. Starting up microprocessor.");
delay(1000);
Serial1.begin(9600);
Serial.println("Starting SM5100B Communication!");
noInterrupts(); // Disallow interrupts
//Initialize interrupt for 1ms counter (timer 0 @ 1kHz)
TCCR0A = 0;// Set entire TCCR0A register to 0
TCCR0B = 0;// Same for TCCR0B
TCNT0 = 0;// Start counter value to 0
// set compare match register for 1kHz increments
OCR0A = 250;// = (16*10^6) / (1000*64) - 1 (must be <256) = 250,004
// turn on CTC mode
TCCR0A |= (1 << WGM01);
// Set CS01 and CS00 bits for 64 prescaler
TCCR0B |= (1 << CS01) | (1 << CS00);
// enable timer compare interrupt
// TIMSK0 |= (1 << OCIE0A);
interrupts(); // Allow interrupts
pinMode(13, OUTPUT);
pinMode(40, OUTPUT);
pinMode(41, OUTPUT);
pinMode(42, OUTPUT);
pinMode(43, OUTPUT);
pinMode(44, OUTPUT);
}
// Dont do anything before GSM module is ready routine + Printing GSM module output to RS232 serial.
void GSMcheck() {
if ((stringComplete)) {
if (inputString == "+SIND: 1") {
Serial.println("SIM Found");
}
if (inputString == "+SIND: 11") {
Serial.println("Network found");
}
if (inputString == "+SIND: 4") {
Serial.println("AT module fully ready");
moduleReady = true;
#if debugFlag == 1
delay(100);
sendSMS(cellphoneNumber, "AT module ready. Starting start/stop test.");
#endif
delay(2500);
Serial.println("Starting timer...");
TIMSK0 |= (1 << OCIE0A); // Enable timer compare interrupt
}
Serial.println(inputString);
// Clear the string:
inputString = "";
stringComplete = false;
}
}
// LED blinking when GSM is ready and the timer/counter is running.
void TickTock() {
if (((globalCounter%2000) < 1000) && (moduleReady == true)) {
digitalWrite(13, 1);
} else {
digitalWrite(13, 0);
}
}
// Call function to start/stop X pumps according to correct timing.
void StartStopPumps(int pumpCount) {
static uint32_t startStopCount = 1; // Start stop counter.
int analogBuffer;
if ((nextPhase == 1) && (moduleReady == true)) {
for (int x = 1; x <= pumpCount; x++) {
digitalWrite(relayPinStart+x, HIGH); // Start relay for pump.
Serial.print("Pump #"); // Info
Serial.print(x);
Serial.println(": ON"); // end of info
}
nextPhase = 10; // Change so we dont loop this.
}
if ((nextPhase == 2) && (moduleReady == true)) {
for (int x = 1; x <= pumpCount; x++) {
Serial.println("Measuring start current"); // Info
// Mål ADC --> Over X = OK Under X = FEJL
analogBuffer = analogRead(x-1);
if (analogBuffer < 120) {
char buffer[50];
sprintf(buffer, "Error on pump %i at run %i - No start current detected", x, startStopCount);
Serial.println(buffer);
delay(100);
sendSMS(cellphoneNumber, buffer);
}
}
nextPhase = 20; // Change so we dont loop this.
}
if ((nextPhase == 3) && (moduleReady == true)) {
for (int x = 1; x <= pumpCount; x++) {
Serial.println("Measuring running current."); // Info
// Mål ADC --> Over X = FEJL Under X = OK.
analogBuffer = analogRead(x-1);
if (analogBuffer > 120) {
char buffer[50];
sprintf(buffer, "Error on pump %i at run %i - Running current detected", x, startStopCount);
Serial.println(buffer);
delay(100);
sendSMS(cellphoneNumber, buffer);
}
}
nextPhase = 30; // Change so we dont loop this.
}
if ((nextPhase == 4) && (moduleReady == true)) {
for (int x = 1; x <= pumpCount; x++) {
digitalWrite(relayPinStart+x, LOW); // Stop relay for pump.
Serial.print("Pump #"); // Info
Serial.print(x);
Serial.println(": OFF"); // end of info
}
Serial.print("This was run nr: "); // Info.
Serial.println(startStopCount); // Info.
startStopCount++;
nextPhase = 40; // Change so we dont loop this.
}
}
void loop() {
GSMcheck();
TickTock();
StartStopPumps(numberOfPumps);
}
// This gets called when there is data on RS232 from PC.
void serialEvent()
{
static char incoming_char = 0; // Will hold the incoming character from the Serial Port.
if(Serial.available() >0)
{
incoming_char=(char)Serial.read(); // Get the character coming from the terminal
Serial1.print(incoming_char); // Send the character to the cellular module.
}
}
// This gets called when there is data on the UART from the GSM module.
void serialEvent1()
{
while (Serial1.available()) {
char inChar = (char)Serial1.read(); // Get the new byte.
inputString += inChar; // Add it to the inputString.
if (inputString.length()>1 && inputString[inputString.length()-2]=='\r' && inputString[inputString.length()-1]=='\n') { // If the 2nd last char is \r and last is \n then string is done.
inputString = inputString.substring(0,inputString.length()-2); // Remove the last two chars from the string (GSM module uses CR+NL(\r & \n) and it fucks everything up ^_^)
stringComplete = true; // Set string complete flag so data can be parsed
}
}
}
// Interrupt routine for timer0 compare.
ISR(TIMER0_COMPA_vect) {
globalCounter++;
if (globalCounter == 50) { nextPhase = 2; } // Correct value = 50.
if (globalCounter == 700) { nextPhase = 3; } // Correct value = 700.
if (globalCounter == 4200) { nextPhase = 4; } // Correct value = 4200.
if (globalCounter == 45000) { nextPhase = 1; globalCounter = 0; } // Correct value = 45000.
}
This is the whole code.
I am unsure of how to check if there is a message in progress?