#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#define DQ_PIN 8 // PB0 (Пин 12 на твоем МК)
#define BTN1 9 // PB1 (Пин 13)
// Определяем новые пины
#define ALARM_LED 14 // PC0
#define ALARM_BUZ 15 // PC1
bool showFahrenheit = false;
float tempC = 0.0;
// Функция сброса датчика (ручная)
bool ds_reset() {
pinMode(DQ_PIN, OUTPUT);
digitalWrite(DQ_PIN, LOW);
delayMicroseconds(500); // Тянем линию вниз
pinMode(DQ_PIN, INPUT);
delayMicroseconds(80);
bool presence = !digitalRead(DQ_PIN);
delayMicroseconds(420);
return presence;
}
// Функция записи байта
void ds_write(byte data) {
for (int i = 0; i < 8; i++) {
pinMode(DQ_PIN, OUTPUT);
digitalWrite(DQ_PIN, LOW);
delayMicroseconds(5);
if (data & 1) pinMode(DQ_PIN, INPUT);
delayMicroseconds(60);
pinMode(DQ_PIN, INPUT);
data >>= 1;
}
}
// Функция чтения байта
byte ds_read() {
byte data = 0;
for (int i = 0; i < 8; i++) {
pinMode(DQ_PIN, OUTPUT);
digitalWrite(DQ_PIN, LOW);
delayMicroseconds(2);
pinMode(DQ_PIN, INPUT);
delayMicroseconds(10);
if (digitalRead(DQ_PIN)) data |= (1 << i);
delayMicroseconds(50);
}
return data;
}
void setup() {
lcd.begin(16, 2);
pinMode(BTN1, INPUT_PULLUP);
pinMode(ALARM_LED, OUTPUT);
pinMode(ALARM_BUZ, OUTPUT);
lcd.print("Testing...");
delay(1000);
}
void loop() {
// Кнопка
if (digitalRead(BTN1) == LOW) {
showFahrenheit = !showFahrenheit;
delay(200);
}
// Запуск измерения
if (ds_reset()) {
ds_write(0xCC); // Skip ROM
ds_write(0x44); // Convert T
// Вместо delay используем цикл, чтобы кнопка работала
for(int i=0; i<80; i++) {
if (digitalRead(BTN1) == LOW) { showFahrenheit = !showFahrenheit; delay(200); }
delay(10);
}
// Чтение результата
ds_reset();
ds_write(0xCC);
ds_write(0xBE); // Read Scratchpad
byte low = ds_read();
byte high = ds_read();
int16_t raw = (high << 8) | low;
if (raw != -1) {
tempC = (float)raw / 16.0;
}
}
// Вывод
lcd.setCursor(0, 0);
lcd.print("Temp: ");
if (showFahrenheit) {
lcd.print((tempC * 1.8) + 32.0, 1);
lcd.print(" F ");
} else {
lcd.print(tempC, 1);
lcd.print(" C ");
}
if (tempC > 30.0) { // Порог срабатывания 30 градусов
digitalWrite(ALARM_LED, HIGH);
tone(ALARM_BUZ, 1000, 200); // Звук 1кГц на 200мс
} else {
digitalWrite(ALARM_LED, LOW);
noTone(ALARM_BUZ);
}
}