Samstag, 19. Oktober 2019

ESP32 misst Fluglärm

Nach dem erfolgreichen Bau eines Feinstaubsensors (https://luftdaten.info/feinstaubsensor-bauen/) ist die Idee entstanden das Konzept für das Messen des Fluglärms zu übertragen. Die Stärke des Feinstaubsensors SDS011 ist seine serielle Schnittstelle. Diese ermögliche den Anschluss des Sensors mit nur 4 Leitungen und ist somit auch für weniger erfahrene leicht nachzubauen.

Nach einiger Recherche habe ich bei Ali Express den HH_06.03 gefunden. Dieser ist hier beschrieben https://zhzh.xyz/2019/07/10/iot/esp32micropythonhh06uart/. Das enthaltene MicroPython Script:

from machine import UART 
uart = UART(1, 115200)
uart.init(115200, bits=8, parity=None, stop=1)
print(uart)
frameHeader = b'\xbb\xaa\x01' 
while True:
    if frameHeader == uart.read(3):
          frameDataLowPosition = uart.read( 1 )
          frameDataHighPosition = uart.read( 1 )
          frameCheck = uart.read( 1 )
          frameDataLowPosition = int.from_bytes(frameDataLowPosition, 'big' )
          frameDataHighPosition = int.from_bytes(frameDataHighPosition, 'big' )
    
          frameCheck = int.from_bytes(frameCheck, 'big' )
          if ((frameDataLowPosition+frameDataHighPosition+ 187 + 170 + 1 )& 0xFF ) == frameCheck:
             db = (frameDataHighPosition<< 8 | frameDataLowPosition)* 0.1
             print(db)     

lässt sich auf dem ESP32 leicht testen. Der Sensor liefert alle 500ms den gemessenen db(A) Wert.

Ich bin aktuell mit Windows unterwegs. Da sieht die Übertragung der Firmware für MicroPython so aus:
esptool.py --chip esp32 --port com4 --baud 460800 write_flash -z 0x1000 esp32-20191011-v1.11-422-g98c2eabaf.bin

Ich verwende Thonny als IDE.

Im nächsten Schritt übertrage ich den Code nun nach Arduino.

Die ersten Tests führten zu Bootschleifen. Dies lag an der Verwendung von serial1. Hier eine Erklärung: https://www.az-delivery.com/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/esp-32-lora-alle-seriellen-schnittstellen-nutzen. Die Verwendung von serial2 löst das Problem.

Mit dem Logik-Analyser habe ich mir mal das gelieferte Signal angesehen un kann die Angaben der o.g. chinesischen Web-Seite bestätigen. Alle 500ms wird ein Werte-Paket mit \xbb\xaa\x01 als Starts Sequenz  gesendet.


Wenn ich keinen Weg finde nach den drei Start-Zeichen zu suchen, so wie in Python, dann ist das hier ein Ansatz https://stackoverflow.com/questions/33662818/arduino-serial-read-and-parse-hex.

Nah dem ich die erwarteten Daten auf serial2 des ESP32 nicht erhalten habe, habe ich mal SoftwareSerial ausprobiert. Siehe da swSer.begin(115200, 18, 19, SWSERIAL_8N1, false, 95, 11);
hat auf Anhieb geklappt.

23:16:39.369 ->  <Arduino is ready>
23:16:40.022 -> This just in ... BB
23:16:40.022 -> This just in ... AA
23:16:40.057 -> This just in ... 1
23:16:40.090 -> This just in ... 14
23:16:40.090 -> This just in ... 5
23:16:40.124 -> This just in ... 7F
23:16:40.492 -> This just in ... BB
23:16:40.526 -> This just in ... AA
23:16:40.560 -> This just in ... 1
23:16:40.560 -> This just in ... 59
23:16:40.594 -> This just in ... 3
23:16:40.627 -> This just in ... C2

Nun kann es weitergehen. Erste Code-Schnipsel funktionieren und liefern Daten. Es gibt immer mahl wieder Lücken in der Werteverarbeitung. Grund??

Keine Kommentare:

Kommentar veröffentlichen