ESP32DeltaTemp

ESP32DeltaTemp

EPS32DeltaTemp is en zelfbouwproject gebaseerd op de ESP32 van Espressif System. Dit kleine IoT apparaat is goedkoop en is relatief eenvoudig te programmeren. EP32DeltaTemp is gebouwd om in en uitgaande temperatuur te meten van vloerverwarming maar kan in principe voor elke toepassing worden gebruikt waar je de temperatuur wil meten. De centrale verwarming, de kamertemperatuur, enz.

Eigenschappen

Meet de temperatuur via twee digitale sensoren en geeft deze weer op het display van de ESP32, je kunt ook een ESP32 gebruiken zonder display.  Het display kan via een aanraaktoets  worden gewisseld tussen:

  1. De ingaande en uitgaande temperatuur met een grafiek die een indicatie geeft van het verschil tussen de twee temperaturen of de wifiverbinding actief is en wanneer de temperatuur wordt uitgelezen. De temperatuur wordt met een interval van 1 seconden gemeten.
  2. Het verschilscherm geef het verschil weer tussen de twee temperaturen en wanneer de meting plaats vindt.
  3. Info scherm: geeft de softwareversie weer, de gebruikt Service Set Identifier SSID (de naam van Wifi-netwerk) en het IP-adres dat de Eps32DeltTemp gebruikt.
  4. Tot slot: het scherm gaat automatisch uit na ongeveer 60 seconden. Het Heltec schermpje wordt snel slechter als dit altijd aan staat.

De informatie wordt optioneel verzonden via wifi UDP-berichten die door elke ander applicatie/programma gelezen kan worden op het lokale netwerk. Het Wifi IP-adres wordt via DHCP opgehaald iets wat de meeste thuisrouters standaard doen.

Benodigde hardware

De lijst die ik hier geef werkt en ik heb geen relatie met de genoemde leveranciers.
• 1 x Heltec EPS32 met oled display (10,55): link
• 2 x DS18B20 digitale temperatuur sensor (~€ 1,00): link
• 1 x Weerstand van 4K7: (€ 1,98) link
• Behuizing (optioneel) (€ 1,86): link
• Een USB – Naar micro usb kabel voor het programmeren en of de 5V voeding. Let er op dat de kabel spanninmg en data doorgeeft.
• Een Micro USB 5V voeding van minimaal 0.7 Ampère (mag meer zijn), een Raspberry Pi voeding is uitstekend. (Ongeveer € 4)
• Experimenteer print, een paar euro bijvoorbeeld link ( ongeveer € 7).
• Iets wat als tiptoets knop kan werken. Ik gebruik een 4mm schroefje.
Totaal ongeveer: € 30 euro afhankelijk van je voorkeur.
Uiteraard een soldeerbout, soldeertin en e.d. om de boel in elkaar te zetten.

Aansluitschema

ESP32 aansluitschema

Tip 5v aansluiting

Bij eerder Heltec Wifi Kit32 modules bevatte deze een 5v naar 3.3V spanningsregelaar die als je 5Volt op de pin (2) 5V zette dan werd dat omgezet naar 3.3V op de pin (3) ernaast.  Bij een recent module die ik gebruikte werkte dat niet meer waardoor er 5V op de 3.3V pin kwam te staan.  Je ziet op de module ook dat er minder spanningsregelaars op de module zijn geplaats. Het effect is dat de temperatuursensor s daar niet mee werken, die verwachten 3.3V. Bij deze module wordt de 5V op de Micro UBS connector wel omgezet naar 3.3V.  Als je alleen de micro-usb gebruikt dan zal je dit probleem niet optreden.

Benodigde software.

De ESP32 is eenvoudig te programmeren via de Arduino IDE als je deze nog niet hebt geïnstalleerd volg dan deze handleiding van  randomnerdtutorials.com. Deze handleiding legt tevens uit hoe je de ESP32  uitbreiding moet toevoegen die zijn standaard niet geïnstalleerd.  

De code maakt gebruik van een extra softwarebibliotheken die eenvoudig via de Arduino IDE te installeren zijn.  Deze kun je via de IDE  Sketch -> Include Libary -> Manage Libraries toevoegen.

  • OneWire
  • U8G2
  • DallasTemperature

Laad onderstaande code in de editor en pas eventueel de WIFI instellingen aan als je daar gebruik van wil maken en compileer deze door linksboven op verify te klikken.  Als dat goed gaat kun je de ESP32 aansluiten via de USB-kabel en de code uploaden naar de ESP32.   Om de code te kunnen testen moeten wel de temperatuur sensors worden aangesloten.

Wijzigingen van versie 1.0 naar versie 1.1

1: Versie nummer verhoogd naar v1.1
2: Meer debug/logging informatie toegevoegd voor de seriële monitor.
3: Debug meldingen naar het Engels omgezet.
4: Mogelijk bug met screen dim voorkomen door overflow.
5: Tijd van dimmen scherm naar ongeveer 1 minuut terug gebracht om het scherm te beschermen.
6: Gemiddelde waarde berekening aangepast om piek en dalen in de meting te onderdrukken en de code efficiënter gemaakt.
7: Controle automatische opnieuw de wifi verbinding opbouwen. Bij het wegvallen van de wiffi verbinding probeert de software een nieuw verbinding op te zetten.
8: Door DEBUG beter in te zetten is de runtime code ongeveer 3k bytes kleiner geworden. Markeer de DBUG code met // voor het compileren van de definitieve versie.
9: Voorloop nullen bug/feature opgelost in de JSON output in het UDP bericht. Met dank aan Siem.
10: JSON/UDP output aangepast: gemiddelde waarde bevat 1 decimaal en ruwe waarde twee decimalen.
11: Verschil scherm laat nu het absolute verschil zien zonder min teken.
12: De led op het board knippert elke keer als dat er geprobeerd wordt een UDP bericht te verzenden.
13: Bij het starten van de software gaat de led op board aan. aAs de WiFi werkt en de temperatuur sensors zijn gevonden dan gaat de led weer uit. Zie 12.

#include <U8g2lib.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <WiFi.h>
#include <WiFiUdp.h>

/* note, the bat(tery) led rapid blinking is a hardware "feature" of the heltec board and can not be disabled by software */

/* user setting, change these to your needs. */
/*********************************************/
/* leave SSID empty if you don't need the UDP / WIFI messages *ssid = "" */
const char *ssid = "";          // your SSID.
const char *pwd  = "";         // your WPA WIFI password.

// board specific 
#define TOUCH_PIN T7       // connected to pin 27
#define ONE_WIRE_BUS 13    // DS18B20 on GPIO 13.
#define ONBOARD_LED  25    // ESP32 board specific led
/* end of user setting,                      */
/*********************************************/

const uint8_t udp_send_interval = 45;      // interval when an udp message will be send in 0.1 secs interval 45 = ~5 secs.
                                          // use a value between 1 and a maximum of 255.

const float temp_in_adjustmend  =  0.55;  // test en adjust these to values to compensate for differences
const float temp_out_adjustmend =  1.39;  // in the readout of the temp sensors and general offset error.

/***************** end of user settings ******/

//#define DEBUG 1                         // used during development to give more verbose output to 
                                        // the serial output place '//' before the line to deactivate

#define STR_BUF_SIZE 32
#define VERSION             "1.1"         // Software version.
#define TEMPERATURE_PRECISION 12          // set temp precision (9-12).
#define DISPLAY_WIDTH 128
#define DISPLAY_HEIGHT 64
#define DIM_SCREEN 450                   // Dim screen after about a minute.

OneWire           oneWire(ONE_WIRE_BUS);  // setup OneWire devices.
DallasTemperature tempSensors(&oneWire);  // tempSensor data.
DeviceAddress     tempDeviceAddress;      // temp adress for devices.
WiFiUDP           udp;                    // UDP sender.

int     numberOfDevices = 0;              // number of temperature devices found.
char    strbuf[STR_BUF_SIZE];             // buffer for display and serial print.
float   g_temp_in;
float   g_temp_out;
float   g_temp_in_avg;
float   g_temp_out_avg;
uint8_t temp_vdelta_arr_graphic[DISPLAY_WIDTH];
int     touch_value = 300;
bool    WIFIconnected = false;
//bool    onboard_led_on = true; // staus of the onboard led on or off

//U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ 16, /* clock=*/15, /* data=*/4);   // (rotation, [reset [, clock, data]])
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ 15, /* data=*/ 4, /* reset=*/ 16);

// IP address to send UDP data to.
const char *udpAddress = "255.255.255.255";  // udp broadcast address for the local lan only.
const int   udpPort    = 30721;              // udp port number to listen to as a client.

void setup() {
  
    // set led configuration
    pinMode( ONBOARD_LED, OUTPUT );
    digitalWrite( ONBOARD_LED, HIGH );  // led on to show the prg is running

    Serial.begin(115200);
    #if DEBUG
        Serial.println("Serial output started at 115200");
    #endif
    u8g2.begin();
    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_ncenB12_tf);
    u8g2.drawStr(20, 40, "ZTATZ.NL");
    u8g2.sendBuffer();
    delay( 3000 );

    // load temperature sensors.
    tempSensors.begin();

    // check if we can find the two temp sensors.
    u8g2.clearBuffer();
    while ( setTempPrecision() < 2 ) {
        tempSensors.begin();
        u8g2.drawStr(1, 12, "wacht op de");
        u8g2.drawStr(1, 26, "temperatuur");
        u8g2.drawStr(1, 40, "sensors.");
        u8g2.sendBuffer();
        delay(500);
    }

    // make sure we have some temperature values.
    readTemperatures();

    if ( String(ssid).length() > 0 ) {

        // try to connect to wifi.
        connectToWiFi(ssid, pwd);

        // Wait for connection
        for (uint8_t i = 0; i < 60; i++) {
            if (WiFi.status() == WL_CONNECTED ) {
                break; // we have a network connection
            }
            u8g2.clearBuffer();
            u8g2.drawStr(1, 12, "wacht op de");
            u8g2.drawStr(1, 27, "wifi");
            u8g2.drawStr(1, 41, "verbinding.");
            String str = "seconden: " + String( i );
            str.toCharArray(strbuf, STR_BUF_SIZE);
            u8g2.drawStr(1, 57, strbuf);
            u8g2.sendBuffer();
            delay(1000); // try every 1 secs
        }
    }
}

