#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 6, 7, 8);
// Kalibrasi dua titik: (ADC rendah = suhu rendah), (ADC tinggi = suhu tinggi)
const int ADC_ICE = 150; // Nilai ADC pada 0°C (es+air)
const int ADC_BOIL = 850; // Nilai ADC pada 100°C (air mendidih)
const float TEMP_ICE = 0.0;
const float TEMP_BOIL = 100.0;
unsigned long lastLog = 0;
const unsigned long LOG_INTERVAL = 5000; // Log tiap 5 detik
void setup() {
lcd.begin(16, 2);
Serial.begin(9600);
// Header CSV untuk spreadsheet
Serial.println("timestamp_ms,raw_adc,temperature_c,uncertainty_c");
lcd.print("Thermometer");
lcd.setCursor(0, 1);
lcd.print("Ready...");
delay(1500);
}
float calculateTemp(int adc) {
// Interpolasi linear berdasarkan kalibrasi dua titik
return TEMP_ICE + (adc - ADC_ICE) * (TEMP_BOIL - TEMP_ICE) / (ADC_BOIL - ADC_ICE);
}
void loop() {
int adc = analogRead(A0);
float temp = calculateTemp(adc);
// Estimasi ketidakpastian: ±0.5°C dari kalibrasi + resolusi ADC
float uncertainty = 0.5 + abs(TEMP_BOIL - TEMP_ICE) / abs(ADC_BOIL - ADC_ICE);
// Tampilkan di LCD
lcd.clear();
lcd.print("T:");
lcd.print(temp, 1); // 1 desimal
lcd.print((char)223); // Simbol derajat
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("ADC:");
lcd.print(adc);
// Kirim ke Serial hanya pada interval tertentu (hindari data berlebih)
if (millis() - lastLog >= LOG_INTERVAL) {
Serial.print(millis());
Serial.print(",");
Serial.print(adc);
Serial.print(",");
Serial.print(temp, 2); // 2 desimal untuk spreadsheet
Serial.print(",");
Serial.println(uncertainty, 2);
lastLog = millis();
}
delay(200);
}