Endlessly rebooting node
-
I finally got bootloader and upload issues done, but now one sketch/node is killing me. I have tried different AtMega328Ps but the symptom remains.
The node: SlimNode, constant power (step down to 3.3V from alarm system 12V battery), non-PA NRF24, DHT11. Extra LED to blink at start-up, extra cap 100yF at power input. Pins/connections verified once extra.Serial:
__ __ ____ | \/ |_ _/ ___| ___ _ __ ___ ___ _ __ ___ | |\/| | | | \___ \ / _ \ `_ \/ __|/ _ \| `__/ __| | | | | |_| |___| | __/ | | \__ \ _ | | \__ \ |_| |_|\__, |____/ \___|_| |_|___/\___/|_| |___/ |___/ 2.3.1 34 MCO:BGN:INIT REPEATER,CP=RNNRASQ-,REL=255,VER=2.3.1 55 MCO:BGN:BFR 2093 TSM:INIT 2097 TSF:WUR:MS=0 2105 TSM:INIT:TSP OK 2109 TSM:INIT:STATID=3 2113 TSF:SID:OK,ID=3 2117 TSM:FPAR 2154 TSF:MSG:SEND,3-3-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK: 3115 TSF:MSG:READ,0-0-3,s=255,c=3,t=8,pt=1,l=1,sg=0:0 3125 TSF:MSG:FPAR OK,ID=0,D=1 4167 TSM:FPAR:OK 4169 TSM:ID 4171 TSM:ID:OK 4175 TSM:UPL 4182 TSF:MSG:SEND,3-3-0-0,s=255,c=3,t=24,pt=1,l=1,sg=0,ft=0,st=OK:1 4194 TSF:MSG:READ,0-0-3,s=255,c=3,t=25,pt=1,l=1,sg=0:1 4204 TSF:MSG:PONG RECV,HP=1 4208 TSM:UPL:OK 4212 TSM:READY:ID=3,PAR=0,DIS=1 4222 TSF:MSG:SEND,3-3-0-0,s=255,c=3,t=15,pt=6,l=2,sg=0,ft=0,st=OK:0101 4235 TSF:MSG:READ,0-0-3,s=255,c=3,t=15,pt=6,l=2,sg=0:0101 4249 TSF:MSG:SEND,3-3-0-0,s=255,c=3,t=16,pt=0,l=0,sg=0,ft=0,st=OK: 4263 TSF:MSG:READ,0-0-3,s=255,c=3,t=17,pt=6,l=25,sg=0:<NONCE> 4329 TSF:MSG:SEND,3-3-0-0,s=255,c=0,t=18,pt=0,l=5,sg=1,ft=1,st=OK:2.3.1 4341 !TSF:RTE:FPAR ACTIVE __ __ ____ | \/ |_ _/ ___| ___ _ __ ___ ___ _ __ ___ | |\/| | | | \___ \ / _ \ `_ \/ __|/ _ \| `__/ __| | | | | |_| |___| | __/ | | \__ \ _ | | \__ \ |_| |_|\__, |____/ \___|_| |_|___/\___/|_| |___/ |___/ 2.3.1 36 MCO:BGN:INIT REPEATER,CP=RNNRASQ-,REL=255,VER=2.3.1 57 MCO:BGN:BFR...and this keeps repeating
Code:
/** * * DESCRIPTION * Temp Sensor and repeater / Slim node * */ #define MY_DEBUG #define MY_RADIO_RF24 #define MY_REPEATER_FEATURE // Enable repeater functionality for this node #define MY_SIGNING_SIMPLE_PASSWD "XXXXXXXXXX" #define MY_RF24_IRQ_PIN 2 #define MY_RX_MESSAGE_BUFFER_FEATURE #define MY_NODE_ID 3 #define MY_BAUD_RATE 57600 #define DHT_DATA_PIN 4 #define SENSOR_TEMP_OFFSET 0 #define HUM 1 #define TEMP 2 static const uint8_t FORCE_UPDATE_N_READS = 10; float lastTemp; float lastHum; uint8_t nNoUpdatesTemp; uint8_t nNoUpdatesHum; bool metric = true; #include <SPI.h> #include <DHT.h> #include <MySensors.h> MyMessage msgHum(HUM, V_HUM); MyMessage msgTemp(TEMP, V_TEMP); DHT dht; void before() { pinMode(7, OUTPUT); int i = 0; for(i=0; i < 5; i++) { digitalWrite(7, HIGH); delay(100); digitalWrite(7, LOW); delay(300); } } void setup() { delay(100); // Let power settle dht.setup(DHT_DATA_PIN); // set data pin of DHT sensor wait(2000); } void presentation() { sendSketchInfo("Temp Sensor & Repeater", "v06012019"); present(HUM, S_HUM); present(TEMP, S_TEMP); metric = getControllerConfig().isMetric; } void loop() { // Force reading sensor, so it works also after sleep() dht.readSensor(true); float temperature = dht.getTemperature(); if (isnan(temperature)) { Serial.println("Failed reading temperature from DHT!"); } else if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) { // Only send temperature if it changed since the last measurement or if we didn't send an update for n times lastTemp = temperature; if (!metric) { temperature = dht.toFahrenheit(temperature); } // Reset no updates counter nNoUpdatesTemp = 0; temperature += SENSOR_TEMP_OFFSET; send(msgTemp.set(temperature, 1)); #ifdef MY_DEBUG Serial.print("T: "); Serial.println(temperature); #endif } else { // Increase no update counter if the temperature stayed the same nNoUpdatesTemp++; } float humidity = dht.getHumidity(); if (isnan(humidity)) { Serial.println("Failed reading humidity from DHT"); } else if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS) { // Only send humidity if it changed since the last measurement or if we didn't send an update for n times lastHum = humidity; // Reset no updates counter nNoUpdatesHum = 0; send(msgHum.set(humidity, 1)); #ifdef MY_DEBUG Serial.print("H: "); Serial.println(humidity); #endif } else { // Increase no update counter if the humidity stayed the same nNoUpdatesHum++; } // Sleep for a while to save energy //sleep(UPDATE_INTERVAL); //} wait(120000); }I dont think it's a power issue but what else could it be? Behavior is the same with DHT11 unplugged. Also same if powering from FTDI.
-
I finally got bootloader and upload issues done, but now one sketch/node is killing me. I have tried different AtMega328Ps but the symptom remains.
The node: SlimNode, constant power (step down to 3.3V from alarm system 12V battery), non-PA NRF24, DHT11. Extra LED to blink at start-up, extra cap 100yF at power input. Pins/connections verified once extra.Serial:
__ __ ____ | \/ |_ _/ ___| ___ _ __ ___ ___ _ __ ___ | |\/| | | | \___ \ / _ \ `_ \/ __|/ _ \| `__/ __| | | | | |_| |___| | __/ | | \__ \ _ | | \__ \ |_| |_|\__, |____/ \___|_| |_|___/\___/|_| |___/ |___/ 2.3.1 34 MCO:BGN:INIT REPEATER,CP=RNNRASQ-,REL=255,VER=2.3.1 55 MCO:BGN:BFR 2093 TSM:INIT 2097 TSF:WUR:MS=0 2105 TSM:INIT:TSP OK 2109 TSM:INIT:STATID=3 2113 TSF:SID:OK,ID=3 2117 TSM:FPAR 2154 TSF:MSG:SEND,3-3-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK: 3115 TSF:MSG:READ,0-0-3,s=255,c=3,t=8,pt=1,l=1,sg=0:0 3125 TSF:MSG:FPAR OK,ID=0,D=1 4167 TSM:FPAR:OK 4169 TSM:ID 4171 TSM:ID:OK 4175 TSM:UPL 4182 TSF:MSG:SEND,3-3-0-0,s=255,c=3,t=24,pt=1,l=1,sg=0,ft=0,st=OK:1 4194 TSF:MSG:READ,0-0-3,s=255,c=3,t=25,pt=1,l=1,sg=0:1 4204 TSF:MSG:PONG RECV,HP=1 4208 TSM:UPL:OK 4212 TSM:READY:ID=3,PAR=0,DIS=1 4222 TSF:MSG:SEND,3-3-0-0,s=255,c=3,t=15,pt=6,l=2,sg=0,ft=0,st=OK:0101 4235 TSF:MSG:READ,0-0-3,s=255,c=3,t=15,pt=6,l=2,sg=0:0101 4249 TSF:MSG:SEND,3-3-0-0,s=255,c=3,t=16,pt=0,l=0,sg=0,ft=0,st=OK: 4263 TSF:MSG:READ,0-0-3,s=255,c=3,t=17,pt=6,l=25,sg=0:<NONCE> 4329 TSF:MSG:SEND,3-3-0-0,s=255,c=0,t=18,pt=0,l=5,sg=1,ft=1,st=OK:2.3.1 4341 !TSF:RTE:FPAR ACTIVE __ __ ____ | \/ |_ _/ ___| ___ _ __ ___ ___ _ __ ___ | |\/| | | | \___ \ / _ \ `_ \/ __|/ _ \| `__/ __| | | | | |_| |___| | __/ | | \__ \ _ | | \__ \ |_| |_|\__, |____/ \___|_| |_|___/\___/|_| |___/ |___/ 2.3.1 36 MCO:BGN:INIT REPEATER,CP=RNNRASQ-,REL=255,VER=2.3.1 57 MCO:BGN:BFR...and this keeps repeating
Code:
/** * * DESCRIPTION * Temp Sensor and repeater / Slim node * */ #define MY_DEBUG #define MY_RADIO_RF24 #define MY_REPEATER_FEATURE // Enable repeater functionality for this node #define MY_SIGNING_SIMPLE_PASSWD "XXXXXXXXXX" #define MY_RF24_IRQ_PIN 2 #define MY_RX_MESSAGE_BUFFER_FEATURE #define MY_NODE_ID 3 #define MY_BAUD_RATE 57600 #define DHT_DATA_PIN 4 #define SENSOR_TEMP_OFFSET 0 #define HUM 1 #define TEMP 2 static const uint8_t FORCE_UPDATE_N_READS = 10; float lastTemp; float lastHum; uint8_t nNoUpdatesTemp; uint8_t nNoUpdatesHum; bool metric = true; #include <SPI.h> #include <DHT.h> #include <MySensors.h> MyMessage msgHum(HUM, V_HUM); MyMessage msgTemp(TEMP, V_TEMP); DHT dht; void before() { pinMode(7, OUTPUT); int i = 0; for(i=0; i < 5; i++) { digitalWrite(7, HIGH); delay(100); digitalWrite(7, LOW); delay(300); } } void setup() { delay(100); // Let power settle dht.setup(DHT_DATA_PIN); // set data pin of DHT sensor wait(2000); } void presentation() { sendSketchInfo("Temp Sensor & Repeater", "v06012019"); present(HUM, S_HUM); present(TEMP, S_TEMP); metric = getControllerConfig().isMetric; } void loop() { // Force reading sensor, so it works also after sleep() dht.readSensor(true); float temperature = dht.getTemperature(); if (isnan(temperature)) { Serial.println("Failed reading temperature from DHT!"); } else if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) { // Only send temperature if it changed since the last measurement or if we didn't send an update for n times lastTemp = temperature; if (!metric) { temperature = dht.toFahrenheit(temperature); } // Reset no updates counter nNoUpdatesTemp = 0; temperature += SENSOR_TEMP_OFFSET; send(msgTemp.set(temperature, 1)); #ifdef MY_DEBUG Serial.print("T: "); Serial.println(temperature); #endif } else { // Increase no update counter if the temperature stayed the same nNoUpdatesTemp++; } float humidity = dht.getHumidity(); if (isnan(humidity)) { Serial.println("Failed reading humidity from DHT"); } else if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS) { // Only send humidity if it changed since the last measurement or if we didn't send an update for n times lastHum = humidity; // Reset no updates counter nNoUpdatesHum = 0; send(msgHum.set(humidity, 1)); #ifdef MY_DEBUG Serial.print("H: "); Serial.println(humidity); #endif } else { // Increase no update counter if the humidity stayed the same nNoUpdatesHum++; } // Sleep for a while to save energy //sleep(UPDATE_INTERVAL); //} wait(120000); }I dont think it's a power issue but what else could it be? Behavior is the same with DHT11 unplugged. Also same if powering from FTDI.
-
@masmat atmega328p with software signing and encryption will probably mean you are low on ram. Perhaps stack issues cause the reboots?
Good point @anticimex
I tried the sketch and it displays the following output on my systemGlobal variables use 1655 bytes (80%) of dynamic memory, leaving 393 bytes for local variables. Maximum is 2048 bytes. Low memory available, stability problems may occur.@MasMat you'll need to save some ram or switch to a mcu with more ram. https://www.mysensors.org/apidocs/group__memorysavings.html might be useful but will probably be insufficient.
-
I finally got bootloader and upload issues done, but now one sketch/node is killing me. I have tried different AtMega328Ps but the symptom remains.
The node: SlimNode, constant power (step down to 3.3V from alarm system 12V battery), non-PA NRF24, DHT11. Extra LED to blink at start-up, extra cap 100yF at power input. Pins/connections verified once extra.Serial:
__ __ ____ | \/ |_ _/ ___| ___ _ __ ___ ___ _ __ ___ | |\/| | | | \___ \ / _ \ `_ \/ __|/ _ \| `__/ __| | | | | |_| |___| | __/ | | \__ \ _ | | \__ \ |_| |_|\__, |____/ \___|_| |_|___/\___/|_| |___/ |___/ 2.3.1 34 MCO:BGN:INIT REPEATER,CP=RNNRASQ-,REL=255,VER=2.3.1 55 MCO:BGN:BFR 2093 TSM:INIT 2097 TSF:WUR:MS=0 2105 TSM:INIT:TSP OK 2109 TSM:INIT:STATID=3 2113 TSF:SID:OK,ID=3 2117 TSM:FPAR 2154 TSF:MSG:SEND,3-3-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK: 3115 TSF:MSG:READ,0-0-3,s=255,c=3,t=8,pt=1,l=1,sg=0:0 3125 TSF:MSG:FPAR OK,ID=0,D=1 4167 TSM:FPAR:OK 4169 TSM:ID 4171 TSM:ID:OK 4175 TSM:UPL 4182 TSF:MSG:SEND,3-3-0-0,s=255,c=3,t=24,pt=1,l=1,sg=0,ft=0,st=OK:1 4194 TSF:MSG:READ,0-0-3,s=255,c=3,t=25,pt=1,l=1,sg=0:1 4204 TSF:MSG:PONG RECV,HP=1 4208 TSM:UPL:OK 4212 TSM:READY:ID=3,PAR=0,DIS=1 4222 TSF:MSG:SEND,3-3-0-0,s=255,c=3,t=15,pt=6,l=2,sg=0,ft=0,st=OK:0101 4235 TSF:MSG:READ,0-0-3,s=255,c=3,t=15,pt=6,l=2,sg=0:0101 4249 TSF:MSG:SEND,3-3-0-0,s=255,c=3,t=16,pt=0,l=0,sg=0,ft=0,st=OK: 4263 TSF:MSG:READ,0-0-3,s=255,c=3,t=17,pt=6,l=25,sg=0:<NONCE> 4329 TSF:MSG:SEND,3-3-0-0,s=255,c=0,t=18,pt=0,l=5,sg=1,ft=1,st=OK:2.3.1 4341 !TSF:RTE:FPAR ACTIVE __ __ ____ | \/ |_ _/ ___| ___ _ __ ___ ___ _ __ ___ | |\/| | | | \___ \ / _ \ `_ \/ __|/ _ \| `__/ __| | | | | |_| |___| | __/ | | \__ \ _ | | \__ \ |_| |_|\__, |____/ \___|_| |_|___/\___/|_| |___/ |___/ 2.3.1 36 MCO:BGN:INIT REPEATER,CP=RNNRASQ-,REL=255,VER=2.3.1 57 MCO:BGN:BFR...and this keeps repeating
Code:
/** * * DESCRIPTION * Temp Sensor and repeater / Slim node * */ #define MY_DEBUG #define MY_RADIO_RF24 #define MY_REPEATER_FEATURE // Enable repeater functionality for this node #define MY_SIGNING_SIMPLE_PASSWD "XXXXXXXXXX" #define MY_RF24_IRQ_PIN 2 #define MY_RX_MESSAGE_BUFFER_FEATURE #define MY_NODE_ID 3 #define MY_BAUD_RATE 57600 #define DHT_DATA_PIN 4 #define SENSOR_TEMP_OFFSET 0 #define HUM 1 #define TEMP 2 static const uint8_t FORCE_UPDATE_N_READS = 10; float lastTemp; float lastHum; uint8_t nNoUpdatesTemp; uint8_t nNoUpdatesHum; bool metric = true; #include <SPI.h> #include <DHT.h> #include <MySensors.h> MyMessage msgHum(HUM, V_HUM); MyMessage msgTemp(TEMP, V_TEMP); DHT dht; void before() { pinMode(7, OUTPUT); int i = 0; for(i=0; i < 5; i++) { digitalWrite(7, HIGH); delay(100); digitalWrite(7, LOW); delay(300); } } void setup() { delay(100); // Let power settle dht.setup(DHT_DATA_PIN); // set data pin of DHT sensor wait(2000); } void presentation() { sendSketchInfo("Temp Sensor & Repeater", "v06012019"); present(HUM, S_HUM); present(TEMP, S_TEMP); metric = getControllerConfig().isMetric; } void loop() { // Force reading sensor, so it works also after sleep() dht.readSensor(true); float temperature = dht.getTemperature(); if (isnan(temperature)) { Serial.println("Failed reading temperature from DHT!"); } else if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) { // Only send temperature if it changed since the last measurement or if we didn't send an update for n times lastTemp = temperature; if (!metric) { temperature = dht.toFahrenheit(temperature); } // Reset no updates counter nNoUpdatesTemp = 0; temperature += SENSOR_TEMP_OFFSET; send(msgTemp.set(temperature, 1)); #ifdef MY_DEBUG Serial.print("T: "); Serial.println(temperature); #endif } else { // Increase no update counter if the temperature stayed the same nNoUpdatesTemp++; } float humidity = dht.getHumidity(); if (isnan(humidity)) { Serial.println("Failed reading humidity from DHT"); } else if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS) { // Only send humidity if it changed since the last measurement or if we didn't send an update for n times lastHum = humidity; // Reset no updates counter nNoUpdatesHum = 0; send(msgHum.set(humidity, 1)); #ifdef MY_DEBUG Serial.print("H: "); Serial.println(humidity); #endif } else { // Increase no update counter if the humidity stayed the same nNoUpdatesHum++; } // Sleep for a while to save energy //sleep(UPDATE_INTERVAL); //} wait(120000); }I dont think it's a power issue but what else could it be? Behavior is the same with DHT11 unplugged. Also same if powering from FTDI.
@masmat correction; you don't use encryption. But as @mfalkvidd says, you are probably in the grey zone of operations so stability much depend on execution paths.
-
By
- Turning off MY_DEBUG (yes, you'll be blind but there isn't much to do if you want the signing feature)
- Turning off MY_REPEATER_FEATURE (can't cram all features into an atmega328)
- Adding #ifdef MY_DEBUG around the two serial prints that didn't have any rules
- Changing sendsketchinfo to use the F macro
I get the following result:
Sketch uses 13902 bytes (45%) of program storage space. Maximum is 30720 bytes. Global variables use 1456 bytes (71%) of dynamic memory, leaving 592 bytes for local variables. Maximum is 2048 bytes.Not sure if that will be sufficient to avoid crashing, but maybe.
-
By
- Turning off MY_DEBUG (yes, you'll be blind but there isn't much to do if you want the signing feature)
- Turning off MY_REPEATER_FEATURE (can't cram all features into an atmega328)
- Adding #ifdef MY_DEBUG around the two serial prints that didn't have any rules
- Changing sendsketchinfo to use the F macro
I get the following result:
Sketch uses 13902 bytes (45%) of program storage space. Maximum is 30720 bytes. Global variables use 1456 bytes (71%) of dynamic memory, leaving 592 bytes for local variables. Maximum is 2048 bytes.Not sure if that will be sufficient to avoid crashing, but maybe.
@mfalkvidd Yeah, it became stable after I did the same. I will have to simplify the tasks for my bare bones nodes.
Since I'm getting wrong (no warnings) memory messages uploading, do you think I should edit boards.txt?atmega328bb.name=ATmega328 on a breadboard (8 MHz internal clock) atmega328bb.upload.protocol=arduino atmega328bb.upload.maximum_size=30720 atmega328bb.upload.speed=57600 atmega328bb.bootloader.low_fuses=0xE2 atmega328bb.bootloader.high_fuses=0xDA atmega328bb.bootloader.extended_fuses=0xfd atmega328bb.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex atmega328bb.bootloader.unlock_bits=0x3F atmega328bb.bootloader.lock_bits=0x0F atmega328bb.build.mcu=atmega328p atmega328bb.build.f_cpu=8000000L atmega328bb.build.core=arduino:arduino atmega328bb.build.variant=arduino:standard atmega328bb.bootloader.tool=arduino:avrdude atmega328bb.upload.tool=arduino:avrdude``` -
@mfalkvidd Yeah, it became stable after I did the same. I will have to simplify the tasks for my bare bones nodes.
Since I'm getting wrong (no warnings) memory messages uploading, do you think I should edit boards.txt?atmega328bb.name=ATmega328 on a breadboard (8 MHz internal clock) atmega328bb.upload.protocol=arduino atmega328bb.upload.maximum_size=30720 atmega328bb.upload.speed=57600 atmega328bb.bootloader.low_fuses=0xE2 atmega328bb.bootloader.high_fuses=0xDA atmega328bb.bootloader.extended_fuses=0xfd atmega328bb.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex atmega328bb.bootloader.unlock_bits=0x3F atmega328bb.bootloader.lock_bits=0x0F atmega328bb.build.mcu=atmega328p atmega328bb.build.f_cpu=8000000L atmega328bb.build.core=arduino:arduino atmega328bb.build.variant=arduino:standard atmega328bb.bootloader.tool=arduino:avrdude atmega328bb.upload.tool=arduino:avrdude```
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login