Her er kode for å lese DS18B20:
Sitat#include <OneWire.h>#include <DallasTemperature.h>
// Temp#define ONE_WIRE_BUS GPIO_NUM_33OneWire oneWire(ONE_WIRE_BUS);DallasTemperature sensors(&oneWire);float Temp;
void setup() {Serial.begin(115200);// Tempsensors.begin();}
void loop() {read_temp();delay(1000);}
void read_temp() {sensors.requestTemperatures(); // Send the command to get temperaturesTemp=sensors.getTempCByIndex(0);// Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wireSerial.println(Temp);}
Bibliotekene er:
Dalles DS18B20 ser ut som en transistor men er egentlig en IC.
Den finnes i TO-92 (som en liten transistor) pakning men også bygget inn i en vanntett rustfri probe med lang kabel:
Den er superenkel å bruke til å lese temperaturer med og koster lite.
Det eneste den trenger er en pull-up resistor på 4,7k (Mellom + og Data)
Spenningen kan være mellom 3 og 5,5V (Altså kan du bruke 3,3V spenningen fra ESP32en om det trengs.
Mange sensorer
Du kan koble opptil 32 stk DS18B20 etter hverandre på samme kabelen (Kun 1 pullup resistor)
Du kan spørre etter antallet slik:
Temp2=sensors.getTempCByIndex(1);
Biblioteket inneholder også kode for alarmer om du ikke vil kode dem selv. Da må du også finne adressen til sensoren:
så kan du sette alarmtemperaturene:
OBS Den trigger både på høy og lav så du må lese temp for å finne ut hvem.
Leseintervaller
Når du skal bruke den med MQTT må du bestemme deg for NÅR den skal rappportere temperaturen.
- Hver gang temperaturen endrer seg (mer en x grader)?
- Fast hvert x sekund
- Hver gang du ber om det.
- For den har passert over/under en granse (Alarm)
De to første kan hardkodes eller de kan ha en default verdi og så kan de endres med MQTT kommandoer.
Interupt
Om du skal lese dem hvert x sekund kan du bruke et interupt.
(Om du bruker en delay kan jo ikke ESP32 gjøre noe annet fornuftig mens den venter)
Et interupt avbryter prosessoren med det den driver med og kjører en rutine, når rutinen er ferdig fortsetter prosessoren der den slapp.
Rutinen som skal kjøres merkes med IRAM_ATTR slik at compileren legger den i instruksjons RAM for at den skal kunne kjøres raskt:
I hoved loop'en kan vi nå teste på denne slik:
Timer
ESP32 har flere (2-4) harware timere som vi kan bruke til å kalle på interuptet. Du deklarerer den slik:
hw_timer_t *My_timer = NULL;
Her er et forslag til MQTT kode som poster temp fra 2 sensorer på forskjellige vis:
Sitat#define ONBOARD_LED 2#include <EspMQTTClient.h>#include <OneWire.h>#include <DallasTemperature.h>// Temp#define ONE_WIRE_BUS GPIO_NUM_23OneWire oneWire(ONE_WIRE_BUS);DallasTemperature sensors(&oneWire);int deviceCount;float Temp1;float Temp2;// AlarmDeviceAddress Temp1Addr;bool alarmActive = false;// Timerhw_timer_t *My_timer = NULL;volatile int itsTimeNow = 0;//MQTTEspMQTTClient MQTTclient("ThePromisedLAN", // SSID"Hallelujah!", // WiFi Password"192.168.1.2", // MQTT Broker server ip"", // MQTTUsername Can be omitted if not needed"", // MQTTPassword Can be omitted if not needed"TempTestClient", // Client name that uniquely identify your device1883 // The MQTT port, default to 1883. this line can be omitted);
// Interupt rutine
void IRAM_ATTR onTimer(){Serial.println("Timer Active Nu");itsTimeNow=1;}//------------------------------------------void setup() {Serial.begin(115200);// Tempsensors.begin();sensors.getAddress(Temp1Addr, 0);sensors.setHighAlarmTemp(Temp1Addr, 26.5);sensors.setLowAlarmTemp(Temp1Addr, 23);// Set pin mode for test LEDpinMode(ONBOARD_LED,OUTPUT);digitalWrite(ONBOARD_LED,HIGH);// MQTTclientMQTTclient.setKeepAlive(60);MQTTclient.enableHTTPWebUpdater("meg","hemmelig");MQTTclient.enableOTA("pwd");// TimerMy_timer = timerBegin(0, 8000, true);timerAttachInterrupt(My_timer, &onTimer, true);timerAlarmWrite(My_timer, 100000, true); //10000 = 1 SektimerAlarmEnable(My_timer);}
//-------------------------------------------
void loop() {MQTTclient.loop();
// Connect status på intern LED
if (MQTTclient.isMqttConnected()) {digitalWrite(ONBOARD_LED,LOW);} else {digitalWrite(ONBOARD_LED,HIGH);}
// Les temp thvert X sekund
if (MQTTclient.isMqttConnected()) {if (itsTimeNow==1 ) {read_temp();deviceCount = sensors.getDeviceCount();MQTTclient.publish("TempTestClient/deviceCount", String(deviceCount));MQTTclient.publish("TempTestClient/Temp1", String(Temp1));MQTTclient.publish("TempTestClient/Temp2", String(Temp2));Serial.println("Publish");itsTimeNow=0; // Reset}// Alarm will trigger on both High and Lowif (sensors.hasAlarm(Temp1Addr)) {if (!alarmActive) {alarmActive=true;read_temp();Serial.println("Alarm1 On");MQTTclient.publish("TempTestClient/Alarm", "ON");}} else {if (alarmActive) {Serial.println("Alarm1 Off");MQTTclient.publish("TempTestClient/Alarm", "OFF");alarmActive=false;}}}}void onConnectionEstablished(){Serial.println("onConnectionEstablished");MQTTclient.publish("TempTestClient/status", "started");MQTTclient.subscribe("TempTestClient/readTemp1Now", [](const String & payload) {Serial.print("readNow: ");Serial.println(payload);read_temp();MQTTclient.publish("TempTestClient/Temp1", String(Temp1));});}void read_temp() {sensors.requestTemperatures(); // Send the command to get temperaturesTemp1=sensors.getTempCByIndex(0);// Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wireTemp2=sensors.getTempCByIndex(1);Serial.println(Temp1);Serial.println(Temp2);}
Recommended Comments
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.