From f61cc2b8ec93a47e65819998f4641aa0b67459ce Mon Sep 17 00:00:00 2001 From: Norbert Date: Wed, 6 Dec 2023 14:39:35 +0100 Subject: [PATCH] Version: 3 Subversion 0 Fix: 05 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bugfixes: Changes: - Node: Neu: ZAEHLER als Konfigurationsitem für externe Zähler via Abtastung (ohne Interrupt) - Hub: - GW: - Gehäuse: --- avr/Node/Node.ino | 174 ++++++++++++++++++++++----------------- avr/Node/Node_settings.h | 30 +++---- version.h | 4 +- 3 files changed, 116 insertions(+), 92 deletions(-) diff --git a/avr/Node/Node.ino b/avr/Node/Node.ino index 1105c65..5c28f71 100644 --- a/avr/Node/Node.ino +++ b/avr/Node/Node.ino @@ -79,6 +79,10 @@ #include "LCD5110.h" #endif +#if defined(DEBUG_DISPLAY_5110) +#include "LCD5110_Logwriter.h" +#endif + #if defined(SENSOR_18B20) #include #include @@ -106,7 +110,11 @@ float u_ref; ISR(WDT_vect) { watchdogEvent(); } -#if defined(DISPLAY_ALL) +#if defined(DEBUG_DISPLAY) +LCD5110 lcd(N5110_RST,N5110_CE,N5110_DC,N5110_DIN,N5110_CLK); +#endif + +#if defined(DISPLAY_ALL) bool displayIsSleeping = false; #if defined(DISPLAY_5110) LCD5110 lcd(N5110_RST,N5110_CE,N5110_DC,N5110_DIN,N5110_CLK); @@ -173,18 +181,18 @@ float u_batt1; float u_batt2; #endif -#if defined (ZAEHLERINTERRUPT) -volatile float intZaehlerF; -volatile uint32_t intZaehlerUI; -volatile uint8_t intStatusStack; -uint16_t intSumSleepTime; +#if defined (ZAEHLER) +float zaehlerF; +uint32_t zaehlerUI; +uint8_t statusStack; +uint16_t sumSleepTime; #endif payload_t r_payload, s_payload; -uint8_t payloadNo = 0; +uint8_t payloadNo = 0; -uint8_t rf24_node2hub[] = RF24_NODE2HUB; -uint8_t rf24_hub2node[] = RF24_HUB2NODE; +uint8_t rf24_node2hub[] = RF24_NODE2HUB; +uint8_t rf24_hub2node[] = RF24_HUB2NODE; struct eeprom_t { uint16_t versionnumber; @@ -235,18 +243,6 @@ boolean display_on = true; RF24 radio(RADIO_CE_PIN,RADIO_CSN_PIN); #endif -#if defined (ZAEHLERINTERRUPT) -void intZaehler_ISR() { - if ( digitalRead(INTPIN) == LOW ) { - intStatusStack = (intStatusStack << 1); - if ( (intStatusStack & 0b00001110) == 0b00001110 ) { - intZaehlerUI++; - intZaehlerF = (float)intZaehlerUI / 100; - } - } -} -#endif - void get_sensordata(void) { // Read Voltage and calculate battery @@ -462,14 +458,14 @@ uint32_t action_loop(uint32_t data) { } break; #endif -#if defined (ZAEHLERINTERRUPT) +#if defined (ZAEHLER) case ZAEHLER_LO_SET_CHANNEL: { uint16_t val; getValue(data, &val); - intZaehlerUI = intZaehlerUI & 0xffff0000; - intZaehlerUI = intZaehlerUI | val; - intZaehlerF = (float)intZaehlerUI / 100; + zaehlerUI = zaehlerUI & 0xffff0000; + zaehlerUI = zaehlerUI | val; + zaehlerF = (float)zaehlerUI / 100; } break; case ZAEHLER_HI_SET_CHANNEL: @@ -477,10 +473,10 @@ uint32_t action_loop(uint32_t data) { uint16_t val; uint32_t val1; getValue(data, &val); - intZaehlerUI = intZaehlerUI & 0x0000ffff; + zaehlerUI = zaehlerUI & 0x0000ffff; val1 = val; - intZaehlerUI = intZaehlerUI | (val1 << 16); - intZaehlerF = (float)intZaehlerUI / 100; + zaehlerUI = zaehlerUI | (val1 << 16); + zaehlerF = (float)zaehlerUI / 100; } break; #endif @@ -878,29 +874,28 @@ void init_eeprom(bool reset_eeprom) { } void setup(void) { - delay(500); + delay(50); #if defined(STATUSLED) pinMode(STATUSLED, OUTPUT); digitalWrite(STATUSLED,STATUSLED_ON); #endif -#if defined (ZAEHLERINTERRUPT) - pinMode(INTPIN, INPUT_PULLUP); -#if defined (ZAEHLERSTART) - intZaehlerUI = ZAEHLERSTART; - intZaehlerF = ZAEHLERSTART / 100.0; +#if defined (ZAEHLER) + pinMode(ZAEHLER_PIN, INPUT_PULLUP); +#if defined (ZAEHLER_START) + zaehlerUI = ZAEHLER_START; + zaehlerF = ZAEHLER_START / 100.0; #else - intZaehlerF = 0; - intZaehlerUI = 0; + zaehlerF = 0; + zaehlerUI = 0; #endif - intSumSleepTime = 0; - intStatusStack = 0; - attachInterrupt(digitalPinToInterrupt(INTPIN), intZaehler_ISR, FALLING); + sumSleepTime = 0; + statusStack = 0; #endif // Init EEPROM -init_eeprom(false); + init_eeprom(false); #if defined(DISCHARGE3_PIN) pinMode(DISCHARGE3_PIN, OUTPUT); @@ -979,6 +974,7 @@ init_eeprom(false); } neopixels.show(); #endif + #if defined(RF24NODE) radio.begin(); delay(100); @@ -997,7 +993,9 @@ init_eeprom(false); radio.printDetails(); #endif #endif //RF24NODE + delay(100); + #if defined(RELAIS_1) digitalWrite(RELAIS_1,RELAIS_OFF); #endif @@ -1010,10 +1008,17 @@ init_eeprom(false); #if defined(RELAIS_4) digitalWrite(RELAIS_4,RELAIS_OFF); #endif + #if defined(NEOPIXEL) neopixels.clear(); neopixels.show(); #endif + +#if defined(DEBUG_DISPLAY_5110) + lcd.begin(); + lcd.clear(); +#endif + #if defined(DISPLAY_ALL) #if defined(DISPLAY_5110) lcd.begin(); @@ -1031,7 +1036,6 @@ init_eeprom(false); lcd.draw(); delay(1000); lcd.clear(); -#endif #if defined(MONITOR) monitor(1000); #endif @@ -1041,7 +1045,7 @@ init_eeprom(false); draw_therm(THERM_X0, THERM_Y0); draw_hb_countdown(8); #endif - loopcount = 0; +#endif #if defined(STATUSLED) digitalWrite(STATUSLED,STATUSLED_OFF); #endif @@ -1050,6 +1054,7 @@ init_eeprom(false); pingTest(); sendRegister(); #endif + loopcount = 0; } // Start of DISPLAY_ALL Block @@ -1536,6 +1541,9 @@ void do_transmit(uint8_t max_tx_loopcount, uint8_t msg_type, uint8_t msg_flags, #if defined(DEBUG_SERIAL_RADIO) Serial.print("TX: "); printPayload(&s_payload); +#endif +#if defined(DEBUG_STATUSLED_RADIO_TX) + digitalWrite(STATUSLED, STATUSLED_ON); #endif radio.write(&s_payload, sizeof(s_payload)); delay(1); @@ -1555,11 +1563,12 @@ void do_transmit(uint8_t max_tx_loopcount, uint8_t msg_type, uint8_t msg_flags, } #endif if ( radio.available() ) { -#if defined(DEBUG_SERIAL_RADIO) - Serial.print("RX: "); -#endif +//#if defined(DEBUG_SERIAL_RADIO) +// Serial.print("RX: "); +//#endif radio.read(&r_payload, sizeof(r_payload)); #if defined(DEBUG_SERIAL_RADIO) + Serial.println(); printPayload(&r_payload); if (r_payload.node_id != RF24NODE) { Serial.println("Wrong Node, Message dropped!"); @@ -1599,6 +1608,9 @@ void do_transmit(uint8_t max_tx_loopcount, uint8_t msg_type, uint8_t msg_flags, } } //radio.available } +#if defined(DEBUG_STATUSLED_RADIO_TX) + digitalWrite(STATUSLED, STATUSLED_OFF); +#endif tx_loopcount++; } } @@ -1674,7 +1686,7 @@ void batt_monitor() { #endif void loop(void) { -#if defined(ZAEHLERINTERRUPT) +#if defined(ZAEHLER) if (loopcount == 0) #endif get_sensordata(); @@ -1766,23 +1778,35 @@ void loop(void) { batt_mod4_s = 0; batt_mod5_s = 0; #endif -#if defined(ZAEHLERINTERRUPT) - payload_data(&pos,ZAEHLER_CHANNEL,intZaehlerF); +#if defined(ZAEHLER) + payload_data(&pos,ZAEHLER_CHANNEL,zaehlerF); uint16_t val; - val = intZaehlerUI; + val = zaehlerUI; payload_data(&pos,ZAEHLER_LO_CHANNEL,val); - val = intZaehlerUI >> 16; + val = zaehlerUI >> 16; payload_data(&pos,ZAEHLER_HI_CHANNEL,val); #if defined(DEBUG_SERIAL_SENSOR) Serial.print("zaehler: "); Serial.print("Rohdaten: "); - Serial.print(intZaehlerUI); + Serial.print(zaehlerUI); Serial.print("aufbereitet: "); - Serial.println(intZaehlerF); + Serial.println(zaehlerF); #endif +#endif +#if defined(DEBUG_SERIAL_RADIO) + Serial.println("Loop: Start transmit"); +#endif +#if defined(DEBUG_STATUSLED_RADIO) + digitalWrite(STATUSLED, STATUSLED_ON); #endif do_transmit(eeprom.max_sendcount, payloadNo == 0 ? PAYLOAD_TYPE_HB : PAYLOAD_TYPE_HB_F, mk_flags(true), 0, 0); exec_jobs(); +#if defined(DEBUG_STATUSLED_RADIO) + digitalWrite(STATUSLED, STATUSLED_OFF); +#endif +#if defined(DEBUG_SERIAL_RADIO) + Serial.println("Loop: End transmit"); +#endif radio.stopListening(); delay(1); radio.powerDown(); @@ -1798,24 +1822,6 @@ void loop(void) { #if defined(DISPLAY_ALL) display_refresh(); #endif -/* - * Sonderbehandlung für Interruptbasierte Zähler - */ -#ifdef ZAEHLERINTERRUPT - intStatusStack = (intStatusStack << 1) | (digitalRead(INTPIN)? 1:0); - if ( (intStatusStack & 0b00000111) == 0b00000111 ) { - while (intSumSleepTime < eeprom.sleeptime) { - dosleep(9); - intSumSleepTime += 8; - } - } else { - dosleep(5); - if (loopcount > 0) loopcount--; - } -#else -/* - * Behandlung normale Nodes - */ long int tempsleeptime = eeprom.sleeptime; // regelmaessige Schlafzeit in Sek. if (low_voltage_flag) tempsleeptime = eeprom.sleeptime_lv; tempsleeptime += sleeptime_kor; // einmalige Korrektur in Sek. @@ -1829,20 +1835,36 @@ void loop(void) { batt_monitor(); if ( millis() < mymillis ) mymillis = 0; } - //delay(tempsleeptime); } else { #endif +#ifdef ZAEHLER // Sonderhehandlung für Zähler + while (sumSleepTime < tempsleeptime) { + bool pinstate = digitalRead(ZAEHLER_PIN); + if ( (statusStack & 0b00001111) == 0b00001111 && (pinstate == LOW) ) { + zaehlerUI++; + zaehlerF = (float)zaehlerUI / 100; + } + statusStack = (statusStack << 1) | (pinstate? 0b00000001:0b00000000); + SLEEPTYPE(61); //sleep 60ms + sumSleepTime += 60; + } + sumSleepTime = 0; +#else +/* + * Behandlung normale Nodes + */ SLEEPTYPE(tempsleeptime); #if defined(DISCHARGE1) } #endif -#endif //ZAEHLERINTERRUPT /* - * ENDE Sonderbehandlung für Interruptbasierte Zähler + * ENDE Trennung: Zählernodes / normale Nodes */ +#endif //ZAEHLER loopcount++; -#ifdef ZAEHLERINTERRUPT - intSumSleepTime = 0; -#endif if ( loopcount > eeprom.emptyloops ) loopcount = 0; +#ifdef DEBUG_SERIAL + Serial.print("Loopcount: "); + Serial.println(loopcount); +#endif } diff --git a/avr/Node/Node_settings.h b/avr/Node/Node_settings.h index 0902b53..dc0dc16 100644 --- a/avr/Node/Node_settings.h +++ b/avr/Node/Node_settings.h @@ -224,18 +224,19 @@ //----------------------------------------------------- #if defined(GASZAEHLERNODE) #define RF24NODE 111 -#define EEPROM_VERSION 9 -#define ZAEHLERINTERRUPT +#define EEPROM_VERSION 4 +#define SENSOR_BOSCH +#define SLEEPTIME 60 +#define EMPTYLOOPS 0 +#define LOW_VOLT_LEVEL 2.0 +#define ZAEHLER #define ZAEHLER_LO_CHANNEL 11 #define ZAEHLER_HI_CHANNEL 12 #define ZAEHLER_CHANNEL 13 #define ZAEHLER_LO_SET_CHANNEL 51 #define ZAEHLER_HI_SET_CHANNEL 52 -#define SENSOR_BOSCH -#define SLEEPTIME 60 -#define EMPTYLOOPS 4 -#define LOW_VOLT_LEVEL 2.0 -#define ZAEHLERSTART 285134 +#define ZAEHLER_START 287846 +#define SLEEP4MS_FAC 990 #endif //----------------------------------------------------- // Testnodes @@ -243,10 +244,12 @@ #if defined(ZAEHLER_TEST_198) #define DEBUG_SERIAL_SENSOR #define DEBUG_SERIAL_RADIO +//#define DEBUG_DISPLAY_5110 +//#define DEBUG_DISPLAY #define SLEEPTYPE delay #define RF24NODE 198 #define EEPROM_VERSION 3 -#define ZAEHLERINTERRUPT +#define ZAEHLER #define ZAEHLER_LO_CHANNEL 11 #define ZAEHLER_HI_CHANNEL 12 #define ZAEHLER_CHANNEL 13 @@ -254,7 +257,7 @@ #define ZAEHLER_HI_SET_CHANNEL 52 #define SENSOR_BOSCH #define SLEEPTIME 60 -#define EMPTYLOOPS 4 +#define EMPTYLOOPS 1 #define LOW_VOLT_LEVEL 2.0 //#define SLEEP4MS_FAC 950 #endif @@ -307,7 +310,7 @@ // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //define constrains -#if defined (ZAEHLERINTERRUPT) +#if defined (ZAEHLER) #ifndef ZAEHLER_CHANNEL #define ZAEHLER_CHANNEL 13 #endif @@ -323,9 +326,8 @@ #ifndef ZAEHLER_HI_SET_CHANNEL #define ZAEHLER_HI_SET_CHANNEL 52 #endif - -#ifndef INTPIN -#define INTPIN 2 +#ifndef ZAEHLER_PIN +#define ZAEHLER_PIN 2 #endif #endif @@ -606,7 +608,7 @@ // // Definitions for Nokia 5110 Display // -#if defined(DISPLAY_5110) +#if defined(DISPLAY_5110) || defined(DEBUG_DISPLAY_5110) // DISPLAY Nokia 5110 is 84 * 48 Pixel #ifndef N5110_CLK #define N5110_CLK 7 diff --git a/version.h b/version.h index 0815554..ba4deac 100644 --- a/version.h +++ b/version.h @@ -1,2 +1,2 @@ -#define SWVERSION 3004 -#define SWVERSION_STR "3.0.04" +#define SWVERSION 3005 +#define SWVERSION_STR "3.0.05"