#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define D35 35
#define D37 37
#define INT4 2
#define INT5 3
#define ON true
#define OFF false
const unsigned long temp_read_interval = 1000;
const unsigned long display_interval = 1000;
const char TEMP[12] = "Temperature ";
LiquidCrystal lcd(22, 23, 25, 27, 29, 31, 33);
OneWire oneWire(D37);
DallasTemperature sensors(&oneWire);
unsigned long time_now = 0;
unsigned long time_temp_read = 0;
unsigned long time_display = 0;
float temp;
char temp_str[5];
volatile bool state_display = OFF;
volatile bool state_serial = OFF;
void INT4_ISR() {
state_display = ON;
}
void INT5_ISR() {
if(state_serial)
state_serial = OFF;
else
state_serial = ON;
}
void setup()
{
Serial.begin(9600);
sensors.begin();
lcd.begin(16,2);
pinMode(D35, OUTPUT);
pinMode(INT4, INPUT);
attachInterrupt(digitalPinToInterrupt(INT4), INT4_ISR, RISING);
pinMode(INT5, INPUT);
attachInterrupt(digitalPinToInterrupt(INT5), INT5_ISR, RISING);
}
void loop() {
// put your main code here, to run repeatedly:
time_now = millis();
if(time_now - time_temp_read >= temp_read_interval) {
time_temp_read = time_now;
sensors.requestTemperaturesByIndex(0);
temp = sensors.getTempCByIndex(0);
}
if(time_now - time_display >= display_interval) {
time_display = time_now;
char serialBuf[30];
char temp_buf[7];
if(state_display | state_serial) {
dtostrf(temp, 4, 1, temp_str);
sprintf(temp_buf, "%s C", temp_str);
}
if(state_display){
digitalWrite(D35, HIGH);
lcd.display();
lcd.setCursor(0, 0);
lcd.print(TEMP);
lcd.setCursor(0, 1);
lcd.print(temp_buf);
state_display = OFF;
} else {
digitalWrite(D35, LOW);
lcd.noDisplay();
}
if(state_serial) {
strcpy(serialBuf, TEMP);
strcat(serialBuf, " ");
strcat(serialBuf, temp_buf);
Serial.println(serialBuf);
}
}
}
Loading
ds18b20
ds18b20