From 9fab6f4d16dd1e3e0af1235b2af668c88f9ae91d Mon Sep 17 00:00:00 2001 From: Fisch Date: Fri, 5 Mar 2021 21:33:28 +0100 Subject: [PATCH] add mqtt display functions --- src/main.cpp | 81 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 72 insertions(+), 9 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index bc07059..2e2bbb5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -26,12 +26,20 @@ const uint8_t SEG_POINT[] = { SEG_DP}; uint8_t display_data[] = { 0xff, 0xff, 0xff, 0xff }; uint8_t display_blank[] = { 0x00, 0x00, 0x00, 0x00 }; +uint8_t display_custom[] = { 0x00, 0x00, 0x00, 0x00 }; unsigned long last_displayupdate=0; #define DISPLAYUPDATEINTERVAL 100 //maximum time to update display #define DISPLAYUPDATEINTERVAL_MIN 10 //minimum display update time bool update_display=true; +uint8_t displaybrightness = 7; //0 to 7 + +unsigned long last_new_display_custom=0; +unsigned long display_custom_duration=1000*3; + +unsigned long last_display_blink=0; //for turning off shortly +unsigned long display_blink_duration=100; #include "HX711.h" //#define SCALE_CALIBRATION 23805 //calibrated with 2.25kg weight. devide adc reading by calibration weight (in kg) to get this value (or other way around) @@ -46,6 +54,8 @@ const int PIN_SELFENABLE = D1; HX711 scale; float weight_current=0; //last weight reading +float weight_filtered=0; +float spread=0; #define MEASURE_INTERVAL 100 //ms #define READING_FILTER_SIZE 40 //latency is about READING_FILTER_SIZE/2*MEASURE_INTERVAL @@ -72,16 +82,19 @@ bool livesend=false; //if true, sends continuous data over mqtt void loopHandler(); HomieNode scaleNode("weight", "Scale", "scale"); //paramters: topic, $name, $type +HomieNode displayNode("display", "Scale", "scale"); //paramters: topic, $name, $type int sort_desc(const void *cmp1, const void *cmp2); float getFilteredWeight(); float getWeightSpread(); void sendWeight(float w); bool cmdHandler(const HomieRange& range, const String& value); +bool displayNodeHandler(const HomieRange& range, const String& value); void powerOff(); void displayNumber(float numberdisplay); + void setup() { pinMode(PIN_SELFENABLE,OUTPUT); digitalWrite(PIN_SELFENABLE, HIGH); @@ -91,7 +104,7 @@ void setup() { Serial.begin(115200); - display.setBrightness(7, true); //brightness 0 to 7 + display.setBrightness(displaybrightness, true); //brightness 0 to 7 Homie.disableResetTrigger(); //disable config reset if pin 1 (D3) is low on startup @@ -107,7 +120,7 @@ void setup() { scaleNode.advertise("raw"); scaleNode.advertise("max"); - + displayNode.advertise("segments").settable(displayNodeHandler); Homie.setup(); @@ -134,6 +147,8 @@ void loop() { void loopHandler() { unsigned long loopmillis=millis(); + + static unsigned long last_measure=0; if (loopmillis>last_measure+MEASURE_INTERVAL) { @@ -151,8 +166,8 @@ void loopHandler() { scaleNode.setProperty("cmd").send("HX711 not found"); //can be done in main loop } - float weight_filtered=getFilteredWeight(); - float spread=getWeightSpread(); + weight_filtered=getFilteredWeight(); + spread=getWeightSpread(); //Serial.println(weight_current); //Serial.print("spread="); Serial.println(spread,3); @@ -166,6 +181,7 @@ void loopHandler() { weight_tare=weight_filtered; update_display=true; Serial.print("new tare="); Serial.println(weight_tare,3); + last_display_blink=loopmillis; //blink } } #define MAXSPREAD_MEASURE 0.5 //in kg @@ -174,6 +190,7 @@ void loopHandler() { weight_max=weight_filtered; update_display=true; Serial.print("new max="); Serial.println(weight_max,3); + last_display_blink=loopmillis; //blink } } @@ -203,18 +220,29 @@ void loopHandler() { dtostrf(weight_max-weight_tare,4, 3, charBuf); scaleNode.setProperty("max").send(charBuf); //filtered and auto tared - } #define STAYONTIME_AFTER_SENT 5000 if (millis() > MAXONTIME || (weight_sent && millis()>weight_sent_time+STAYONTIME_AFTER_SENT)) { powerOff(); } - + if ( (loopmillis > last_displayupdate + DISPLAYUPDATEINTERVAL) | (update_display && (loopmillis > last_displayupdate + DISPLAYUPDATEINTERVAL_MIN) )) { last_displayupdate=loopmillis; update_display=false; //reset flag - displayNumber(weight_current); + if ((loopmillis >= last_new_display_custom) && (loopmillis < last_new_display_custom+display_custom_duration)) { + display.setBrightness(displaybrightness,true); //enable display + display.setSegments(display_custom); + }else{ + displayNumber(weight_filtered); + display.setSegments(display_data); + + if ((loopmillis >= last_display_blink) && (loopmillis < last_display_blink+display_blink_duration)) { + display.setBrightness(displaybrightness,false); + }else{ + display.setBrightness(displaybrightness,true); + } + } } /* @@ -322,6 +350,42 @@ bool cmdHandler(const HomieRange& range, const String& value) { return true; } +bool displayNodeHandler(const HomieRange& range, const String& value) { + if (range.isRange) { + return false; //if range is given but index is not in allowed range + } + Homie.getLogger() << "displayset" << ": " << value << endl; + + if (value.length()!=8*4) { //treat as number to show + + displayNumber(value.toFloat()); + for (uint8_t i=0;i<4;i++) { + display_custom[i]=display_data[i]; + } + + }else{ + uint8_t number = 0; + for (uint8_t i=0; i< value.length(); i++) // for every character in the string strlen(s) returns the length of a char array + { + number *= 2; // double the result so far + if (value[i] == '1'){ + number++; //add 1 if needed + Serial.print("1("); Serial.print(i); Serial.print(")"); + } + if ((i+1)%8==0 && i!=0) { //was the last bit + display_custom[i/8] = number; //use this number + Serial.print(" ->");Serial.print(i/8); Serial.print("="); Serial.println(number); + number=0; //reset number for next byte + } + } + } + + last_new_display_custom=millis(); //save time when message arrived + + return true; +} + + void powerOff() { Serial.println("Turning Off"); Serial.flush(); @@ -393,8 +457,7 @@ void displayNumber(float numberdisplay) { display_data[3] |= SEG_DP; } - Serial.println(); - display.setSegments(display_data); + } } \ No newline at end of file