Hmmm, from what I understand any code triggered by an interrupt cannot return any variable?
Right now I have a polling systems that checks the push button. If it detects a press then it switches the alarmAck variable from 0 to 1. I cannot do this with interrupts since I cannot get alarmAck in the loop() scope or am I missing something?
I guess this code has to be run on interrupt:
// "silence alarm" button processing
currBtnState = digitalRead(switchPin); // start of debounce filter
delay(5);
loopLen += 5;
curr2BtnState = digitalRead(switchPin); // end of debounce filter
if (currBtnState == curr2BtnState) {
if (currBtnState != prevBtnState) {
if (currBtnState == LOW) {
alarmAck = 1;
}
}
prevBtnState = currBtnState;
}
Here is the whole code if it helps:
const int tempPin = 0;
const int loLedPin = 8;
const int okLedPin = 9;
const int hiLedPin = 10;
const int piezoPin = 11;
const int switchPin = 2;
const int NO_ALARM = 0;
const int LOW_TEMP = 1;
const int HIGH_TEMP = 2;
const int OUTSIDE_SPECS = 3;
int currAlarmState = NO_ALARM;
int prevAlarmState = NO_ALARM;
int analogTempRead;
float celsiusTempRead;
// PJ - Change 1: Pre declare volt here
float volt;
const int piezoPitch = 100;
int loopLen;
float avgCelsiusTempRead;
byte prevBtnState; // 1 = alarm acknowledged; 0 = alarm not acknowledged
byte currBtnState;
byte curr2BtnState;
byte alarmAck;
unsigned long iteration;
void setup() {
Serial.begin(9600);
pinMode(loLedPin, OUTPUT);
pinMode(okLedPin, OUTPUT);
pinMode(hiLedPin, OUTPUT);
pinMode(piezoPin, OUTPUT);
Serial.println("\n\nReady.");
}
void loop()
{
loopLen = 0;
iteration++;
// reading sensor and converting to volts
Serial.println("\n\n\n\n");
// analogTempRead = 0; // PJ - Change 2: This is not needed with the next line change!
//for (int i =0; i<16; i++) // PJ - Change 3: No need to take and average 10 readings
analogTempRead = analogRead(tempPin);
// float volt = analogTempRead * (aref_voltage/10.0)/16368; // 16368 = 1024 * 16
volt = analogTempRead * (5/1024.0); // change 4: 1024.0, otherwise will calc integer value!!
Serial.print(volt);
Serial.println(" V\n");
celsiusTempRead = ((volt-.5)*100);
//avgCelsiusTempRead = (0.1 * celsiusTempRead + 0.9 * avgCelsiusTempRead);
Serial.print("*** DEBUG MODE, iteration #"); Serial.println(iteration);
if (iteration < 5) {
avgCelsiusTempRead = 2.0;
}
if (iteration >= 5 && iteration < 10) {
avgCelsiusTempRead = 15.0;
}
if (iteration >= 10 && iteration <15) {
avgCelsiusTempRead = 500.0;
}
if (iteration >= 15 && iteration < 20) {
avgCelsiusTempRead = -4.0;
}
if (iteration >= 20 && iteration < 25) {
avgCelsiusTempRead = 15.0;
}
if (iteration >= 25) {
avgCelsiusTempRead = (0.1 * celsiusTempRead + 0.9 * avgCelsiusTempRead);
}
// debug
// celsiusTempRead = 500;
Serial.println("+=======+===========+");
Serial.print("|Instant| "); Serial.print(celsiusTempRead, 2); Serial.println("*C\t|");
Serial.println("+-------+-----------+");
Serial.print("|Average| "); Serial.print(avgCelsiusTempRead, 2); Serial.println("*C\t|");
Serial.println("+=======+===========+");
// "silence alarm" button processing
currBtnState = digitalRead(switchPin); // start of debounce filter
delay(5);
loopLen += 5;
curr2BtnState = digitalRead(switchPin); // end of debounce filter
if (currBtnState == curr2BtnState) {
if (currBtnState != prevBtnState) {
if (currBtnState == LOW) {
alarmAck = 1;
}
}
prevBtnState = currBtnState;
}
// returned temperature processing
if (avgCelsiusTempRead >= -30 && avgCelsiusTempRead <= 0) {
Serial.println("ALARM: LOW TEMP");
currAlarmState = LOW_TEMP;
if (currAlarmState != prevAlarmState) {
alarmAck = 0;
}
digitalWrite(loLedPin, HIGH);
digitalWrite(okLedPin, LOW);
digitalWrite(hiLedPin, LOW);
if (alarmAck == 0) {
analogWrite(piezoPin, piezoPitch);
delay(100);
analogWrite(piezoPin, 0);
delay(50);
analogWrite(piezoPin, piezoPitch);
delay(100);
analogWrite(piezoPin, 0);
loopLen += 250;
}
prevAlarmState = currAlarmState;
}
if (avgCelsiusTempRead > 0 && avgCelsiusTempRead <= 8) {
Serial.println("Temperature OK");
currAlarmState = NO_ALARM;
if (currAlarmState != prevAlarmState) {
alarmAck = 0;
}
digitalWrite(loLedPin, LOW);
digitalWrite(okLedPin, HIGH);
digitalWrite(hiLedPin, LOW);
prevAlarmState = currAlarmState;
}
if (avgCelsiusTempRead > 8 && avgCelsiusTempRead <= 100) {
Serial.println("ALARM: HIGH TEMP");
currAlarmState = HIGH_TEMP;
if (currAlarmState != prevAlarmState) {
alarmAck = 0;
}
digitalWrite(loLedPin, LOW);
digitalWrite(okLedPin, LOW);
digitalWrite(hiLedPin, HIGH);
if (alarmAck == 0) {
analogWrite(piezoPin, piezoPitch);
delay(300);
analogWrite(piezoPin, 0);
loopLen += 300;
}
prevAlarmState = currAlarmState;
}
if (avgCelsiusTempRead < -30 || avgCelsiusTempRead > 100) {
Serial.println("ALARM: TEMP OUTSIDE SPECIFICATIONS");
currAlarmState = OUTSIDE_SPECS;
if (currAlarmState != prevAlarmState) {
alarmAck = 0;
}
digitalWrite(loLedPin, HIGH);
digitalWrite(okLedPin, LOW);
digitalWrite(hiLedPin, HIGH);
if (alarmAck == 0) {
analogWrite(piezoPin, piezoPitch);
}
delay(300);
loopLen += 300;
analogWrite(piezoPin, 0);
digitalWrite(loLedPin, LOW);
digitalWrite(okLedPin, LOW);
digitalWrite(hiLedPin, LOW);
prevAlarmState = currAlarmState;
}
delay(2000-loopLen);
}