void loop()
{
    static uint8_t display_select_counter = 0;
    static uint16_t pseudo_secs = 0;
    static uint16_t dim_screen_secs = 0;
    static uint8_t touch_counter = 0;
    static uint8_t udp_send_counter = 0;
    static bool    wifi_retry_is_on = false;
    static bool    screen_dimmed_is_on = false;

    // pseudo timer.
    pseudo_secs++;
    dim_screen_secs++;

    //digitalWrite( ONBOARD_LED, HIGH ); 
    digitalWrite( ONBOARD_LED, LOW );  // set it show the prg ready with setup and entering the loop.

    if ( pseudo_secs > 599 ) {
        pseudo_secs = 0;  // reset secs to 0
    }

    if (dim_screen_secs > DIM_SCREEN && !screen_dimmed_is_on) {
        screen_dimmed_is_on = true;
        dim_screen_secs = 0;
        showDisplay(3);
        #ifdef DEBUG
            Serial.println("Dim Screen activated.");
        #endif
    }

    // read temperature values from sensors and update data buffers.
    // every second.
    if ( (pseudo_secs % 10 ) == 0 ) {
        readTemperatures();
        fillGraphicBufferValues();
        calcAvgTemperature( g_temp_in, g_temp_out );
        if (!screen_dimmed_is_on) {
            showDisplay(display_select_counter);
        }
    }

    // Send UDP broadcast messages.
    if ( WIFIconnected ) {
        udp_send_counter++;
        if ( udp_send_counter > udp_send_interval ) {
            digitalWrite( ONBOARD_LED, HIGH );   // onboard led flashes when a UDP message is send.
            udpSendMessage( makeJsonMessage() ); // SEND UPD message
            udp_send_counter = 0;
        }
    }

    // touch selection.
    touch_value = touchRead( TOUCH_PIN );

    if (touch_value < 50 ) {
        touch_counter++;
        if ( touch_counter > 4 ) { // must held the touch contact to filter out noise.
            touch_counter = 0;
            dim_screen_secs = 0;

            if (!screen_dimmed_is_on) {
                display_select_counter++;
            
                if ( display_select_counter > 2 ) {
                    display_select_counter = 0;        // remove blank screen option
                }
                
                showDisplay( display_select_counter ); // to get quick feedback on pressing touch "button".
                // screen_dimmed_is_on = false;
            } else {
                screen_dimmed_is_on = false;
                showDisplay(display_select_counter); // to get quick feedback on pressing touch "button".
            }
        }
    } else {
        touch_counter = 0; //reset the touch counter,
    }

    delay( 100 ); // 0.1 sec delay.
    if ( digitalRead( ONBOARD_LED ) ) { // reset the led after a short while. 
        digitalWrite( ONBOARD_LED, LOW );
    }
    
}

// function to connect to the wifi network
void connectToWiFi(const char * ssid, const char * pwd) {
    #ifdef DEBUG
        Serial.println("Connecting to the WiFi network: " + String(ssid));
    #endif

    // delete old config
    WiFi.disconnect(true);

    delay(1000);

    //register event handler
    WiFi.onEvent(WiFiEvent);

    //Initiate connection
    WiFi.begin(ssid, pwd);
}

//wifi event handler
void WiFiEvent(WiFiEvent_t event) {
    #ifdef DEBUG
        Serial.print("WiFiEvent: ");
        Serial.println(event);
    #endif
    switch (event) {
        case SYSTEM_EVENT_STA_CONNECTED:
            //When connected set
            #ifdef DEBUG
                Serial.println( "WiFi connected with Access point." );
            #endif
            break;
        case SYSTEM_EVENT_STA_GOT_IP:
            //When connected set
            #ifdef DEBUG
                Serial.print( "Wi-Fi connected! IP address: " );
                Serial.println( WiFi.localIP() );
            #endif
            //initializes the UDP state
            //This initializes the transfer buffer
            udp.begin(WiFi.localIP(), udpPort);
            WIFIconnected = true;
            break;
        case SYSTEM_EVENT_STA_DISCONNECTED:
            #ifdef DEBUG
                Serial.println( "Lost WiFi connection.." );
            #endif
            WIFIconnected = false;
            WiFi.disconnect(true);
            WiFi.begin(ssid, pwd);
            break;
    }
}

// function select display mode
void showDisplay(uint8_t index) {
  switch (index) {
    case 0:
      showTempInfo();
      break;
    case 1:
      showDeltaTempInfo();
      break;
    case 2:
      showInitInfo();
      break;
    case 3:
      // blank screen
      u8g2.clearBuffer();
      u8g2.sendBuffer();
      break;
  }
}

// function to show temperature on display.
void showDeltaTempInfo() {
    static bool temp_icon;

    floatTempFormater( abs(g_temp_in_avg - g_temp_out_avg) ).toCharArray(strbuf, STR_BUF_SIZE);

    #ifdef DEBUG
        Serial.println ( String("showDeltaTempInfo() delta temperature = ") + strbuf );
    #endif 

    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_fub30_tf);
    u8g2.drawStr(   5,  35, strbuf);
    u8g2.drawGlyph( 85, 35, 176 );
    u8g2.drawStr(   95, 35, "C" );

    u8g2.setFont(u8g2_font_ncenB18_tf);
    u8g2.drawStr( 8, 60, "verschil" );

    // activity icon toggle.
    u8g2.setFont(u8g2_font_open_iconic_gui_2x_t);
    if (temp_icon == true ) {
        u8g2.drawGlyph(112, 60, 66);
        temp_icon = false;
    } else {
        u8g2.drawGlyph(112, 60, 67);
        temp_icon = true;
    }

    u8g2.sendBuffer();
}

void showInitInfo() {
    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_courB10_tf);
    
    String str = "Version " + String(VERSION);
    
    #ifdef DEBUG
        Serial.println ( String("ShowInitInfo() ") + str );
    #endif
    
    str.toCharArray(strbuf, STR_BUF_SIZE);
    u8g2.drawStr(1, 15, strbuf);

    str = "SSID:" + String( ssid );
    str.toCharArray(strbuf, STR_BUF_SIZE);
    u8g2.drawStr(1, 30, strbuf);

    str = ipAddress2String( WiFi.localIP() );
    str.toCharArray(strbuf, STR_BUF_SIZE);
    u8g2.drawStr(1, 45, strbuf);

    u8g2.sendBuffer();
}

// function to show temperature on display.
void showTempInfo() {
    static bool temp_icon;

    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_ncenB18_tf);
    u8g2.drawStr(    0, 18, "in"  );
    u8g2.drawStr(    0, 40, "uit" );

    floatTempFormater(g_temp_in_avg).toCharArray(strbuf, STR_BUF_SIZE);
    u8g2.drawStr(38, 18, strbuf);

    floatTempFormater(g_temp_out_avg).toCharArray(strbuf, STR_BUF_SIZE);
    u8g2.drawStr(38, 40, strbuf);

    u8g2.setFont(u8g2_font_ncenB14_tf);
    u8g2.drawStr(   97, 16, "C" );
    u8g2.drawStr(   97, 38, "C" );
    u8g2.drawGlyph( 90, 16, 176 );
    u8g2.drawGlyph( 90, 38, 176 );

    for ( uint8_t i = 0; i < DISPLAY_WIDTH; i++ ) {
        u8g2.drawLine(i, 64, i, DISPLAY_HEIGHT - temp_vdelta_arr_graphic[i] );
    }

    // activity icon toggle.
    //u8g2.setFont(u8g2_font_siji_t_6x10);
    u8g2.setFont(u8g2_font_open_iconic_all_2x_t);
    if ( temp_icon == true ) {
        u8g2.drawGlyph(112, 20, 141);
        //u8g2.drawGlyph(111,20,57551);
        temp_icon = false;
    } else {
        //u8g2.drawGlyph(113,20,57373);
        temp_icon = true;
    }

    if ( WIFIconnected ) {
        u8g2.setFont(u8g2_font_open_iconic_all_2x_t);
        u8g2.drawGlyph( 112, 40, 247 );
        #ifdef DEBUG
            Serial.println ( String("showTempInfo() Wifi connected"));
        #endif 
    } else {
        #ifdef DEBUG
            Serial.println ( String("showTempInfo() Wifi not connected"));
        #endif 
    }

    u8g2.sendBuffer();
}

// function IPAdress conversion to string
String ipAddress2String(const IPAddress& ipAddress) {
    return String(ipAddress[0]) + String(".") + \
        String(ipAddress[1]) + String(".") + \
        String(ipAddress[2]) + String(".") + \
        String(ipAddress[3])  ;
}

// function to format json string.
String makeJsonMessage() {
    static unsigned int sequenceNumber;
    char tmpbuf[8];

    dtostrf( g_temp_in, 2, 2, tmpbuf );
    String str_tmp_in = String( tmpbuf );
    dtostrf( g_temp_out, 2, 2, tmpbuf );
    String str_tmp_out = String( tmpbuf );

    dtostrf( g_temp_in_avg, 2, 1, tmpbuf );
    String temp_in_avg = String( tmpbuf );
    dtostrf( g_temp_out_avg, 2, 1, tmpbuf );
    String temp_out_avg = String( tmpbuf );

    //{ "t_in": 23.1, "t_out":45.6, "seq":65000 }
    String msg = "{\"id\":\"ztatz_dt\",\"version\":" + String(VERSION) + ",\"t_unit\":\"C\"";
    msg = msg + ",\"t_in_avg\":" + temp_in_avg +
            ",\"t_out_avg\":"    + temp_out_avg + 
            ",\"t_in\":"         + str_tmp_in +
            ",\"t_out\":"        + str_tmp_out +
            ",\"seq\":"          + sequenceNumber +
            "}";

    sequenceNumber++;
    if ( sequenceNumber > 32768 ) {
        sequenceNumber = 0;  //wrap around to zero.
    }
    return msg;
}

// function to send the temperature via UDP
void udpSendMessage(String msg) {

    //alloc buffer space
    uint8_t bufsize = msg.length() + 1;
    uint8_t buffer[bufsize];
    msg.getBytes( buffer, bufsize );

    udp.beginPacket( udpAddress, udpPort );
    udp.write( buffer, bufsize - 1 ); //skip trailing zero.
    udp.endPacket();
}

