//initializes/defines the output pin of the LM34 temperature sensor int outputpin= 0; //this sets the ground pin to LOW and the input voltage pin to high #include #include // pin A4 is SDA, pin A5 is SCL #include "LiquidCrystal_I2C.h" LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address float fahrenheit = 0; int sensor_H = 0; int sensor_L = 254; int Previous_H = 0; int Previous_L = 254; int t_Previous = 0; unsigned long prev_day_millis = 0; unsigned long sample_Period = 1800000; //86400000 millis per day,3600000 per hour int counter =0; int days=0; int addr = 0; void setup() { //Serial.begin(9600); //-------- Write characters on the display ------------------ // NOTE: Cursor Position: (CHAR, LINE) start at 0 pinMode(A1,INPUT_PULLUP); pinMode(A2,INPUT_PULLUP); lcd.begin(16,2); lcd.backlight(); lcd.setCursor(0,0); //Start at character 4 on line 0 lcd.print("water temp V1"); delay(1000); lcd.setCursor(0,0); lcd.print(" "); float fahrenheit = ReadSens_and_Condition(); sensor_H = fahrenheit; sensor_L = fahrenheit; Previous_H = fahrenheit; Previous_L = fahrenheit; t_Previous = fahrenheit; } float ReadSens_and_Condition(){ int i; int rawvoltage = 0; for (i = 0; i < 5; i++){ rawvoltage = rawvoltage + analogRead(outputpin); // sensor on analog pin 0 } rawvoltage = rawvoltage / 5; // average float millivolts= (rawvoltage/1024.0) * 3300; //rawvoltage/1024.0) * 5000; float fahrenheit= millivolts/10; return fahrenheit; } void loop() { read_button_A1(); // button clears EEPROM highs and lows, starts over float fahrenheit = ReadSens_and_Condition(); if (fahrenheit > sensor_H){ sensor_H = fahrenheit; } if (fahrenheit <= sensor_L){ sensor_L = fahrenheit; } is_Time_To_Store(); // if yes, store daily his and lows in EEPROM and reset daily values lcd_display(fahrenheit); // line 1 of display lcd_min_max_daily(); // line 2 of display (daily min and max) t_Previous=fahrenheit; // used for daily display formatting Previous_H = sensor_H; Previous_L = sensor_L; if(digitalRead(A2)==LOW){ lcd_weekly_min_max(); // if so, display weekly min and max } } // end loop void lcd_display(float fahrenheit){ // current temperature (line 1) lcd.setCursor(0,0); lcd.print(counter); if (fahrenheit != t_Previous){ lcd.setCursor(5,0); lcd.print(" "); // clear previous } lcd.setCursor(5,0); lcd.print(fahrenheit,1); if(fahrenheit < 100){ lcd.setCursor(10,0); // Start at character 10 on line 0 lcd.print("F "); // } else{ lcd.print(" F"); } } void lcd_min_max_daily(){ // daily min max (line 2) if(Previous_L != sensor_L){ //erase if different lcd.setCursor(0,1); lcd.print(" "); } lcd.setCursor(0,1); lcd.print(sensor_L); if(sensor_L < 100){ lcd.setCursor(3,1); lcd.print("MIN "); } else{ lcd.print(" MIN"); } if(Previous_H != sensor_H){ lcd.setCursor(10,1); lcd.print(" "); } if(sensor_H < 100){ lcd.setCursor(10,1); lcd.print(sensor_H); } else{ lcd.setCursor(9,1); lcd.print(sensor_H); } lcd.setCursor(13,1); lcd.print("MAX"); delay(100); } void lcd_weekly_min_max(){ for(int i=0; i<7; i++){ int days=i+1; int value1 = EEPROM.read(2*i); int value2 = EEPROM.read(2*i+1); lcd_weekly(days,value1,value2); } } void lcd_weekly(int d, int a, int b){ lcd.clear(); lcd.setCursor(8,0); lcd.print(d); lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,1); lcd.print(a); lcd.setCursor(4,1); lcd.print("MIN"); lcd.setCursor(8,1); lcd.print(" "); lcd.setCursor(9,1); lcd.print(b); lcd.setCursor(13,1); lcd.print("MAX"); delay(2000); } void is_Time_To_Store(){ if((millis()-prev_day_millis)>sample_Period){ counter++; switch(counter){ case 1: EEPROM.write(addr, sensor_L); addr++; EEPROM.write(addr, sensor_H); addr++; reset_L_H(); break; case 2: EEPROM.write(addr, sensor_L); addr++; EEPROM.write(addr, sensor_H); addr++; reset_L_H(); break; case 3: EEPROM.write(addr, sensor_L); addr++; EEPROM.write(addr, sensor_H); addr++; reset_L_H(); break; case 4: EEPROM.write(addr, sensor_L); addr++; EEPROM.write(addr, sensor_H); addr++; reset_L_H(); break; case 5: EEPROM.write(addr, sensor_L); addr++; EEPROM.write(addr, sensor_H); addr++; reset_L_H(); break; case 6: EEPROM.write(addr, sensor_L); addr++; EEPROM.write(addr, sensor_H); addr++; reset_L_H(); break; case 7: EEPROM.write(addr, sensor_L); addr++; EEPROM.write(addr, sensor_H); addr++; reset_L_H(); break; default: prev_day_millis=millis(); // reset for another day break; } } } void reset_L_H(){ lcd.clear(); float fahrenheit = ReadSens_and_Condition(); sensor_H = fahrenheit; Previous_H = fahrenheit; // reset highs and lows for today sensor_L = fahrenheit; Previous_L = fahrenheit; prev_day_millis=millis(); // reset for another day } void read_button_A1(){ if(digitalRead(A1)==LOW){ // if so, reset EEPROM min max to zeros for(int i=0; i<14; i++){ EEPROM.write(i,0); } delay(300); counter=0; // restart for new readings days=0; addr=0; lcd.clear(); prev_day_millis=millis(); // reset for new readings } }