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?