No i zostałem zmuszony do szukania pomocy…
Mam problem z wykonaną stacją pogodową opartą o ESP32. Zauważyłem, że co jakiś czas następuje jej reset: czasami co kilka minut, czasami co kilka dni… Zauważyłem zależność, że resety nasilają się podczas opadów - gdy było sucho, system działał bez problemu praktycznie przez cały czasu. Zacząłem więc od wymiany zasilacza, okablowania, potem zmiana frameworka z arduino na idf - bez rezultatu. Postanowiłem zrobić nowy czujnik w starej obudowie: nowy ESP32 S3, nowy czujnik halla (deszczomierz działa na zasadzie przejścia magnesu przed czujnikiem i wyzwolenia gpio), nowe czujniki temperatury i… nadal to samo!
Próbując “na stole” nie mam pojęcia dlaczego, ale po wzbudzeniu czujnika halla i pojawieniu się sygnału na pinie, po jakimś czasie (różnym i nie zawsze!) następuje reset z przyczyn “Reset due to task watchdog” lub “Software reset due to exception/panic”.
Przepisałem od nowa kod obliczający wielkość opadów (podejrzewałem jakieś dzielenia przez 0 lub inne pętle), dodałem filtrowanie aby ograniczyć jakieś zbędne pingi, dodałem czyszczenie przy starcie, ale nadal bez zmian.
Kod aktualnie wygląda następująco:
name: "deszczomierz"
friendly_name: Deszczomierz
on_boot:
priority: 600.0
then:
- lambda: |-
time_t nowtime = id(homeassistant_time).now().timestamp;
id(old_time)=nowtime-15;
id(precipitation_id).publish_state(0);
esp32:
board: esp32-s3-devkitc-1
framework:
type: arduino
logger:
baud_rate: 0
button:
- platform: restart
name: "Stacja pogody Restart"
api:
encryption:
key: "kodkodkodkod"
ota:
platform: esphome
password: "otaotaota"
wifi:
networks:
- ssid: !secret wifi_ssid
password: !secret wifi_password
- ssid: !secret wifi_ssid_iot
password: !secret wifi_password_iot
manual_ip:
static_ip: 192.168.8.34
gateway: 192.168.8.1
subnet: 255.255.255.0
reboot_timeout: 5min
ap:
ssid: "Deszczomierz Fallback Hotspot"
password: "xxxx"
captive_portal:
web_server:
light:
- platform: esp32_rmt_led_strip
id: led
rgb_order: GRB
pin: GPIO48
num_leds: 1
rmt_channel: 0
chipset: ws2812
name: "Deszczomierz LED"
binary_sensor:
- platform: status
name: "Front Status"
- platform: gpio
pin:
number: GPIO4
inverted: True
mode:
input: true
pullup: true
name: "hall deszczomierz"
filters:
- settle: 5ms
id: hall_d
on_state:
then:
- light.turn_on:
id: led
transition_length: 0s
red: 0
green: 50%
blue: 100%
- lambda: |-
if(id(hall_d).state)
{
ESP_LOGD("info","Jest przeskok deszczomierza!");
time_t current_time = id(homeassistant_time).now().timestamp;
time_t delta_time = current_time - id(old_time);
if(delta_time<1)
{
delta_time=10;
}
if(delta_time < 3600)
{
id(precipitation_id).publish_state($one_tick * (3600 / delta_time));
ESP_LOGD("info","Czas < 1h");
}
else
{
id(precipitation_id).publish_state(0.5);
ESP_LOGD("info","Czas powyżej 1h");
}
id(old_time) = current_time;
}
- delay: 200ms
- light.turn_off: led
sensor:
- platform: uptime
name: "Uptime Deszczomierz"
update_interval: 60s
- platform: wifi_signal
name: "WiFi Signal Deszczomierz"
id: wifi_signal_db
entity_category: "diagnostic"
- platform: bmp280_i2c
address: 0x77
temperature:
device_class: TEMPERATURE
name: "Temperatura zewnetrzna deszczomierz BMP"
id: temp_zewn_bmp
pressure:
device_class: ATMOSPHERIC_PRESSURE
name: "Cisnienie powietrza deszczomierz"
id: cisnienie_bmp
filters:
offset: 20
- platform: bh1750
name: "Illuminance"
#address: 0x23
device_class: ILLUMINANCE
update_interval: 30s
- platform: template
name: "opad"
id: precipitation_id
unit_of_measurement: "mm/h"
device_class: PRECIPITATION_INTENSITY
update_interval: never
accuracy_decimals: 2
i2c:
sda: GPIO8
scl: GPIO9
scan: true
id: bus_a
substitutions:
one_tick: '0.8418'
globals:
- id: old_time
type: time_t
initial_value: "1"
restore_value: yes
time:
- platform: homeassistant
id: homeassistant_time
on_time:
- seconds: 0
minutes: /5
then:
- lambda: |-
time_t current_time = id(homeassistant_time).now().timestamp;
time_t delta_time = current_time - id(old_time);
if(delta_time < 30)
{
delta_time=30;
}
if(delta_time > 3600)
{
id(precipitation_id).publish_state(0);
ESP_LOGD("info","1 godzina bez opadów, zeruję aktualny opad.");
}
else
{
float opad_teoretyczny=$one_tick * (3600 / delta_time);
if((opad_teoretyczny<id(precipitation_id).state)&&(opad_teoretyczny>0))
{
id(precipitation_id).publish_state(opad_teoretyczny);
}
}
switch:
- platform: gpio
name: 'Oświetlenie droga'
restore_mode: RESTORE_DEFAULT_OFF
id: oswietlenie
pin:
inverted: True
number: GPIO44
mode:
output: True
debug:
text_sensor:
- platform: debug
reset_reason:
name: "Reset Reason"
wpisz lub wklej tutaj kod
Całkowicie skończyły mi się już pomysły co może powodować te restarty i jak zmusić całość do współpracy…