// Пины подключения
const int THERMISTOR_PIN = A0; // Термистор на аналоговом пине A0
const int BUTTON_PIN = 2; // Кнопка на пине 2
// Параметры термистора (для NTC 10кОм)
const float SERIES_RESISTOR = 10000.0; // Сопротивление резистора делителя (10кОм)
const float THERMISTOR_NOMINAL = 10000.0; // Номинальное сопротивление термистора при 25°C
const float TEMPERATURE_NOMINAL = 25.0; // Температура для номинального сопротивления
const float B_COEFFICIENT = 3950.0; // B-коэффициент термистора (обычно 3950)
// Переменные
bool useFahrenheit = false; // false = Цельсий, true = Фаренгейт
bool lastButtonState = HIGH; // Предыдущее состояние кнопки
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 50; // Антидребезг 50 мс
void setup() {
Serial.begin(9600);
pinMode(BUTTON_PIN, INPUT_PULLUP); // Внутренний подтягивающий резистор
Serial.println("Термометр готов");
Serial.println("Нажмите кнопку для переключения °C / °F");
Serial.println("-----------------------------------");
}
void loop() {
// Чтение кнопки с антидребезгом
bool buttonState = digitalRead(BUTTON_PIN);
if (buttonState == LOW && lastButtonState == HIGH) {
// Кнопка нажата
if ((millis() - lastDebounceTime) > debounceDelay) {
useFahrenheit = !useFahrenheit; // Переключение режима
lastDebounceTime = millis();
// Выводим сообщение о переключении
Serial.print("Режим: ");
Serial.println(useFahrenheit ? "Фаренгейт (°F)" : "Цельсий (°C)");
}
}
lastButtonState = buttonState;
// Чтение температуры
float temperature = readTemperature();
// Вывод в зависимости от режима
Serial.print("Температура: ");
if (useFahrenheit) {
float fahrenheit = celsiusToFahrenheit(temperature);
Serial.print(fahrenheit);
Serial.println(" °F");
} else {
Serial.print(temperature);
Serial.println(" °C");
}
delay(1000); // Обновление раз в секунду
}
// Функция чтения температуры с термистора
float readTemperature() {
// Чтение аналогового значения (0-1023)
int analogValue = analogRead(THERMISTOR_PIN);
// Преобразование в сопротивление термистора
float resistance = SERIES_RESISTOR / ((1023.0 / analogValue) - 1.0);
// Формула Стейнхарта-Харта для расчета температуры в Кельвинах
float steinhart;
steinhart = resistance / THERMISTOR_NOMINAL; // Отношение сопротивлений
steinhart = log(steinhart); // ln(R/R₀)
steinhart = steinhart / B_COEFFICIENT; // 1/B * ln(R/R₀)
steinhart = steinhart + 1.0 / (TEMPERATURE_NOMINAL + 273.15); // + 1/T₀
steinhart = 1.0 / steinhart; // Инвертируем
// Перевод в Цельсии
float temperatureC = steinhart - 273.15;
return temperatureC;
}
// Конвертация Цельсий -> Фаренгейт
float celsiusToFahrenheit(float celsius) {
return (celsius * 9.0 / 5.0) + 32.0;
}