Загрузка данных


// Пины подключения
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;
}