// function to calculate the average values, based in AVG_TEMP_ARRAY_SIZE value
void calcAvgTemperature(float in, float out) {
    #define AVG_TEMP_ARRAY_SIZE 30         // takes about 3 secs to get a stable avg value. every 10 units is 1 second
    #define AVG_MAX_DELTA_FOR_REJECT 1.5  // degree Celsius.
    #define AVG_NUDGE 0.1                 // degree Celsius.

    static uint8_t sample_count = 0;
    static uint8_t temp_array_index = 0;
    static float temp_in_array[AVG_TEMP_ARRAY_SIZE];
    static float temp_out_array[AVG_TEMP_ARRAY_SIZE];
    static bool  enough_data = false; // only average values when there is enough data

    // drop values that are out of the range
    // if average buffer is true are set
    if ( enough_data == true) { 
        #ifdef DEBUG
            Serial.print("calcAvgTemperature delta(in)=");
            Serial.print( abs(g_temp_in_avg - in), DEC);
            Serial.print("avg = ");
            Serial.print( g_temp_in_avg , DEC);
            Serial.print("in = ");
            Serial.println( in, DEC);
        #endif
        if ( abs(g_temp_in_avg - in) > AVG_MAX_DELTA_FOR_REJECT ) {
            #ifdef DEBUG
                Serial.print("ERROR: temperature IN value out of expected range=");
                Serial.print( in , DEC);
                Serial.print(" avg=");
                Serial.println( g_temp_in_avg , DEC);
            #endif
            if ( in > g_temp_in_avg ) {
                in = in + AVG_NUDGE;
                #ifdef DEBUG
                    Serial.println("IN value nudged up.");
                #endif
            } else {
                in = in - AVG_NUDGE;
                 #ifdef DEBUG
                    Serial.println("IN value nudged down.");
                #endif
            }

        } // end of in value

        if ( abs(g_temp_out_avg - out) > AVG_MAX_DELTA_FOR_REJECT ) {
            #ifdef DEBUG
                Serial.print("ERROR: temperature OUT value out of expected range = ");
                Serial.print( out , DEC);
                Serial.print(" avg=");
                Serial.println( g_temp_out_avg , DEC);
            #endif
            if ( out > g_temp_out_avg ) {
                out = out + AVG_NUDGE;
                #ifdef DEBUG
                    Serial.println("OUT value nudged up.");
                #endif
            } else {
                out = out - AVG_NUDGE;
                 #ifdef DEBUG
                    Serial.println("OUT value nudged down.");
                #endif
            }

        } // end of OUT value

    } else {
        sample_count++;
    }

    // add to array to determine average value.
    // location in the array is not relevant for
    // the average calculation.
    if ( temp_array_index > AVG_TEMP_ARRAY_SIZE - 1) {
        temp_array_index = 0; // reset to start of array
    }
    temp_in_array[temp_array_index]  = in;
    temp_out_array[temp_array_index] = out;
    temp_array_index++;

    //sample_count++;
    if ( sample_count == AVG_TEMP_ARRAY_SIZE ) {
        enough_data = true;
    } else {
        // we don't have enough data so just send current non average value
        g_temp_in_avg  = in;
        g_temp_out_avg = out;
        #ifdef DEBUG
            Serial.print("Not enough data to calculate the average values, need " + String(AVG_TEMP_ARRAY_SIZE) + " sampels. sample_count=");
            Serial.println(sample_count, DEC);
        #endif
    }

    if (enough_data == true) { // ready to calc avg value
        #ifdef DEBUG
            Serial.print("Calculating the average values. sample_count=");
            Serial.println(  sample_count, DEC);
        #endif

        g_temp_in_avg = g_temp_out_avg = 0;
        for (uint8_t i = 0; i < AVG_TEMP_ARRAY_SIZE; i++) {
            g_temp_in_avg  = g_temp_in_avg  + temp_in_array[i];
            g_temp_out_avg = g_temp_out_avg + temp_out_array[i];
        }
        g_temp_in_avg  = g_temp_in_avg  / AVG_TEMP_ARRAY_SIZE;
        g_temp_out_avg = g_temp_out_avg / AVG_TEMP_ARRAY_SIZE;
    }

 
    #ifdef DEBUG
        Serial.print("IN=");
        Serial.print(in,DEC);
        Serial.print(" OUT=");
        Serial.print(out ,DEC);
        Serial.print(" delta(raw)=");
        Serial.println( floatTempFormater(out-in));
        Serial.print("g_temp_in_avg=");
        Serial.print(g_temp_in_avg,DEC);
        Serial.print(" g_temp_out_avg=");
        Serial.print(g_temp_out_avg,DEC);
        Serial.print(" delta(avg)=");
        Serial.println(floatTempFormater(g_temp_out_avg - g_temp_in_avg));
    #endif
}

// function to format float type.
String floatTempFormater(float in) {
    char  tmpbuf[10];
    dtostrf( in, 2, 1, tmpbuf );
    String str = String(tmpbuf);

    if ( str.length() < 4) {
        str = "0" + str;
    }
    return str;
}

// function to fill buffer with offset values to draw a graph.
void fillGraphicBufferValues() {
    uint8_t delta_value = abs(g_temp_in - g_temp_out) * 2; //two pixels is a degree.

    temp_vdelta_arr_graphic[0] = delta_value;
    if  ( temp_vdelta_arr_graphic[0] > 22 ) {
        temp_vdelta_arr_graphic[0] = 22;  // cap maximum graph height.
    }

    for (uint8_t i = DISPLAY_WIDTH - 1; i > 0; i-- ) {
        temp_vdelta_arr_graphic[i] = temp_vdelta_arr_graphic[i - 1];
    }
}

// function to show temperature on display.
void readTemperatures() {
    /* important add or subtract values to make sure both sensors give the right temperature.
        this must be done manualy once! See top of code for temp_in_adjustmend & temp_out_adjustmend
    */

    tempSensors.requestTemperatures();

    float tempCIndex_O = tempSensors.getTempCByIndex(0);
    float tempCIndex_1 = tempSensors.getTempCByIndex(1);

    #ifdef DEBUG
        Serial.print("getTempCByIndex(0) = ");
        Serial.print( tempCIndex_O, DEC);
        Serial.print(" getTempCByIndex(1) = ");
        Serial.print( tempCIndex_1, DEC);
        Serial.print( " delta(raw) = ");
        Serial.println( tempCIndex_O - tempCIndex_1, DEC );
    #endif

    if ( tempCIndex_O > -127 ) {
        g_temp_in = tempCIndex_O + (temp_in_adjustmend);  // error offset.
    }

    if ( tempCIndex_1 > -127 ) {
        g_temp_out = tempCIndex_1 + (temp_out_adjustmend);  // error offset.
    }

    #ifdef DEBUG
        Serial.print("g_temp_in = ");
        Serial.print( g_temp_in, DEC);
        Serial.print(" g_temp_out = ");
        Serial.print( g_temp_out, DEC);
        Serial.print( " delta = ");
        Serial.println( g_temp_in - g_temp_out, DEC );
    #endif

}

// function to print a device address
void printAddress(DeviceAddress deviceAddress) {
    #ifdef DEBUG
        for (uint8_t i = 0; i < 8; i++)
        {
            if (deviceAddress[i] < 16) Serial.print("0");
            Serial.print(deviceAddress[i], HEX);
        }
    #endif
}

// function to set temp device precision.
int setTempPrecision() {
    numberOfDevices = tempSensors.getDeviceCount();
    if ( numberOfDevices < 1 ) {
        #ifdef DEBUG
            Serial.println("Error no temperature sensors found!");
         #endif
        return 0;
    }
    // Loop through each device, print out address and set the precision
    for (int i = 0; i < numberOfDevices; i++)
    {
        // Search the wire for address
        if (tempSensors.getAddress(tempDeviceAddress, i)) {
            
            #ifdef DEBUG
                Serial.print("temperature sensors found, index = ");
                Serial.print(i, DEC);
                Serial.print(" with address: ");
                printAddress(tempDeviceAddress);
                Serial.println();

                Serial.print("Resolution set to ");
                Serial.print(TEMPERATURE_PRECISION, DEC);
                Serial.println(" bits.");
            #endif
            // set the resolution to TEMPERATURE_PRECISION bit (Each Dallas/Maxim device is capable of several different resolutions)
            tempSensors.setResolution(tempDeviceAddress, TEMPERATURE_PRECISION);
            #ifdef DEBUG
                Serial.print("Actual resolution set to : ");
                Serial.print(tempSensors.getResolution(tempDeviceAddress), DEC);
                Serial.println();
            #endif

        } else {
            #ifdef DEBUG
                Serial.print("Ghost device at address: ");
                Serial.print(i, DEC);
                Serial.print(" address not found, check power supply and cabling.");
            #endif
        }
    }
    return numberOfDevices;
}

Afstellen van de temperatuur sensors.

De sensors die ik gebruikt heb voor het testen wijken soms wel 1 graad Celsius of iets meer af van de werkelijkheid. Als je het belangrijk vindt dat de juiste temperatuur wordt aangeven dan kun je de sensors ijken. Dit kan via de UTP berichten of via de seriële logging van de Arduino IDE. Als je de seriële logging wil gebruiken dan moet je de DEBUG activeren door de // voor //#define DEBUG 1  te verwijderen.


   Serial.print(" in =");
   Serial.print(in,DEC); 
   Serial.print(" out =");
   Serial.print(out ,DEC); 
   Serial.print(" delta(raw) =");
   Serial.print( floatTempFormater(out-in));
   Serial.print(" temp_in_avg =");
   Serial.print(temp_in_avg,DEC);
   Serial.print(" temp_out_avg =");
   Serial.print(temp_out_avg,DEC);
   Serial.print(" delta(avg) =");
   Serial.println(floatTempFormater(temp_out_avg - temp_in_avg));
   

Met de twee variabelen temp_in_adjustmend en temp_out_adjustmend kun je de aanpassingen doorvoeren. Het is een kwestie van testen en aanpassen, testen aanpassen, enz. Het werkt het eenvoudigst als je eerst zorgt dat dezelfde waarde aangeven en daarna de waarde voor de werkelijke temperatuur aangeeft door bij beide dezelfde waarde aan te passen. Ik heb beide sensoren met duct tape bij elkaar geplaatst en in een doek gedaan tegen tocht e.d.

const float temp_in_adjustmend  =  0.36;
const float temp_out_adjustmend =  1.4;

UDP berichten

De UDP berichten zijn in JSON formaat.

{
"id":"ztatz_dt",
"version":1.0,
"t_unit":"C",
"t_in_avg":24.1,
"t_out_avg":22.0,
"t_in":24.298,
"t_out":22.150,
"seq":24464
}
  •  id: geeft de unieke naam aan van het type bericht.
  • version: versie van het bericht, in de toekomst kan het bericht uitgebreid worden.
  • t_unit: C is graden Celsius.
  • t_in_avg: de gemiddelde temperatuur in over de afgelopen 3 seconden.
  • t_out_avg: de gemiddelde temperatuur uit over de afgelopen 3 seconden.
  • t_in: de ruwe temperatuur in, wordt elke 0.1 seconde gemeten.
  • t_uit: de ruwe temperatuur uit, wordt elke 0.1 seconde gemeten.
  • seq: volgorde nummers van het bericht met een waarde van 1 tot 32768. Als de waarde 32769 wordt bereikt dan is het volgende nummer 1. Bij een reboot wordt altijd gestart met de waarde 1. Het doel is dat ontvangers kunnen vaststellen of ze een waarde al gehad hebben of er een gemist.

Onderstaande code geeft een simpele voorbeeld hoe je met Python de berichten kunt uitlezen.

#!/usr/bin/python

import socket
import time
import datetime

# bind all IP
HOST = '0.0.0.0' 
# Listen on Port 
PORT = 30721 
#Size of receive buffer   
BUFFER_SIZE = 1024    
# Create a TCP/IP socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# Bind the socket to the host and port
s.bind((HOST, PORT))
while True:
    # Receive BUFFER_SIZE bytes data
    # data is a list with 2 elements
    # first is data
    #second is client address
    data = s.recvfrom(BUFFER_SIZE)
    if data:
        #print received data
        print( datetime.datetime.fromtimestamp(time.time()).strftime('%H:%M:%S') +' ' + str(data[0]) )
# Close connection
s.close()

