#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); //define I2C address 0x27, 16 column and 2 rows
float flamelevel = 0; // mapped and inverted % of sensor range
#define greenLED 2 // fire okay or firing
#define redLED 7 // warning or flashing alert
// empirically relate flame % to actual fire condition (TBD)
const int minSurvive = 15; // minimum level for idle, below is outfire
const int idleLow = 20; // lowest reading for healthy idle
const int idleTarget = 30; // target reading for resting idle
const int firingLow = 70; // lowest reading for actively firing
const int firingHigh = 90; // reading for full firing
void setup() {
lcd.init();
lcd.clear();
lcd.backlight();
Serial.begin(9600);
pinMode(greenLED, OUTPUT); // set green pin led as output
digitalWrite(greenLED, LOW); // turn off green led
pinMode(redLED, OUTPUT); // set red led pin as output
digitalWrite(redLED, LOW); // turn off red led
}
void loop() {
float analogValue = analogRead(A0);
Serial.print("Sensor RAW: ");
Serial.println(analogValue, 0);
flamelevel = map(analogValue, 0, 1024, 100, 0);
Serial.print(flamelevel, 0);
Serial.println("%");
// disabling the lcd commands makes serial print work
lcd.setCursor(0, 0);
lcd.print(F("Flame: "));
if (flamelevel >= firingHigh) { // stoker is fully firing
lcd.print(" Fire");
digitalWrite(greenLED, HIGH); // turn on green led
digitalWrite(redLED, LOW); // turn off red led
delay(300);
digitalWrite(greenLED, LOW); // turn off green led for flash
}
if ((flamelevel <= idleLow) && (flamelevel >= minSurvive) ) { // low fire
lcd.print("No fire ");
digitalWrite(greenLED, LOW); // turn on green led
digitalWrite(redLED, HIGH); // turn off red led
// trigger stoker run timer = 2 mins?
}
lcd.setCursor(0, 1);
lcd.print(" Level: ");
lcd.print(flamelevel, 0);
lcd.print("% ");
delay(200);
}