Makefile: new MONITOR_PORT for jadzia
[toast/airingbutler.git] / airingbutler.ino
1 #include <SoftwareSerial.h>
2 #include <LiquidCrystal.h>
3 #include "MHZ19.h"
4
5 const int rx_pin = 2; // connect to TX on MHZ19
6 const int tx_pin = 3; // connect to RX on MHZ19
7
8 const int led_green_pin  = 4;
9 const int led_yellow_pin = 5;
10 const int led_red_pin    = 6;
11
12 const int buzzer_pin = 13;
13
14 const int co2_warning_thr = 1000;
15 const int co2_alarm_thr   = 1500;
16
17 const unsigned long warmuptime   = 60000; // 1 min.
18 const unsigned long cooldowntime = 60000; // 1 min.
19
20 MHZ19 mhz19 = MHZ19(rx_pin,tx_pin);
21 LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
22
23 unsigned long time;
24 unsigned long lastwarntime = 0;
25 int co2 = 0;
26 int temp = 0;
27 int lastppm = 0;
28
29 void buzz(unsigned long pause, int count) {
30         for (int i = 0; i <= count; i++) {
31                 digitalWrite(buzzer_pin, HIGH);
32                 delay(pause);
33                 digitalWrite(buzzer_pin, LOW);
34                 if (i < count - 1) delay(pause);
35         }
36 }
37
38 void setup()
39 {
40         Serial.begin(115200);
41         Serial.println("Time,CO2,Temp");
42
43         // MH-Z19
44         mhz19.begin(rx_pin, tx_pin);
45
46         // LCD
47         lcd.begin(16, 2);
48         lcd.setCursor(0, 0);
49         lcd.print("Airing Butler");
50         lcd.setCursor(0, 1);
51         lcd.print("says hello!");
52
53         // LEDs
54         pinMode(led_green_pin, OUTPUT);
55         pinMode(led_yellow_pin, OUTPUT);
56         pinMode(led_red_pin, OUTPUT);
57         digitalWrite(led_green_pin, HIGH);
58         delay(500);
59         digitalWrite(led_green_pin, LOW);
60         digitalWrite(led_yellow_pin, HIGH);
61         delay(500);
62         digitalWrite(led_yellow_pin, LOW);
63         digitalWrite(led_red_pin, HIGH);
64         delay(500);
65         digitalWrite(led_red_pin, LOW);
66
67         // buzzer
68         pinMode(buzzer_pin, OUTPUT);
69         buzz(200, 1);
70
71         lcd.clear();
72 }
73
74
75 void loop()
76 {
77         time = millis();
78         measurement_t m = mhz19.getMeasurement();
79         co2 = m.co2_ppm;
80         temp = m.temperature;
81
82         Serial.print(time);
83         Serial.print(",");
84         Serial.print(co2);
85         Serial.print(",");
86         Serial.println(temp);
87
88         // LEDs
89         digitalWrite(led_red_pin, co2 >= co2_alarm_thr);
90         digitalWrite(led_yellow_pin, co2 >= co2_warning_thr && co2 < co2_alarm_thr);
91         digitalWrite(led_green_pin, co2 < co2_warning_thr);
92
93         // LCD
94         if (time < warmuptime && (co2 == -1 || co2 == 410)) {
95                 lcd.setCursor(0, 0);
96                 lcd.print("Airing Butler");
97                 lcd.setCursor(0, 1);
98                 lcd.print("is warming up...");
99         } else {
100                 lcd.setCursor(0, 0);
101                 lcd.print("CO2: ");
102                 lcd.print(co2);
103                 lcd.print(" ppm    ");
104                 lcd.setCursor(0, 1);
105                 lcd.print("Temp: ");
106                 lcd.print(temp);
107                 lcd.print(" C +/-  ");
108         }
109
110         // buzzer
111         if (co2 >= co2_alarm_thr && lastppm < co2_alarm_thr && time - lastwarntime > cooldowntime) {
112                 buzz(100, 3);
113                 lastwarntime = time;
114         }
115         if (co2 >= co2_warning_thr && lastppm < co2_warning_thr && time - lastwarntime > cooldowntime) {
116                 buzz(500, 1);
117                 lastwarntime = time;
118         }
119
120         lastppm = co2;
121         delay(5000);
122 }