// To switch between modes, comment or uncomment the next line:
#define TEST_WITH_RANDOM_VALUES
// --- PIN DEFINITIONS ---
const int SENSOR_PIN = 34;
const int LED_PIN = 22;
const int BUZZER_PIN = 21;
// --- ALARM SETTINGS ---
const float HIGH_TEMP_ALARM = 38.0;
const float LOW_TEMP_ALARM = 36.0;
// --- NTC THERMISTOR CHARACTERISTICS ---
const float SERIES_RESISTOR = 10000;
const float NOMINAL_RESISTANCE = 10000;
const float B_COEFFICIENT = 3950;
const float NOMINAL_TEMPERATURE = 25;
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
randomSeed(analogRead(0));
#ifndef TEST_WITH_RANDOM_VALUES
// If we are in REAL SENSOR mode, print the CSV header
Serial.println("Timestamp (ms),Temperature (C),Alarm Status");
#endif
}
void loop() {
int adcValue;
unsigned long timestamp = millis();
#ifdef TEST_WITH_RANDOM_VALUES
// Generate a wide-range random value
adcValue = random(900, 3800);
#else
// Use the real sensor
adcValue = analogRead(SENSOR_PIN);
#endif
// --- CALCULATIONS (Same for both modes) ---
if (adcValue == 0) return;
float resistance = SERIES_RESISTOR * ((4095.0 / adcValue) - 1.0);
float steinhart = log(resistance / NOMINAL_RESISTANCE) / B_COEFFICIENT + 1.0 / (NOMINAL_TEMPERATURE + 273.15);
float tempC = (1.0 / steinhart) - 273.15;
// --- ALARM LOGIC (Same for both modes) ---
String alarmStatus = "OK";
if (tempC > HIGH_TEMP_ALARM || tempC < LOW_TEMP_ALARM) {
digitalWrite(LED_PIN, HIGH);
digitalWrite(BUZZER_PIN, HIGH);
alarmStatus = "ALARM";
} else {
digitalWrite(LED_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
}
// --- OUTPUT LOGIC (This is where it changes) ---
#ifdef TEST_WITH_RANDOM_VALUES
// Explanatory output for test mode
Serial.println("--- RUNNING IN WIDE-RANGE RANDOM TEST MODE ---");
Serial.print("Timestamp: ");
Serial.print(timestamp);
Serial.print(" ms");
Serial.print("\t ADC: ");
Serial.print(adcValue);
Serial.print("\t Temp: ");
Serial.print(tempC);
if (alarmStatus == "ALARM") {
Serial.println(" C --- ALARM ON!");
} else {
Serial.println(" C --- System OK");
}
#else
// Clean CSV output for real mode
Serial.print(timestamp);
Serial.print(",");
Serial.print(tempC);
Serial.print(",");
Serial.println(alarmStatus);
#endif
delay(1000); // A 1-second delay is good for readability
}