RFM95 RFM95:SWR:NACK



  • Hi

    Im trying to setup a temperature sensor that should be placed at my jetty, 350 meters from my house. So I have chosen RFM95 as my radio, an E-ink display to show the temperature but I have some struggle to this setup. Need some debug help.

    As the controller I have a TTGO LORA.

    I have two of the TTGO LORA, One gateway and one debug sensor, so I can verify that thoose are working with mysensors but when I add my custom sensor I receives a lot of !RFM95:SWR:NACK from the Gateway.

    Sensor code:

    //#define MY_PASSIVE_NODE
    //#define PIN_SERIAL_TX       (8) 
    // Enable debug prints
    #define MY_DEBUG
    #define MY_DEBUG_VERBOSE_RFM95
    
    //#define   MY_DEBUG_VERBOSE_NRF5_ESB
    #define MY_NODE_ID 140
    //#define MY_GATEWAY_SERIAL
    
    
    #define MY_RFM95_RST_PIN 15
    #define MY_RFM95_IRQ_PIN 16
    #define MY_RFM95_IRQ_NUM MY_RFM95_IRQ_PIN
    #define DEFAULT_RFM95_CS_PIN      (SS)
    
    #define MY_RFM95_FREQUENCY (RFM95_434MHZ)
    // #define MY_RFM95_ATC_MODE_DISABLED
    #define MY_RFM95_ATC_TARGET_RSSI_DBM (-70)  // target RSSI -70dBm
    #define MY_RFM95_MAX_POWER_LEVEL_DBM (10)   // max. TX power 10dBm = 10mW
    
    #define RFM95_RETRY_TIMEOUT_MS 3000ul
    #define MY_TRANSPORT_STATE_TIMEOUT_MS 6*1000ul
    
    // Enable and select radio type attached
    //#define MY_RADIO_NRF24
    //#define MY_RADIO_NRF5_ESB
    //#define MY_RADIO_RFM69
    #define MY_RADIO_RFM95
    
    
    #include <MySensors.h>
    
    #define ENABLE_GxEPD2_GFX 1
    
    #include <GxEPD2_BW.h>
    #include <GxEPD2_3C.h>
    
    #include "Fonts/FreeMonoBold9pt7b.h" 
    #include "Fonts/FreeSerif18pt7b.h" 
    #include "Fonts/FreeSans18pt7b.h" 
    #include "Fonts/FreeSansBold24pt7b.h" 
    
    
    GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=5*/ 22, /*DC=*/ 24, /*RST=*/ -1, /*BUSY=*/ 19));
    
    #include "GxEPD2_boards_added.h"
    #include "bitmaps/Bitmaps200x200.h" // 1.54" b/w
    
    
    #define CHILD_ID_TEMP           (0)  
    #define CHILD_ID_HUM            (1)
    
    // ID of the sensor child
    #define CHILD_ID_UPLINK_QUALITY (2)
    #define CHILD_ID_TX_LEVEL       (3)
    #define CHILD_ID_TX_PERCENT     (4)
    #define CHILD_ID_TX_RSSI        (5)
    #define CHILD_ID_RX_RSSI        (6)
    #define CHILD_ID_TX_SNR         (7)
    #define CHILD_ID_RX_SNR         (8)
    
    
    // Initialize general message
    MyMessage msgTxRSSI(CHILD_ID_TX_RSSI, V_DISTANCE);
    MyMessage msgRxRSSI(CHILD_ID_RX_RSSI, V_DISTANCE);
    MyMessage msgTxSNR(CHILD_ID_TX_SNR, V_DISTANCE);
    MyMessage msgRxSNR(CHILD_ID_RX_SNR, V_DISTANCE);
    MyMessage msgTxLevel(CHILD_ID_TX_LEVEL, V_DISTANCE);
    MyMessage msgTxPercent(CHILD_ID_TX_PERCENT, V_DISTANCE);
    MyMessage msgUplinkQuality(CHILD_ID_UPLINK_QUALITY, V_DISTANCE);
    
    #define ledPin LED_BUILTIN
    // Initialize general message
    MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
    MyMessage msgHum(CHILD_ID_HUM, V_HUM);
    
    float batteryVoltage = 0;
    float temperature = 0;
    int humidity = 0;
    int counter = 0;
    int switch_led = 1;
    
    void setup()
    {
      
      Serial.print("Display init");
      sleep(1000);
      hwPinMode(ledPin, OUTPUT_D0H1);
    
      NRF_CLOCK->INTENSET = B11; //enable interrupts for EVENTS_HFCLKSTARTED and  EVENTS_LFCLKSTARTED
      NRF_CLOCK->TASKS_HFCLKSTART = 1; //start the high frequency crystal oscillator clock
      while (!(NRF_CLOCK->EVENTS_HFCLKSTARTED)) {} //wait until high frequency crystal oscillator clock is up to speed and working
    
      pinMode(ledPin, OUTPUT);
      digitalWrite(ledPin, HIGH);
      display.init(115200);
      clearScreen();
    
    }
    
    void presentation()
    {
      // Send the sketch version information to the gateway and controller
      sendSketchInfo("Passive node", "1.1");
      // Register all sensors to gw (they will be created as child devices)
      present(CHILD_ID_TEMP, S_TEMP, "Temp");
      present(CHILD_ID_HUM, S_HUM, "Hum");
    
      present(CHILD_ID_UPLINK_QUALITY, S_DISTANCE, "UPLINK QUALITY RSSI");
      present(CHILD_ID_TX_LEVEL, S_DISTANCE, "TX LEVEL DBM");
      present(CHILD_ID_TX_PERCENT, S_DISTANCE, "TX LEVEL PERCENT");
      present(CHILD_ID_TX_RSSI, S_DISTANCE, "TX RSSI");
      present(CHILD_ID_RX_RSSI, S_DISTANCE, "RX RSSI");
      present(CHILD_ID_TX_SNR, S_DISTANCE, "TX SNR");
      present(CHILD_ID_RX_SNR, S_DISTANCE, "RX SNR");
    
    }
    
    void loop()
    {
    
      // generate some random data
      counter ++;
      if (counter == 10 ) {
        temperature = 0;
        humidity = 0;
        counter = 0;
      }
      else
      {
        temperature = 25.0 + random(0, 30) / 10.0;
        humidity = 55.0 + random(-20, 20);
      }
      int16_t uplink = transportGetSignalReport(SR_UPLINK_QUALITY);
      int16_t power_link = transportGetSignalReport(SR_TX_POWER_LEVEL);
      int16_t tx_power_percent = transportGetSignalReport(SR_TX_POWER_PERCENT);
      int16_t tx_rssi = transportGetSignalReport(SR_TX_RSSI);
      int16_t rx_rssi = transportGetSignalReport(SR_RX_RSSI);
      int16_t tx_snr = transportGetSignalReport(SR_TX_SNR);
      int16_t rx_snr = transportGetSignalReport(SR_RX_SNR);
    
      send(msgUplinkQuality.set(uplink));
      send(msgTxLevel.set(power_link));
      send(msgTxPercent.set(tx_power_percent));
      // retrieve RSSI / SNR reports from incoming ACK
      send(msgTxRSSI.set(tx_rssi));
      send(msgRxRSSI.set(rx_rssi));
      send(msgTxSNR.set(tx_snr));
      send(msgRxSNR.set(rx_snr));
      // wait a bit
    
      showDisplay(temperature, humidity, counter, uplink, power_link, tx_power_percent, tx_rssi, rx_rssi);
      send(msgTemp.set(temperature, 2));
      send(msgHum.set(humidity, 2));
      wait(5000);
    
      if (switch_led == 1)
      {
        digitalWrite(ledPin, HIGH);
        switch_led = 0;
      } else {
        digitalWrite(ledPin, LOW);
        switch_led = 1;
      }
    
    }
    
    const char temp[] = "Vattentemp:";
    const char hum[] = "Hum: ";
    const char counter_text[] = "Counter: ";
    const char hello[] = "Hello";
    const char clearText[] = "CLEAR";
    const char UPLINK_QUALITYtext[] = "Uplink_qa: ";
    const char TX_POWER_LEVELtext[] = "Tx power level: ";
    const char TX_RSSItext[] = "Tx rssi: ";
    const char RX_RSSItext[] = "RX rssi";
    const char TX_POWER_PERCENT_text[] = "Tx power:";
    
    
    void clearScreen()
    {
      display.setFullWindow();
      display.setTextColor(GxEPD_BLACK);
      display.fillScreen(GxEPD_WHITE);
      display.setCursor(0, 0);
      display.firstPage();
      do
      {
      }
      while (display.nextPage() );
    }
    
    void showDisplay(float temperature, int humidity, int counter,
                    int UPLINK_QUALITY, int TX_POWER_LEVEL, int TX_POWER_PERCENT,
                    int TX_RSSI, int RX_RSSI)
    {
      display.setRotation(1);
      display.setPartialWindow(0, 0, display.width(), display.height());
      display.setTextColor(GxEPD_BLACK);
      //display.setFullWindow();
      display.setCursor(0, 0);
      display.firstPage();
      // display.fillScreen(GxEPD_WHITE);
      uint16_t x = (display.width() ) ;
      uint16_t y = (display.height() ) ;
      display.setCursor(10, 50);
    
      do
      {
        display.setFont(&FreeSans18pt7b);
        display.println(temp);
        display.setFont(&FreeMonoBold9pt7b);
        display.println();
        display.println();
        display.setFont(&FreeSansBold24pt7b);
        display.print(temperature, 1);
        display.setFont(&FreeMonoBold9pt7b);
        display.println();
    
        display.print(counter_text);
        display.println(counter);
    
    
        display.print(TX_RSSItext);
        display.println(TX_RSSI);
    
        display.print(RX_RSSItext);
        display.println(RX_RSSI);
      }
      while (display.nextPage() );
      Serial.println("showDisplay done");
    }
    
    

    Gateway code:

    /*
     * The MySensors Arduino library handles the wireless radio link and protocol
     * between your home built sensors/actuators and HA controller of choice.
     * The sensors forms a self healing radio network with optional repeaters. Each
     * repeater and gateway builds a routing tables in EEPROM which keeps track of the
     * network topology allowing messages to be routed to nodes.
     *
     * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
     * Copyright (C) 2013-2019 Sensnology AB
     * Full contributor list: https://github.com/mysensors/MySensors/graphs/contributors
     *
     * Documentation: http://www.mysensors.org
     * Support Forum: http://forum.mysensors.org
     *
     * This program is free software; you can redistribute it and/or
     * modify it under the terms of the GNU General Public License
     * version 2 as published by the Free Software Foundation.
     *
     *******************************
     *
     * REVISION HISTORY
     * Version 1.0 - tekka
     *
     * DESCRIPTION
     * The ESP32 gateway sends data received from sensors to the WiFi link.
     * The gateway also accepts input on ethernet interface, which is then sent out to the radio network.
     *
     * Make sure to fill in your ssid and WiFi password below.
     */
    
    // Enable debug prints to serial monitor
    #define MY_DEBUG
    #define MY_DEBUG_VERBOSE_RFM95
    #define MY_DEBUG_VERBOSE_TRANSPORT
    #define MY_DEBUG_VERBOSE_GATEWAY
    #define MY_DEBUG_VERBOSE_TRANSPORT_HAL
    
    #define MY_RADIO_RFM95
    
    #define RST     14   // GPIO14 -- SX1278's RESET
    #define DI0     26   // GPIO26 -- SX1278's IRQ(Interrupt Request)
    
    #define MY_RFM95_IRQ_PIN DI0
    #define MY_RFM95_IRQ_NUM MY_RFM95_IRQ_PIN
    #define MY_RFM95_CS_PIN SS
    
    #define MY_RFM95_FREQUENCY (RFM95_434MHZ)
    
    #define MY_GATEWAY_ESP32
    #define MY_GATEWAY_MQTT_CLIENT
    
    // Set this node's subscribe and publish topic prefix
    #define MY_MQTT_PUBLISH_TOPIC_PREFIX "mygateway1-out"
    #define MY_MQTT_SUBSCRIBE_TOPIC_PREFIX "mygateway1-in"
    
    // Set MQTT client id
    #define MY_MQTT_CLIENT_ID "mysensors-1"
    
    // Set WIFI SSID and password
    #define MY_WIFI_SSID "xxxxx"
    #define MY_WIFI_PASSWORD "xxxx"
    
    // Set the hostname for the WiFi Client. This is the hostname
    // passed to the DHCP server if not static.
    #define MY_HOSTNAME "ESP32_MQTT_GW"
    
    // MQTT broker ip address.
    #define MY_CONTROLLER_IP_ADDRESS 10, 0, 0, 3
    
    // The MQTT broker port to to open
    #define MY_PORT 1883
    
    #include <MySensors.h>
    
    void setup()
    {
    	Serial.println("Setup");
    }
    
    void presentation()
    {
    	// Present locally attached sensors here
    }
    
    void loop()
    {
    	// Send locally attech sensors data here
    }
    
    

    Debug log from sensor:

    23 MCO:BGN:INIT NODE,CP=RLNNN---,FQ=16,REL=255,VER=2.3.2
    29 TSM:INIT
    30 TSF:WUR:MS=0
    31 RFM95:INIT
    38 RFM95:INIT:PIN,CS=11,IQP=16,IQN=16,RST=15
    52 RFM95:PTX:LEVEL=13
    54 TSM:INIT:TSP OK
    55 TSM:INIT:STATID=140
    58 TSF:SID:OK,ID=140
    60 TSM:FPAR
    61 RFM95:SWR:SEND,TO=255,SEQ=0,RETRY=0
    7064 ?TSF:MSG:SEND,140-140-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=NACK:
    13071 !TSM:FPAR:NO REPLY
    13073 TSM:FPAR
    13074 RFM95:SWR:SEND,TO=255,SEQ=1,RETRY=0
    20078 ?TSF:MSG:SEND,140-140-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=1,st=NACK:
    26085 !TSM:FPAR:NO REPLY
    26087 TSM:FPAR
    26088 RFM95:SWR:SEND,TO=255,SEQ=2,RETRY=0
    33092 ?TSF:MSG:SEND,140-140-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=2,st=NACK:
    39099 !TSM:FPAR:NO REPLY
    39101 TSM:FPAR
    

    Debug from gateway:

    
    1982032 THA:DATA:AVAIL
    1982084 RFM95:SAC:SEND ACK,TO=10,SEQ=27,RSSI=-17,SNR=9
    1982132 THA:RCV:MSG=0A0A0022810D0500FFFFFF
    1982136 THA:RCV:MSG LEN=11
    1982138 TSF:MSG:READ,10-10-0,s=5,c=1,t=13,pt=4,l=4,sg=0:-256
    1982143 GWT:TPS:TOPIC=mygateway1-out/10/5/1/0/13,MSG SENT
    1982782 THA:DATA:AVAIL
    1982834 RFM95:SAC:SEND ACK,TO=10,SEQ=28,RSSI=-17,SNR=10
    1982882 THA:RCV:MSG=0A0A0022810D0609000000
    1982886 THA:RCV:MSG LEN=11
    1982888 TSF:MSG:READ,10-10-0,s=6,c=1,t=13,pt=4,l=4,sg=0:9
    1982893 GWT:TPS:TOPIC=mygateway1-out/10/6/1/0/13,MSG SENT
    1983582 THA:DATA:AVAIL
    1983634 RFM95:SAC:SEND ACK,TO=10,SEQ=29,RSSI=-18,SNR=9
    1983682 THA:RCV:MSG=0A0A002AE100086666CE4102
    1983686 THA:RCV:MSG LEN=12
    1983688 TSF:MSG:READ,10-10-0,s=8,c=1,t=0,pt=7,l=5,sg=0:25.80
    1983694 GWT:TPS:TOPIC=mygateway1-out/10/8/1/0/0,MSG SENT
    1984382 THA:DATA:AVAIL
    1984434 RFM95:SAC:SEND ACK,TO=10,SEQ=30,RSSI=-18,SNR=9
    1984482 THA:RCV:MSG=0A0A002AE101070000544202
    1984486 THA:RCV:MSG LEN=12
    1984488 TSF:MSG:READ,10-10-0,s=7,c=1,t=1,pt=7,l=5,sg=0:53.00
    1984494 GWT:TPS:TOPIC=mygateway1-out/10/7/1/0/1,MSG SENT
    1988912 THA:DATA:AVAIL
    1988914 THA:RCV:MSG=8C8CFF020307FF
    1988917 THA:RCV:MSG LEN=7
    1988919 TSF:MSG:READ,140-140-255,s=255,c=3,t=7,pt=0,l=0,sg=0:
    1988924 TSF:MSG:BC
    1988926 TSF:MSG:FPAR REQ,ID=140
    1988929 TSF:PNG:SEND,TO=0
    1988931 TSF:CKU:OK
    1988933 TSF:MSG:GWL OK
    1989262 THA:SND:MSG=00008C0A2308FF00
    1989265 RFM95:SWR:SEND,TO=140,SEQ=65,RETRY=0
    1989817 !RFM95:SWR:NACK
    1989836 RFM95:SWR:SEND,TO=140,SEQ=66,RETRY=1
    1990388 !RFM95:SWR:NACK
    1990478 RFM95:SWR:SEND,TO=140,SEQ=66,RETRY=2
    1991030 !RFM95:SWR:NACK
    1991062 RFM95:SWR:SEND,TO=140,SEQ=66,RETRY=3
    1991614 !RFM95:SWR:NACK
    1991630 RFM95:SWR:SEND,TO=140,SEQ=66,RETRY=4
    1992182 !RFM95:SWR:NACK
    1992266 THA:SND:MSG LEN=8,RES=0
    1992268 !TSF:MSG:SEND,0-0-140-140,s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=NACK:0
    

    And here I can see that the gateway recieves data from sensor 140 but can't ack 😞

    Can someone please help me?



  • 99% of the nacks are radio/power issues
    You may recheck them carefully



  • @lood29 When I use TTGO LORA as a dummy sensor (Node 10 in the above log) it always works without any nacks.

    The NACK only appears when I connect my own sensor (Node 140 in the log above).

    So Scenario 1
    Dummy sensor (TTGO LORA) <-> MQTT gateway (TTGO LORA) -> Works

    Scenario 2
    My sensor <-> MQTT gateway (TTGO LORA) -> NACK in the Gateway.


Log in to reply
 

Suggested Topics

148
Online

10.1k
Users

10.6k
Topics

109.0k
Posts