Home-meteo/arduino/sketch_hum_temp/sketch_hum_temp.ino
2026-02-21 21:38:42 +03:00

109 lines
3.5 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <Wire.h>
#include "Adafruit_SHT31.h"
Adafruit_SHT31 sht31;
uint8_t detectedAddress = 0; // 0 - не найден, иначе 0x44 или 0x45
unsigned long lastAttempt = 0;
bool sensorOK = false;
void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT);
Wire.begin();
Serial.println("Starting SHT31 scanner...");
}
void loop() {
// Если датчик не инициализирован или был сбой, пытаемся его найти/переинициализировать каждые 5 секунд
if (!sensorOK) {
if (millis() - lastAttempt > 5000) {
lastAttempt = millis();
attemptInit();
}
// Индикация ошибки: быстро мигаем (5 раз в секунду)
digitalWrite(13, HIGH);
delay(100);
digitalWrite(13, LOW);
delay(100);
return; // не идём дальше, пока нет датчика
}
// Если датчик работает, читаем данные каждые 30 секунд (как у вас)
static unsigned long lastRead = 0;
if (millis() - lastRead > 30000) {
lastRead = millis();
readAndPrint();
}
// Небольшая задержка для устойчивости
delay(10);
}
// Функция попытки инициализации датчика
void attemptInit() {
Serial.println("Scanning I2C bus for SHT31...");
// Массив возможных адресов (вместо {0x44,0x45} с range-for)
uint8_t addresses[] = {0x44, 0x45};
for (int i = 0; i < 2; i++) {
uint8_t addr = addresses[i];
if (sht31.begin(addr)) {
// Проверим, действительно ли датчик отвечает (прочитаем что-нибудь)
float t = sht31.readTemperature();
if (!isnan(t)) {
detectedAddress = addr;
sensorOK = true;
Serial.print("SHT31 found at address 0x");
Serial.print(addr, HEX);
Serial.println("! Sensor ready.");
digitalWrite(13, LOW); // погасим светодиод
return;
}
}
}
// Если не нашли, возможно адрес другой. Запустим полный I2C-скан
Serial.println("No SHT31 found at 0x44 or 0x45. Check wiring!");
Serial.println("Running full I2C scan to see all devices...");
fullI2CScan();
}
// Функция полного сканирования I2C (выводит все найденные устройства)
void fullI2CScan() {
byte error, address;
int nDevices = 0;
for (address = 1; address < 127; address++) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C device found at address 0x");
if (address < 16) Serial.print("0");
Serial.print(address, HEX);
Serial.println(" !");
nDevices++;
}
}
if (nDevices == 0)
Serial.println("No I2C devices found");
else
Serial.println("Scan done");
}
// Функция чтения и вывода данных
void readAndPrint() {
float temp = sht31.readTemperature();
float hum = sht31.readHumidity();
if (!isnan(temp) && !isnan(hum)) {
Serial.print(temp);
Serial.print(" ");
Serial.println(hum);
// Короткая вспышка при успешном чтении
digitalWrite(13, HIGH);
delay(50);
digitalWrite(13, LOW);
} else {
Serial.println("Read error, reinitializing...");
sensorOK = false; // Сброс флага, чтобы цикл попытался переинициализировать
}
}