110 Replies to “ESP32DeltaTemp”

  1. Vandaag 2 nieuwe Heletc ESP binnen (WIFI kit 32) orgineel van Heltec.
    Ik merkte alleen dat het een nieuwe versie V3 is.

    Het uploaden gaat goed. Daarna is het over zonder fout meldingen zie hier onder.
    Geen display, een demo geinstellrd en die werken dus display is goed.

    is het een fout aan mijn kant of de versie van Heltec V3.

    ================== log installer ===========================

    Sketch uses 683121 bytes (52%) of program storage space. Maximum is 1310720 bytes.
    Global variables use 40012 bytes (12%) of dynamic memory, leaving 287668 bytes for local variables. Maximum is 327680 bytes.
    esptool.py v3.3
    Serial port /dev/cu.SLAB_USBtoUART
    Connecting….
    Chip is ESP32-S3
    Features: WiFi, BLE
    Crystal is 40MHz
    MAC: f4:12:fa:4f:79:94
    Uploading stub…
    Running stub…
    Stub running…
    Changing baud rate to 921600
    Changed.
    Configuring flash size…
    Flash will be erased from 0x00000000 to 0x00003fff…
    Flash will be erased from 0x00008000 to 0x00008fff…
    Flash will be erased from 0x0000e000 to 0x0000ffff…
    Flash will be erased from 0x00010000 to 0x000b6fff…
    Flash params set to 0x023f
    Compressed 15008 bytes to 10328…
    Writing at 0x00000000… (100 %)
    Wrote 15008 bytes (10328 compressed) at 0x00000000 in 0.3 seconds (effective 360.6 kbit/s)…
    Hash of data verified.
    Compressed 3072 bytes to 129…
    Writing at 0x00008000… (100 %)
    Wrote 3072 bytes (129 compressed) at 0x00008000 in 0.1 seconds (effective 422.8 kbit/s)…
    Hash of data verified.
    Compressed 8192 bytes to 47…
    Writing at 0x0000e000… (100 %)
    Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.1 seconds (effective 635.7 kbit/s)…
    Hash of data verified.
    Compressed 683504 bytes to 453636…
    Writing at 0x00010000… (3 %)
    Writing at 0x0001502b… (7 %)
    Writing at 0x0001bbbc… (10 %)
    Writing at 0x00026823… (14 %)
    Writing at 0x00032698… (17 %)
    Writing at 0x00037ba5… (21 %)
    Writing at 0x0003d759… (25 %)
    Writing at 0x00042f88… (28 %)
    Writing at 0x00048155… (32 %)
    Writing at 0x0004d150… (35 %)
    Writing at 0x00051f39… (39 %)
    Writing at 0x00056e5a… (42 %)
    Writing at 0x0005bd80… (46 %)
    Writing at 0x00060dce… (50 %)
    Writing at 0x00065fbb… (53 %)
    Writing at 0x0006bc7b… (57 %)
    Writing at 0x00070ab9… (60 %)
    Writing at 0x00075b3d… (64 %)
    Writing at 0x0007aaa4… (67 %)
    Writing at 0x0007ff38… (71 %)
    Writing at 0x0008537b… (75 %)
    Writing at 0x0008aea4… (78 %)
    Writing at 0x00090689… (82 %)
    Writing at 0x00096952… (85 %)
    Writing at 0x000a0e6f… (89 %)
    Writing at 0x000a7cfb… (92 %)
    Writing at 0x000ad44f… (96 %)
    Writing at 0x000b2b13… (100 %)
    Wrote 683504 bytes (453636 compressed) at 0x00010000 in 9.6 seconds (effective 571.9 kbit/s)…
    Hash of data verified.

    Leaving…
    Hard resetting via RTS pin…

      1. Hoi Getopmac,

        Wat ik mij kan voorstellen is dat bij een nieuwe versie (v3) er ook nieuwe ontwikkel bibliotheken zijn die in de Ardino omgeving moet worden ingelezen.
        Kijk eens hier, wellicht helpt je dat.
        https://docs.heltec.org/en/node/esp32/quick_start.html

        Maar ik schreef al eerder, een display is leuk maar daar kijk je toch niet op.
        Ik heb een ESP32 Wroom (met natuurlijk die bibliotheek bestanden die bij de Wroom horen) in gebruik en werkt prima.
        Bijkomend voordeel is: veel goedkoper dan de Heltec.
        andere tip, ik gebruik ook de ESP32 Breakout Board ESP32 Expansion Board 38Pin Ontwikkeling Board met Draadloze WiFi Bluetooth voor ESP-WROOM-32

        https://www.amazon.nl/XTVTX-Expansion-Ontwikkeling-ESP-WROOM-32-Microcontroller/dp/B0BCWBW4SR/ref=sr_1_5?__mk_nl_NL=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=1MCEKWXB4BUDK&keywords=ESP32+Breakout+Board+ESP32+Expansion+Board+38Pin+Ontwikkeling+Board+met+Draadloze+WiFi+Bluetooth+voor+ESP-WROOM-32&qid=1672511642&sprefix=esp32+breakout+board+esp32+expansion+board+38pin+ontwikkeling+board+met+draadloze+wifi+bluetooth+voor+esp-wroom-32%2Caps%2C44&sr=8-5

        hoef je (bijna) niet te knutselen. alleen power aansluiten en klaar (wel de verbindingen leggen die op t schema staat.
        Ik heb er een foto van maar kan die niet uploaden hier 🙁

        Succes

              1. Hoi gekopmac,

                Nee, dat printje heb ik niet zelfgemaakt.
                Kan je kopen b.v via Amazon of ali (maar bij ali duurt het opsturen dan 3 weken)
                Zie mijn vorige post. daar staat de link naar Amazon.
                Ik heb er gelijk twee gekocht. 1 nu in gebruik en die andere om wat te kunnen prutsen

            1. Hallo William,
              ik had bijna alles binnen alleen de breakoutboad is de verkeerde nieuwe besteld.
              Heb jij ook de sketch aangepast ik krijg fouten omdat er geen display aan zit.moet ik alles van Ug2 verwijderen.

              Henk

              1. Ik ben als volgt te werk gegaan:
                De scetch kopieer en plak ik in de arduino IDE.
                Daarna voeg ik de aanvulling toe, zoals beschreven is het forum onder
                “Nieuwe versie ESP32DELTATEMP” van secbro. (niet noodzakelijk)
                Vervolgens pas ik de ssid en pwd aan.

                Voor het compileren moeten de juiste bibliotheek bestanden geladen worden.
                ik volg daarvoor https://randomnerdtutorials.com/installing-the-esp32-board-in-arduino-ide-windows-instructions/
                Na deze aanvulling, via tools, board manager, instaleer ik de esp32 bibliotheken.
                Staat goed uitgelegd in de link. Ik ga er vanuit dat je deze stappen doorlopen hebt.
                In tools, board, board manager kies esp32. In mijn geval de ESP32-WROOM-DE-Module
                Nu moeten de additionele bibliotheken toegevoegd worden voor de ESP32.
                OneWire, U8G2 (van olivier) en DallasTemperature
                Ik let er daarbij op dat in de tekst iets staat over ESP, maar is geen garantie.

                Nu kan je compileren, althans bij mij lukt het zonder errors.
                Mijn temperatuur sensors liggen op het bureau gebroederlijk naast elkaar.
                Hierna pas ik de regel aan “const float temp_in_adjustmend” zodat beide temperatuur sensors gelijke waardes aangeven. een verschil van 0,1 graad is voor mij acceptabel.

                Wellicht helpt dit overzicht je weer verder.
                (zojuist op een test ESP uitgeprobeerd)

          1. hier de debug log.

            ESP-ROM:esp32s3-20210327
            Build:Mar 27 2021
            rst:0x1 (POWERON),boot:0x8 (SPI_FAST_FLASH_BOOT)
            SPIWP:0xee
            mode:DIO, clock div:1
            load:0x3fce3808,len:0x43c
            load:0x403c9700,len:0xbec
            load:0x403cc700,len:0x2a3c
            SHA-256 comparison failed:
            Calculated: dcde8d8a4817d9bf5d5d69a7247667264e4e10ac7493514868b61f5aa6146539
            Expected: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
            Attempting to boot anyway…
            entry 0x403c98d8
            E (15)

            1. Ik kan je hier niet mee helpen. Ik denk dat het een bibliotheek probleem kan zijn. Maakt de code wat kleiner of maakt een klein test script om te zien waar het mis gaat.

    1. Welke boardkies je in Arduino IDE. Het lijkt net of je de ESP32-S3 hebt gekozen en niet de Heltec WiFi Kit 32

      1. Hoi Ron,

        Klopt idd. Ik hen een ESP32 gekozen en niet die Heletc.
        Zie mijn eerdere post.
        Ik krijg die Heletc niet aan WiFi. Waarschijnlijk een Chinese kloon o.i.d. Kon zo de prullebak in.
        Maar omdat de EPS32DeltaTemp toch in de meterkast geplaatst is, kijk je niet op het display.
        Dus is een “gewone” ESP32 net zo goed (en goedkoper)

        1. Oke. Maar ik dacht dat je aangaf dat je een nieuwe Heltec ESP had binnen gekregen:
          Vandaag 2 nieuwe Heltec ESP binnen (WIFI kit 32) orgineel van Heltec.
          Ik merkte alleen dat het een nieuwe versie V3 is.

        2. Mijn reactie was bedoeld voor de post van gekopmac ;-). Die gaf aan een nieuwe Heltec v3 te hebben ontvangen en die gebruik volgens mij de verkeerde board.

          1. Ik heb beide geprobeerd en maakt niets uit. De demo’s van de wifikit 32 en van Heltec werken allemaal, behalve de dallastemp werkt niet geen display. De oude werkt nog steeds maar valt afwisselend en moet gereset worden soms na dagen nog weken, heb dan geen IPadres meer. Dus nu maar een en nieuwe.

  2. Beste Security Brother,

    Wellicht kan je mij verder helpen ?
    de ESP32DeltaTemp wil niet connecten aan mij WiFi netwerk.
    de debugger laat telkens hetzelfde zien
    (moet ook wel, anders zou de connectie wel lukken :-))
    hier de output van de seriele monitor
    12:52:57.958 -> temperature sensors found, index = 0 with address: 28800E75D0013CBF
    12:52:57.958 -> Resolution set to 12 bits.
    12:52:57.958 -> Actual resolution set to : 12
    12:52:58.007 -> temperature sensors found, index = 1 with address: 28141A75D0013CB1
    12:52:58.007 -> Resolution set to 12 bits.
    12:52:58.007 -> Actual resolution set to : 12
    12:52:58.587 -> getTempCByIndex(0) = 21.3750000000 getTempCByIndex(1) = 21.3125000000 delta(raw) = 0.0625000000
    12:52:58.587 -> g_temp_in = 22.5750007629 g_temp_out = 22.7024993896 delta = -0.1274986267
    12:52:58.587 -> Connecting to the WiFi network: FRITZ!Box 5490 KE
    12:52:59.619 -> WiFiEvent: 0
    12:52:59.713 -> WiFiEvent: 2
    12:53:02.813 -> WiFiEvent: 5
    12:53:02.813 -> Lost WiFi connection..
    12:53:02.861 -> WiFiEvent: 3
    12:53:02.861 -> WiFiEvent: 0
    12:53:02.861 -> WiFiEvent: 2
    12:53:05.924 -> WiFiEvent: 5
    12:53:05.924 -> Lost WiFi connection..
    12:53:06.019 -> WiFiEvent: 3
    12:53:06.019 -> WiFiEvent: 0
    12:53:06.019 -> WiFiEvent: 2
    12:53:09.126 -> WiFiEvent: 5
    12:53:09.126 -> Lost WiFi connection..

    In welke hoek moet ik zoeken ?

    Groet,

    William

    1. Mijn eerste gok zou zijn dat je een 5GHz wifi netwerk hebt en de ESP32 doet alleen 2.4Ghz wifi. Of je router heeft een allowlist aanstaan o.i.d.

      1. Goedemiddag Security Brother,

        Ik heb een 2.4 en 5 Ghz netwerk. gewoonlijk werkt dat zoals het hoort.
        De ESP32 kan idd alleen 2.4 aan.
        Ik heb geen block of allow ingesteld. ook daar zit het niet.
        Ik heb eenmaal de Heltec zien werken op het netwerk en na een nacht was de verbinding weer weg.
        Dat merk je pas laat omdat op de app de oude waarden blijven staan.
        Wellicht een idee om na 10 mislukte pogingen de waardes op 0 te zetten

        Ik heb een andere ESP32 (wroom) geprobeerd.
        Deze is zonder beeldscherm, maar je moet toch wat
        Die werkt gelijk.
        De fout zit dan toch in de Heltec ESP32. een chinese miskoop waarschijnlijk. (via amazon aangeschaft)

        Nou is dat beeldscherm niet de show-stopper dus ka verder met de ESP32 die ik al heb liggen.

        Tot zover de terugkoppeling

        Dank voor het mee denken.
        Groet,

        William

        1. Weer wat verder zitten spitten (irriteert mij toch wel :-))
          BTW, een power aansluiting met meer vermogen hielp niets. Jammer. wel een goede tip. had nog een oude 10 watt iPhone lader liggen.

          Met wireshark zitten kijken wat er nou precies gebeurd.
          Mij valt op dat er geen IP adres wordt opgevraagd. ik zie alleen LLC pakketjes vanaf de ESP komen.
          Met de andere ESP32 (zonder display) een versie gecompileerd.
          Met WireShark zie in nu een ARP die als antwoord een IP adres krijgt.
          Daarna keurig de UDP meldingen.
          (wat ik overigens vreemd vindt is , ik zie geen DHCP pakketjes. Zullen wel instellingen in WireShark zijn)

          Kortom, die Heltec ESP32 kan de vuilnisbak in

          Groet,

          William

  3. Met succes deze moduul geplaatst en kan nu de temperatuur van de cv installatie meten met de apple app alleen vraag ik mij af of er de mogelijkheid bestaat om het programma zo te veranderen dat door een solidstate aan te sluiten de pomp van de vloerverwarming geschakeld kan worden bij een in te stelen minimum temperatuur van de aan voer leiding die toch al gemeten wordt.kan het elektrisch wel maken maar programmeer kennis ontbreek

      1. Hallo SB, De pomp van de vloerverwarming moet je nu zomers uitzetten, maar helemaal mooi zou het zijn om dit automatisch te doen aan de hand van de temperatuur van de aanvoerleiding van de cv installatie die ik nu meet met het temperatuur moduul (die er toch al bij is geplaatst) zoal ik al opmerkte kan ik het wel elektrisch bouwen met print en dergelijke maar het programmeren is een heel groot struikel blok offerwijl die kennis ben ik niet meester misschien hebben hier meer mensen interesse in zodat het project uitgebreid kan worden in fijte een pompschakelaar toevoegen.verder een zeer mooi project duidelijk en grafisch bijzonder duidelijk ook de apple app gekocht voor een perfect resultaat

        1. bedankt voor de support en het kopen van de app. Je verzoek is toegevoegd aan de roadmap.

        2. je moet een pomp schakelaar er tussen zetten die het doet op de temperatuur van de CV met een clip wat rond e leidingen gaat.
          die zijn voor heel weinig geld te koop en werken prima.

          voordeel daarvan is ook dat de pomp iedere 24 uur ff aangezet wordt zodat die niet vast loopt na een paar maanden.

  4. Afgelopen week alles gekocht en geplaatst zoals hier omschreven en werkt allemaal prima. Meet nu toevoer en het retour temperatuur van mijn CV. Soms meet ik van 1 sensor af en toe spikes (zal wel aan de kwaliteit van de sensor liggen?).

    Handig dat er een optie is om het scherm uit te zetten!

    Bedankt voor duidelijke tutorial en code!

    1. Ik ben op de hoogte van de spikes en in de volgende versie komt een optie om die te onderdrukken.

  5. Hallo allemaal,
    Ik heb een heel klein maar wel vervelend probleem met de esp32 delta, afwisselend heb ik geen temp. meer. Kan il op ESP dan heb ik geen IP adres meer 0.0.0.0 steker er uit even wachten steker er in en alles werkt weer voor een paar dagen (weken) en dan begint alles weer opnieuw ip 0.0.0.0 kan ik dit ergens mee oplossen?

    1. Ik zet het op de roadmap om de software aan te passen dat er periodiek geprobeerd wordt de wifi verbinding op te bouwen. Echter ik denkt eerder dat je een wifi probleem hebt of een ESP32 waar de Wifi niet lekker van werkt. Normaal blijft dit maanden werken. Ik heb hier een ESP32 doe al aan maanden draait en waar het access point al een paar keer herstart is zonder een enkele onderbreking.

      bezoek forum.p1monitor.nl

  6. P1 monitor geweldig incl de solaredge koppeling.
    Gebruik versie 1.3.1
    Krijg echter de temperaturen (verwarming) niet zichtbaar op de P1 monitor. Bijven op 10 graden staan beide . Op de Heltec zijn ze wel zichtbaar. Geen fout bij opstarten op Heltec.
    UDP broadcast deamon staat aan.
    iemand enig idee??

    1. Je kunt controleren of er UDP berichten je netwerk op gaan daar zijn diverse tooltje voor. Je moet dan luisteren op poort 30721. Voor iOS gebruik ik UdpDebugger maar zijn vast andere tools. WireShark is ook een dergelijke tool maar vergt wat meer kennis.

      Daarnaast kun controleren of het proces voor het ontvangen op de Rpi actief is. Ik denk niet dat dit het probleem is. Doe dit door in te loggen en het volgende commando in te voeren:

      netstat -an|grep 30721 als alles goed werkt dan krijg als antwoord udp 0 0 0.0.0.0:30721 Mocht dit niet zo zijn dan kun je de software herstarten door in de folder /p1mon/scripts het commando ./p1mon.sh ./p1mon.sh restart

      1. Tja als je (ik) niet goed kijkt naar het Heltec display kon ik zien dat er geen verbinding was met een wifi router. Gaf 0.0.0.0. Had verkeerde ssid opgegeven.
        Geweldig, alles werkt gewoon. Nu op naar de watermeter.
        Thnxs

  7. Leuk project, ik heb hem vrij snel goed gekregen. Wilde ook een ijking uitvoeren met ijs en water in een isolatie beker, maar liep tegen dezelfde fout aan die al gemeld was hier. Dus we ijken even tegen een andere goede thermometer. Een ijking op 0 graden van smeltend water is mogelijk zo’n gek idee niet.
    Verder had mijn board aansluitingen anders dan op het getekende voorbeeld. Het is bij mij ground, 3volt er direct naast. Dus goed opletten bij de pin bezettingen. Nu nog koppelen aan de p1mon. Leuk project en eens verder kijken wat er mee kan.
    De heltec board drivers toevoegen niet vergeten, en de drivers voor de compoort
    https://heltec-automation-docs.readthedocs.io/en/latest/general/establish_serial_connection.html

    Groet eelco

  8. Ik heb alle componenten besteld, maar ik snap niet goed hoe ik de data van het bordje op de P1monitor kan krijgen en dus de temperatuur op P1 monitor kan uitlezen.

    1. Als je de software op het ESP32 hebt gezet, de sensoren aangesloten en de Wifi goed hebt ingesteld dan zal het boardje elke 10 seconden een UDP bericht op je netwerk zetten. De P1 monitor leest dat uit. In het setup menu (config-ui.php) zet je de optie “verwarming” aan.

  9. mijn probleem denk ik.

    Alles in elkaar geknutseld en werkt mooi leuk project maar ik wil de sensor ijken, neem een glas met ijsblokjes
    hang de sensors er in dan wachten dat het ijs wacht gesmolten is (ijswater) de temp zakte niet naar 0 graden dus de regels aangepast naar:

    const float temp_in_adjustmend = -2.8;
    const float temp_out_adjustmend = -3.1;

    de temp was nu op beide sensoren 00,0 graden perfect dat is geregeld, kijk ik in de log files om de de App en de web verkeerde waardes aangaf staat de P1UdpBroadcaster.log vol met fouten over een delimiter 73 fout.
    min teken verwijderd en de fouten ook, alleen de temperatuur is nu te hoog bij 00.0 graden.
    kan/mag de adjustment niet negatief zijn? Ik wil graag ee reële temp hebben.

    Door het geknutsel zag ik ook dat bij het starten van de ESP32 geen wifi connectie werd gemaakt, spanning er af en weer aan en het werkt weer naar het drukken van de reset knop idem na eerste keer starten geen wifi
    spanning er af en weer aan alles weer goed.

    Verder geen problemen een prachtig project.

    Henk

    1. Bedankt voor het compliment. De ESP32Deltatemp was/is bedoeld voor het meten van de kamertemperatuur. Er is geen rekening gehouden met negatieve temperaturen. In de volgende versie wordt deze wel ondersteund. Voor het ijken van de sensoren heb ik ze beide samen met een gevoelige temperatuurmeter in een stuk isolatieschuim geplaatst en rond kamertemperatuur gecorrigeerd. Bij een update van de ESP32Deltatemp zal deze temperaturen onder nul kunnen verwerken.

  10. Beste knutselaars,
    ik heb alle onderdelen binnen, software geïnstalleerd. Ik zit met een probleem de montage van het geheel in het kastje. als ik de ESP op de print bevestig kan ik niet meer de aansluit benamingen zien. ik wil het display wel zichtbaar hebben, zijn er misschien wat foto’s beschikbaar van hoe jullie dat hebben op gelost, heb een 3d printer, maar waarom het wiel uitvinden als er al iets is wat bruikbaar werkt. Ik doe het liever in een keer goed.

    Help mij een klein beetje op de goede weg

  11. Hoi allemaal

    erg mooi systeem P1 Monitor heb nu een paar dagen draaien.
    hier hebben we ook vloerverwarming dus was aan het kijken naar de espdeltatemp.

    ik vroeg me alleen af of mensen iets van voorbeelden hebben hoe ze de sensor hebben bevestiging aan de in en uitgang. is hier veel loodgieterswerk voor nodig? hoe krijg je het water dicht? wellicht mensen een foto?

    alvast bedankt..

    1. Bedankt voor het compliment. Ik heb zelf vloerverwarming en het als volgt opgelost. Je maakt de sensor met tieraps vast op de vloerverwarming verdeelblokken. De meting wijkt daardoor iets af van de echte temperatuur maar dat is in mij geval geen probleem.

    2. Hallo allen,
      ik heb de onderdelen ook binnen voor de temp meting de esp werkt met de melding wacht op sensors, kastje is onderweg nu de sensoren hoe gaan we dat doen: losse draadjes er aan sensors krimpkous er om hen dan op de leiding of is er een betere oplossing. Het moet wel een permanente oplossing zijn.

  12. Hallo Security Brother,

    Mooi stukje software. Leuk om mee te spelen.
    Ik heb wel even wat moeten stoeien om de software aan de praat te krijgen. Ik kreeg geen output op het scherm te zien en had grote problemen om te verbinden met de wifi.

    De aansturing van het scherm is volgens mij veranderd met een update u8g2 library. De poortparameters staan in een andere volgorde. Toen ik deze regel veranderde:
    U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=/ 16, / clock=/15, / data=*/4); // (rotation, [reset [, clock, data]])

    in

    U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=/ 15, / data=/ 4, / reset=*/ 16);

    werkte het scherm wel.

    Voor de wifi heb ik de code iets aangepast en ik heb ook de timer functionaliteit ingebouwd. Verder heb Ik ook een controle ingebouwd om te kijken of je een ongeldige code terug krijgt van de sensors. Volgens de documentatie krijg je dan de output -127 terug. Mogelijk voorkomt dit de ongewenste spikes die andere mensen rapporteren.

    Er staat ook een klein foutje in de declaratie van pseudo_secs. Deze wordt als static uint8_t gedeclareerd.
    Een uint8_t variabele kan nooit groter worden dan 255. In de code controleer je wanneer deze groter wordt dan 599. Dat wordt hij dus nooit, vanwege de uint8_t :-). Als je dit veranderd in uint16_t werkt het wel.

    Als je wilt, stuur ik de aangepaste code naar je toe.

    1. Bedankt voor het uitzoekwerk. Ik ontvang de code graag. Op dit moment ben ik nog bezig met de Solar Edge Zonnepanelen koppeling. Zo gauw ik weer tijd heb ga ik hier mee aan de gang. Als je een Dropbox/WeTransfer link wil delen met aangepaste code dan graag.

      1. Hier is de link:

        Ik heb de 4e menu keuze (leeg scherm) uit het keuze menu gehaald. Deze heeft nu weinig toegevoegde waarde.

  13. Beste.. Ik heb een vraag over de temperatuur meting. Ik gebruik hem voor de meting van de buitentemperatuur en een kasttemperatuur waar een server in staat. Nu zie ik dat de uitlezing op het display 3 graden is terwijl de uitlezing op de P1monitor niet onder de 10 graden komt. Is er in een ondergrens in het programma gezet en zo ja kan die aangepast zodat ik ook een uitlezing onder 0 graden kan zien.

    1. Bedankt voor je melding, de oplossing was bedacht voor kamertemperatuur en niet voor buitengebruik. Ik snap echter je wens en hij staat op de roadmap. De sensor kan tot -55 dus het is technisch mogelijk.

  14. Hallo Allen,

    ik heb en probleem met de WiFi.h.
    het lijkt er op dat de “WiFi.onEvent(WiFiEvent);” niet meer in the WiFi.h zit.
    ik heb in de code gekeken van de WiFi library en kan het niet meer vinden.
    denk zelf dat ik een oudere versie moet isntalleren van WiFi’h in de library.
    kan iemand mij verder helpen?

    groetjes,
    Mark

    1. Hallo Mark,

      Ik heb recentelijk ook een heltec esp32 aangeschaft. Ik ondervond ook allerlei problemen met het compileren van de software. Wat voor mij uiteindelijk hielp was de Heltec board informatie van Heltec zelf te gebruiken. Ik heb deze instructies gevolgd, behalve het installeren van de library:
      https://heltec-automation-docs.readthedocs.io/en/latest/esp32+arduino/quick_start.html#via-arduino-board-manager

      Die veroorzaakte bij mij ook allerlei problemen met de wifi library.

      Hopelijk heb je hier iets aan.

  15. Ben al geruime tijd een zeer tevreden gebruiker van de ESP32DELTATEMP.
    De 2 sensoren heb ik bij de CV-ketel op de “aanvoer” en de “retour” aangelegd en heb inmiddels de nodige meetwaarde’s mogen noteren. Leuk om te zien wat de Delta T is middels CV-tuning. De CV gaat nu naar max 55 graden (ingesteld) echter zie ik dat ik max 50 heb aangevoerd en retour van 40. Dus toch een delta van 10 graden! En ik behaal de max instelling van cv-ketel niet eens. (en het is niet koud in huis)

    Wel had ik wat opstart problemen met de sensoren… zo af en toe had ik waarde van -256 graden. Na wat speurwerk zou ik de sensoren kunnen vervangen (al 4 keer gedaan), maar heb uiteindelijk de code aangepast op de ESP32DELTATEMP.
    Nu is alle waarde boven de 10 ingelezen. Alles onder de 10 wordt niet meegenomen in de meetwaarde.

    De aanpassing:
    if (tempSensors.getTempCByIndex(0) > 10) {temp_in = tempSensors.getTempCByIndex(0)+ (temp_in_adjustmend); } // error offset.
    if (tempSensors.getTempCByIndex(1) > 10) {temp_out = tempSensors.getTempCByIndex(1)+ (temp_out_adjustmend); } // error offset.

    —HET DISPLAY—
    Nu zit ik alleen nog met een andere uitdaging. Het display op de ESP32DELTATEMP brand in of wordt onleesbaar.
    Ik ben inmiddels met de 3e ESP32 bezig. Nu kan je het display uitzetten door te schakelen tussen de weergave.
    Echter bij storing of stroomuitval start het display weer op.

    Idee: Is het mogelijk of weet iemand een stukje code om een time out van, zeg 5 minuten, aan het display te geven?
    Zodat het display na 5 minuten uitgaat en doormiddel van een aanraking van, een andere ingang dan het switchen van weergave, of ook de display wissel touch, weer 5 minuten aan is.

    1. Het staat op de roadmap, je kan de code aanpassen dat als bij de wisseling van x tijd (cyli) het scherm wordt uitgezet. Dit werkt dan ook bij een spanningsuitval.

      1. Heb je een code voorbeeld of een linenummer? Dan ga ik die proberen in te bouwen, mooiste is dat ie na 5 min op blank gaat en indien de touchbutton aangeraakt wordt scherm wakker wordt. Dan denk ik heb je een prima oplossing, die ook scherm wat langer mee laat gaan.
        Echt top projectjes…

        1. Klopt ik een “screensaver” komt om de volgende versie. Na een jaar of twee ziet het schermpje er niet meer uit. Het wordt dan iets dat het scherm na de laatste schakel actie na een paar minuten uit gaat. Een code line kan je nu niet echt geven.

  16. Maar ik zie sterke fluctuaties in de IN temperatuur. UIT blijft mooi stabiel. Ik heb al andere DS18B20 sensors geprobeerd en zie dan ook fluctuaties tussen 0,4 en 20 graden. In de grafiek zie ik ook regelmatig spikes.
    Ervaren andere dit ook?

    1. ik heb tot nu toe 1 keer een spike gezien in de afgelopen dagen met een DS18B20
      niet op de espdeltatemp maar op mijn eigen brouwsel. die ging overigens naar 85 graden.

      ik schrijf momenteel 4 DS18B20 sensors weg naar een maria DB en met grafana maak ik een gafiekje er van.

      dit moeten er uiteindelijk 8 sensoren worden die weg geschreven gaan worden.
      ik wil alle temperaturen gaan meten in de buurt van mijn verwarmins ketel en warmtepomp
      ingaand, uitgaand van de buiten unit.
      ingaand en uitgaand van de rookgassen van de ketel zelf
      ingaand en uitgaand van het water wat naar de radiatoren gaat
      woonkamer temp en buiten temp.

      hoeft niet mooi te zijn, zolang het maar functioneel is.

      ik heb het gevoel dat mijn warmtepomp niet goed ingesteld staat.

    2. Dit komt bij mij ook voor, heb beide DS18B20 al gewisseld en ook al een andere Heltec ESP32 uitgeprobeerd, daar zit het probleem niet in. Het is heel random, een dag niet en dan zelfs een paar keer per uur.

    3. Hi Edwin

      Ik had ook spikes en dit kwam door slechte gnd (soldeerfoutje) de fluctuaties zouden heel goed veroorzaakt kunnen worden door de voeding. zelf heb ik dit gezien toen ik usb power van een goedkoop power blokje te gebruiken als ik iphone lader gebruik zie ik geen fluctuaties meer.

  17. Mooie aanvulling! Onderdelen besteld, in elkaar gezet en werkte direct. Bedankt voor de heldere uitleg.

  18. Tot heden werkt alles keurig. Al is het soms voor mijzelf wat verwarrend met de temperatuur meters In en UIT.
    Kan er een optie komen met de keuze IN / UIT en AANVOER / RETOUR .
    IN is bij ketel de retour en UIT weer de aanvoer. Meet ik bij een radiator heb ik gauw de neiging IN als aanvoer aan te sluiten terwijl dat de retour moet zijn.

      1. Onder 1 temperatuurmeter Aanvoer onder de ander Retour. Bv in het Display menu een vinkje keuze aanvoer/retour of In/Uit. Dat zou perfect zijn. Zo blijft voor degene die binnen en buiten willen meten ook hetzelfde.

  19. Ten eerste bedankt voor dit mooie project.
    P1 monitor draait hier nu 2 maanden en ben er erg blij mee.
    Sinds 2 dagen heb ik de watermeter uitlezing er ook bij geknoopt en ben nu druk bezig met de temp sensors.
    Ik heb hier de ESP32 wifi kit 32 en krijg het niet helemaal voor elkaar.
    Bij het opstarten van de ESP32 zie ik ZTATZ.nl daarna krijg ik de melding wachten op temperatuur sensors en dan krijg ik de 2 temperaturen in het scherm.
    Ik mis dus het wifi gebeuren.
    Ik heb alle lib toegevoegd maar ik krijg het niet voor elkaar.
    Ik ben hier niet erg handig in en zal dus wel iets vergeten zijn.
    Mijn ssid en ww heb ik ingegeven.

    1. Mijn eigen domme fout, ik had de ssid en ww achter de // gezet i.p.v. tussen de haakjes.
      Het werkt 🙂

  20. Met deze temperatuurmeting loop ik een beetje achter, ik heb het zojuist inelkaar gezet en aangesloten. Het werkt in 1 keer dus super bedankt voor deze mooie aanvulling en de mooie uitleg!!!

    Echter zit ik met 1 klein dingetje, aangezien ik de meetingen niet ga gebruiken voor vloerverwarming maar voor het loggen van binnen en buiten temperatuur. loop ik tegen het probleem dat nu is de buitentemperatuur lager dan 10 gr C. Dat wordt helaas niet getoond op de monitor maar op de ESP32 wordt wel alles correct getoond en berekend.
    Kan ik misschien een setting in de monitor aanpassen dat het ook onder de 10 gr C kan worden getoond en zodat er mee gerekend word?

    bedankt voor een reactie en leuk om weer wat te experimenteren!

    1. Hi Roland,

      Dit moet op te lossen zijn we gaan er naar kijken. Bij de pagina verwarming-a.php zal het inderdaad niet werken of zichtbaar zijn. Voor de ander pagina’s zou het moeten werken verwarming-min.php, verwarming-h.php, enz. Kun je dit bevestigen?

      SecBro.

      1. Hoi SecBro,

        Bedankt voor de snelle reactie 🙂
        Het klopt, enkel de pagia ‘verwarming-a.php’ met de gaugs geeft niet lager aan dan 10 gr C.
        Alle geschiedenis pagina’s geven correcte waarden aan (min, max en avg).
        Misschien is een setting op de configuratie pagina ‘waarden instellen UI elementen’ een optie?
        Nogmaals bedankt en keep up the good work!

        mvg Roland

        1. Hoi Roland

          De functie floatTempFormater zet bij temperatuur onder de 10 graden een voorloopnul voor de string en dit veroorzaakt een ongeldig json bericht waardoor p1monitor stopt met inlezen van de temperatuur.
          Je kan dit oplossen door het blokje van 3 regels met str = “0”+str; uit te commenteren. Het display laat dan ook geen voorloopnul meer zien maar de p1monitor werkt dan wel weer.

          Zelf heb ik de functie gekopieerd en gebruik de originele code voor het display.

          // function to format float type.
          String floatTempFormater(float in) {
          char tmpbuf[10];
          dtostrf( in, 2, 1, tmpbuf );
          String str = String(tmpbuf);

          if ( str.length() < 4) {
          str = “0”+str;
          }
          return str;
          }

          Ik hoop dat dit je helpt

          Siem

          1. thx siem, inderdaad ook wat tijd over verloren, maar met je oplossing komen nu ook temperaturen onder de 10
            graden op de p1 mon.

          2. Als je het eerste stuk van de MakeJsonMessage functie aanpast in het onderstaande werkt het ook. En je behoudt de voorloopnul:

            String makeJsonMessage() {
            static unsigned int sequenceNumber;
            char tmpbuf[8];

            dtostrf( temp_in, 2, 3, tmpbuf );
            String str_tmp_in = String(tmpbuf);
            dtostrf( temp_out, 2, 3, tmpbuf );
            String str_tmp_out = String(tmpbuf);
            dtostrf( temp_in_avg, 2, 1, tmpbuf );
            String str_tmp_in_avg = String(tmpbuf);
            dtostrf( temp_out_avg, 2, 1, tmpbuf );
            String str_tmp_out_avg = String(tmpbuf);

            //{ “t_in”: 23.1, “t_out”:45.6, “seq”:65000 }
            String msg = “{\”id\”:\”ztatz_dt\”,\”version\”:1.0,\”t_unit\”:\”C\””;
            msg = msg + “,\”t_in_avg\”:” +
            str_tmp_in_avg +
            “,\”t_out_avg\”:” +
            str_tmp_out_avg +
            “,\”t_in\”:” +
            str_tmp_in +
            “,\”t_out\”:” +
            str_tmp_out +
            “,\”seq\”:” + sequenceNumber +
            “}”;

  21. hoe kan ik van het ene vlan naar het andere vlan het UDP packet versturen, ik zie in de file alleen maar dit staan

    const char *udpAddress = “255.255.255.255”; // udp broadcast address for the local lan only
    const int udpPort = 30721; // udp port number to listen to as a client.

    ik wil een aantal zaken gescheiden hebben op mijn network, en verschillende IP reeksen gebruiken.
    wifi en lan zijn gescheiden IP reeksen en vlans.

    dit apparat op 192.168.40.0/24 reeks zetten terwijl de P1 monitor op 192.168.30.0/24 zit

    is het aanpassen van de bovenstaande 255.255.255.255 naar 192.168.30.xxx van de P1monitor PI voldoende?

    1. Het idee van broadcast IP verkeer is dat dit binnen het LAN blijft of met andere woorden de router zal het UPD verkeer niet van subnet 192.168.40.x naar 192.168.30.x transporteren tenzij je een (professionele)router hebt die daar mee om kan gaan. Hier kan ik je niet mee helpen. De Pi verwacht een UDP bericht van 255.255.255.255 aanpassen gaat dus niet helpen. Hier een link die een oplossing en onderdeel van een mogelijke oplossing kan zijn.

      wat je nog wel kan doen is de Wifi van Pi in het zelfde subnet zetten al de Wifi van de ESP32 dan moet het werken.

      1. ik heb heb zelf een kort progje geschreven op basis van wat ik van internet heb kunnen vinden in python, ik ben zelf absoluut geen programeur, hooguit copy past met aanpassinkjes die niet te groot zijn
        maar als je het volgende doet bij de verzender.

        UDP_IP = “192.168.40.20”
        UDP_PORT = 5005
        bla bla bla, je hele progje
        en daarna
        sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))

        dan wordt het netjes naar 192.168.0.200 gestuurd, ook als de verzednder in 192.168.100.x vlan zit.

        issue is alleen dat je wel een netwerk moet hebben wat intern vlans kan routeren, Unifi, Cisco, HP, of de KPN box het kan doen weet ik niet. ziggo in iedergveval niet, die heeft geen vlan optie op hun modem zitten.

        ik heb het getest, met een 2 debian ontvangers in hetzelfde vlan maar met andere IP adressen 192.168.40.10 en 20 in vlan 40
        en een raspberry met IP 192.168.100.20 in een vlan 100

        het pakketje wordt netjes opgepakt door 192.168.40.20 en niet opgepakt door 192.168.40.10.
        andersom ook.

        dor de ontvanger ook het IP adress te definieren waar het pakker vandaat moet komen, ipv 0.0.0.0 kan je filteren op ontvanger.

        enige waar ik hier nu mee zit is dat ik nog moet uitzoeken in debian en raspberry hoe ik ze kan laten werken met vlans op de UTP poort.
        ik heb ze nu op wifi zitten, waar ik het access point waar ze naartoe connecten en het SID een ander vlan gegeven heb.

        windows PC pakt gewoon een vlan op als ik het IP address verander, Linux helaas niet.

        verder is dit een heel erg leuk project, ik ga een ESP32 betellen met een aantal temp sensors en zelf een programma proberen te schrijven wat uiteindelijk alle 6 de temp sensors uitleest, optuurt naar een VM die gaat de data in een database gooien per sensor met tijd en datum enz enz.
        en dan eens kijken ol ik het voor elkaar kan krijgen om er ook nog eens een mooi grafiekje van te maken.

        leuk project dit.

  22. Is er voor MacOS nog een speciale driver nodig? Ik kan echt al mijn ESP boordjes via USB verbinden zonder extra driver, maar deze Heltec wordt niet herkend op mijn Mac.

  23. Ik zag dat er temperaturen gemeten gingen worden…. cool
    Hier hangt een Honeywel EvoHome aan de muur die de temperatuur in alle ruimten waar ook een radiatorkop is geïnstalleerd…..
    Er zijn ook API’s beschikbaar waarmee er gecommuniceerd wordt…. mijn kennis schiet tekort om er zomaar “eventjes” wat voor te maken….
    zien jullie mogelijkheden ?

    1. Hi, we hebben niet de beschikking over een Honeywel EvoHome om te kunnen testen. Wellicht in de toekomst.

  24. Mooi stukje code en een zeer mooie uitbreiding op de P1mon software! Wat ik eigenlijk wel als extra erbij zou willen zien, is het gebruik van meerdere sensoren als deze. In mijn situatie zou ik er dus een direct op de ketel willen hebben om de in- en uitvoer temperatuur te zien, en daarnaast een tweede op mijn convectorput. De convectorput is mijn main verwarming in de woonkamer en wil daar graag de efficientie van monitoren.

    Daarnaast wil ik een extra boost kunnen geven aan de convector middels ventilatoren (https://gathering.tweakers.net/forum/list_messages/1490061) Die kan ik mooi aansturen middels deze unit (code aanvullen met mqtt)

    1. Ik zet op de roadmap de optie om meerder temperatuur meters te ondersteunen. je kunt met de huidige versie twee sensoren gebruiken. Ik gebruik ze voor de in en uitgaande temperatuur van de vloerverwarming.

  25. Iemand problemen met de metingen van de temperaturen ?

    Op het moment van het ijken zoals beschreven wijkt de ene sensor 0,5 graad af en de andere 1,2 graad. Zodra ze op de aanvoer en retour worden geplaatst is de afwijking groter 6,5 en 1,4 graad. Dit gemeten met een derde thermometer met voeler.

    1. Volgens mij haal je twee zaken door elkaar. De afwijking van de sensors kun je compenseren. De afwijking in de meting niet echt. Je kunt ervoor kiezen om de metings fout te compenseren met derde thermometer. Let tevens op dat de waarde een voorschrijdend gemiddelde is over de laatste 60 seconden.

  26. Geachte heren en/of dames, als ik de esp32 software verifieer/compileer dan krijg ik onderstaande fout melding bij regel 163. ik heb niets aan het bestand gewijzigd. weten jullie een oplossing? Vast bedankt.

    Arduino:1.8.8 (Windows 10), Board:”Arduino/Genuino Uno”

    ESP32DeltaTempV1.0-RTM:163:16: error: variable or field ‘WiFiEvent’ declared void

    void WiFiEvent(WiFiEvent_t event){

    ^

    ESP32DeltaTempV1.0-RTM:163:16: error: ‘WiFiEvent_t’ was not declared in this scope

    C:\Users\Langekamer\Documents\Arduino\ESP32DeltaTempV1.0-RTM\ESP32DeltaTempV1.0-RTM.ino: In function ‘void loop()’:

    ESP32DeltaTempV1.0-RTM:21:19: error: ‘T7’ was not declared in this scope

    #define TOUCH_PIN T7 // connected to pin 27

    ^

    C:\Users\Langekamer\Documents\Arduino\ESP32DeltaTempV1.0-RTM\ESP32DeltaTempV1.0-RTM.ino:132:27: note: in expansion of macro ‘TOUCH_PIN’

    touch_value = touchRead(TOUCH_PIN);

    ^

    ESP32DeltaTempV1.0-RTM:132:36: error: ’touchRead’ was not declared in this scope

    touch_value = touchRead(TOUCH_PIN);

    ^

    C:\Users\Langekamer\Documents\Arduino\ESP32DeltaTempV1.0-RTM\ESP32DeltaTempV1.0-RTM.ino: In function ‘void connectToWiFi(const char*, const char*)’:

    ESP32DeltaTempV1.0-RTM:153:23: error: no matching function for call to ‘WiFiClass::disconnect(bool)’

    WiFi.disconnect(true);

    ^

    In file included from C:\Users\Langekamer\Documents\Arduino\ESP32DeltaTempV1.0-RTM\ESP32DeltaTempV1.0-RTM.ino:5:0:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src/WiFi.h:130:9: note: candidate: int WiFiClass::disconnect()

    int disconnect(void);

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src/WiFi.h:130:9: note: candidate expects 0 arguments, 1 provided

    ESP32DeltaTempV1.0-RTM:155:8: error: ‘class WiFiClass’ has no member named ‘onEvent’

    WiFi.onEvent(WiFiEvent);

    ^

    ESP32DeltaTempV1.0-RTM:155:16: error: ‘WiFiEvent’ was not declared in this scope

    WiFi.onEvent(WiFiEvent);

    ^

    C:\Users\Langekamer\Documents\Arduino\ESP32DeltaTempV1.0-RTM\ESP32DeltaTempV1.0-RTM.ino: At global scope:

    ESP32DeltaTempV1.0-RTM:163:16: error: variable or field ‘WiFiEvent’ declared void

    void WiFiEvent(WiFiEvent_t event){

    ^

    ESP32DeltaTempV1.0-RTM:163:16: error: ‘WiFiEvent_t’ was not declared in this scope

    exit status 1
    variable or field ‘WiFiEvent’ declared void

    Dit rapport zou meer informatie bevatten met
    “Uitgebreide uitvoer weergeven tijden compilatie”
    optie aan in Bestand -> Voorkeuren.

    1. Heb je de juiste extra software geïnstalleerd zoals de WiFi bibliotheek. Zie de website.

  27. Goed te horen dat het een bug is en wordt verholpen.

    Natuurlijk ben ik gelijk ingelogd op de P1mon om het werkend te krijgen.
    Ik heb zoals beschreven de code ingevoerd met nano. en daarna de juiste rechten en het bestand gestart, maar er komt een foutmelding;

    p1mon@p1mon:/p1mon/scripts $ ./udpListerFix.py
    File “./udpListerFix.py”, line 9
    config_db.init(const.FILE_DB_CONFIG,const.DB_CONFIG_TAB)
    ^
    IndentationError: expected an indented block

    kennis programmeren wort nu wel steeds beter, maar hier zie ik even niet het probleem.

    1. je hebt ergens een spatie te veel of te weinig daarom krijg je een foutmelding. Ik heb je het script met weTransfer gestuurd.

  28. De P1MON en de ESP32 zijn een mooi concept en geeft veel inzicht in de metingen en het is nog leuk ook. maarrrr
    Hoe koppel je de P1MON met de ESP32?
    Het lukt mij niet om de waardes die de ESP32 zou versturen te presenteren in de verwarming van de P1MON.
    Waar zou ik dit terug kunnen lezen? Of koppelt de P1MON en e ESP32 zichzelf?

    De ESP32…
    De ESP32 functioneert en geeft op het display netjes te temperatuur weer. Ook kan ik de ESP32 pingen (dus er is een netwerk verbinding) met een netwerk-sniffer zie ik ook dat er UDP berichten worden verstuurt.
    De instellingen ESP32;
    – IP: 192.168.2.241
    – UDP: 255.255.255.255
    – UDP poort: 30721

    P1MON…
    De P1MON heb ik in de configuratie de verwarming aangevinkt en de 2 wijzers worden zichtbaar en zouden de temperatuur van die de ESP32 meet moeten weergeven. Echter deze blijven op 10 graden staan. (meet waardes op de ESP32 “30 en 40”)
    Ik zie verder geen instel mogelijkheden in de P1MON waarin ik moet of kan verwijzen naar de ESP32.
    De instellingen P1MON;
    – IP: 192.168.2.240
    – Verwarming aangevinkt.

    Wat zie ik over het hoofd???

    1. Hi je doet alles, goed er zit een bug in het programma waardoor de UPD daemon die luistert naar berichten op poort 30721 niet wordt geactiveerd. Gezien je opmerkingen denk ik dat je voldoende kennis hebt om een workaround uit te voeren. Het is in de volgende versie uiteraard gefixed. Hier de workaround.
      Je moet in het config database bestand een veld op 1 zetten wat nu op 0 staat. Onderstaande script doet dit. Je hoeft de P1 monitor niet te stoppen om dit script uit te voeren.

      Maak een bestand aan in de folder /p1mon/scripts/udpListerFix.py (met nano of een andere editor).
      Voeg onderstaande code toe.

      #!/usr/bin/python3
      import const
      import sys
      from sqldb import configDB

      config_db = configDB()

      # open van config database
      try:
      config_db.init(const.FILE_DB_CONFIG,const.DB_CONFIG_TAB)
      except Exception as e:
      print( “Database niet te openen(3).”+const.FILE_DB_CONFIG+”) melding:”+str(e.args[0]) )
      sys.exit(1)
      print( “Database tabel “+const.DB_CONFIG_TAB+” succesvol geopend.” )
      config_db.strset(“1”,44, None)
      print( “UDP Lister aangezet.” )

      #let op Python is erg gevoelig met de juist hoeveelheid spaties voor de code.
      Save het file.
      Geeft het file de juiste rechten met chmod a+rwx udpListerFix.py
      voer het script uit met ./updListerFix.py
      als alles goed gaat dan krijg je onderstaande output

      Database tabel config succesvol geopend.
      UDP Lister aangezet.

      Je kunt ook wachten tot de volgende versie uitkomt in een paar weken waar het probleem opgelost is.

      Succes,
      SecBro.

    1. Er komt een tweede esp32 met sensor die op vergelijkbare manier de watermeter gaat uitlezen. Tijdslijn is nog niet vastgesteld.

      1. Is het een misshcien een idee om dit via de GPIO pins van de raspberry te doen? Deze hangt doorgaans toch al in de meterkast naast de P1 poort 😉

        1. Bedankt voor de suggestie, wellicht maken we dit nog een keer mogelijk. In mijn situatie zit de vloerverwarming verdeler juist op een andere plek.

    2. Ik had in mijn vorige woning een watermeter bij AE gekocht met een display, het werkte naar mijn mening toch wel vrij goed.
      De meetwaarden waren vrij nauwkeurig en wil hem graag aansluiten op de PI om zo een totaal overzicht van al mijn verbruik te krijgen, met een inzicht van het gebruik kan ik misschien wel wat besparen.
      Graag wou ik wat informatie over het uitlezen van de zonnepanelen, heeft u al enig idee wanneer dat beschikbaar wordt?
      hieronder nog wat linkjes van die watermeter.
      https://www.aliexpress.com/item/32846651537.html?spm=a2g0o.productlist.0.0.100065a6nrUjKS&cv=47843&ws_ab_test=searchweb0_0%252Csearchweb201602_6%252Csearchweb201603_52&algo_pvid=d46c1d95-76ed-4f55-bd45-b6c0485efd7a&af=1011943&mall_affr=pr3&btsid=d9a97783-417f-44d6-a696-19f1e0665429&dp=edf98f006b80ef08f548d966363f2d85&algo_expid=d46c1d95-76ed-4f55-bd45-b6c0485efd7a-0&scm=1007.22893.125764.0&pvid=1f37746f-ebf9-4733-b2eb-3f6a3baa53a6&onelink_thrd=0.0&onelink_page_from=ITEM_DETAIL&onelink_item_to=32846651537&onelink_duration=0.979171&onelink_status=noneresult&onelink_item_from=32846651537&onelink_page_to=ITEM_DETAIL&afref=&aff_platform=aaf&cpt=1560125136256&sk=VnYZvQVf&aff_trace_key=9dd3d29286cc46baa389a90a789591ee-1560125136256-02101-VnYZvQVf&terminal_id=396a3b61a59243d89fc0f0b79129169d
      https://www.aliexpress.com/item/33011398794.html?spm=a2g0o.productlist.0.0.3280dc167f45C1&cv=47843&ws_ab_test=searchweb0_0%252Csearchweb201602_6%252Csearchweb201603_52&algo_pvid=09fc09fc-2d4e-47c9-ba6c-30a91c1abd56&af=1011943&mall_affr=pr3&btsid=391b31de-af58-403f-ab8d-bc205cfb9002&dp=31a43b7ded60d042c3def93259c0533a&algo_expid=09fc09fc-2d4e-47c9-ba6c-30a91c1abd56-2&scm=1007.22893.125764.0&pvid=cf5ad45e-0dff-43c9-bf2d-a5425773b521&onelink_thrd=0.0&onelink_page_from=ITEM_DETAIL&onelink_item_to=33011398794&onelink_duration=0.748512&onelink_status=noneresult&onelink_item_from=33011398794&onelink_page_to=ITEM_DETAIL&afref=&aff_platform=aaf&cpt=1560124471906&sk=VnYZvQVf&aff_trace_key=5c1dd665bf6c448d98aef7013a50c312-1560124471906-05400-VnYZvQVf&terminal_id=396a3b61a59243d89fc0f0b79129169d

      1. Er wordt geen of hooguit zeer zelden een raming afgeven wanneer wat gereed is. Als een extra optie in test staat dan geven we hooguit een indicatie. Voor de watermeter hebben we een idee op dit met een hall sensor te doen. Bij zonnepanelen is het lastige dat er veel soorten omvormers zijn die allemaal op hun eigen manier de data aanbieden. Voor elke omvormer moet er apart software worden geschreven. Dus dit zal per omvormer worden gemaakt.

        1. “Bij zonnepanelen is het lastige dat er veel soorten omvormers zijn die allemaal op hun eigen manier de data aanbieden. Voor elke omvormer moet er apart software worden geschreven. Dus dit zal per omvormer worden gemaakt”.
          Waarom zou je software voor elke omvormer willen maken?
          Waar ze universeel in zijn, is dat ze allemaal stroom genereren, kan je niet zo iets; https://www.aliexpress.com/item/32999615064.html?spm=a2g0o.productlist.0.0.3b4148e0axpAk5&s=p&cv=47843&ws_ab_test=searchweb0_0%252Csearchweb201602_6%252Csearchweb201603_52&algo_pvid=1728a1d5-e0ed-40c9-9be1-efdef004c940&af=1011943&mall_affr=pr3&btsid=d742018a-1269-452a-8aa5-99e267a3faa2&dp=99d8c0b7dbc559c4b9a4e58b99b1999d&algo_expid=1728a1d5-e0ed-40c9-9be1-efdef004c940-2&scm=1007.22893.125764.0&pvid=83f5e15e-a69c-44f4-91cc-a4198435ae60&onelink_thrd=0.0&onelink_page_from=ITEM_DETAIL&onelink_item_to=32999615064&onelink_duration=1.01962&onelink_status=noneresult&onelink_item_from=32999615064&onelink_page_to=ITEM_DETAIL&afref=&aff_platform=aaf&cpt=1560153757517&sk=VnYZvQVf&aff_trace_key=b76ec2901ac14b848debe27abdc269b0-1560153757517-07090-VnYZvQVf&terminal_id=396a3b61a59243d89fc0f0b79129169d er tussen zetten en dat je de meetgegevens van een van die poorten pakt en daar een (diy) module tussen set die die gegevens via de usb aansluit en daar in het programma verwerkt.
          Dan kan je dit voor elke omvormer gebruiken.

          1. We zullen er naar kijken en wellicht doen we beide. Voor een aantal omvormers is dan een software oplossing beschikbaar en voor andere gebruikers wellicht deze optie. Ik denk niet dat een ieder deze extra investering kan of wil doen. Bedankt voor het meedenken.

  29. Beste Secbro,

    Vraag, worden de temperatuur gegevens bijvoorbeeld in en uitgaand ook gelogd in P1Mon en is deze nog uit te breiden met een extra thermometer die dan ook word weergegeven in P1Mon?

    1. De data wordt in de P1 monitor gelogd. Standaard worden er twee sensors gebruikt. Technische kunnen er meerdere worden aangesloten maar die data wordt niet standaard verwerkt door de P1 monitor.

Geef een reactie.

Deze site gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.