Hi,
I'm trying to build my sensor network using MySensors over RS 485. As controller I'm using domoticz on Paspberry PI, gateway I build on arduino pro micro, the nodes are on arduino nano + MAX485 module. Between the nodes I use twisted Pair Cat 5E. the power supply in also on that cable (12V), it is used to power up nodes, gateway is powered up by USB.
So far I've build 2 nodes with several sensors each. I've assigned MY_NODE_ID manually Gateway is MY_NODE_ID=0 nodes are 1 and 2.
My problem is that only one of the nodes is visible at the time. When I connecting node 2 or 1 everything is fine, node is visible and updating. But when I connect node 2 and then node 1, node 2 is not updating any more, while node 1 is working fine. when I disconnecting node 2 and trying to connect it again, then node 2 is sending pair request but does not getting any response.
So far I've change connection between each element, and removed the terminating resistors (First R7 and later two more 6 and 5) from node 1 MAX485 module, tried to change cable length (max for node 2 is 20m). Rewriting code for gateway and nodes...
I would be grateful for any help. I've been struggling with this problem for several weeks now and have no idea how to solve it....
The code for ...
Gateway:
//Sekcja Termometru
#include <OneWire.h>
#include <DallasTemperature.h>
#define DS18B20_PIN 2
OneWire oneWire(DS18B20_PIN);
DallasTemperature ds18b20(&oneWire);
//Definicje dla MySensors
#define MY_DEBUG // Enable debug prints to serial monitor
#define MY_RS485 // Enable RS485 transport layer
#define MY_RS485_DE_PIN 8 // Define this to enables DE-pin management on defined pin
#define MY_RS485_BAUD_RATE 9600 // Set RS485 baud rate to use
#define MY_RS485_HWSERIAL Serial // Enable this if RS485 is connected to a hardware serial port
#define MY_GATEWAY_SERIAL // Enable serial gateway
#define MY_NODE_ID 0
//#define MY_DEFAULT_LED_BLINK_PERIOD 300 // Set blinking period
//#define MY_DEFAULT_ERR_LED_PIN 6
//#define MY_DEFAULT_RX_LED_PIN 7
//#define MY_DEFAULT_TX_LED_PIN 8
#include <MySensors.h>
uint32_t SLEEP_TIME = 120000; // Sleep time between reports (in milliseconds)
#define CHILD_ID_TEMP 1
double long lastmillis =0;
MyMessage msgTemperature(CHILD_ID_TEMP, V_TEMP);
void setup()
{
ds18b20.begin();
}
void presentation()
{
sendSketchInfo("MainGateway-temp,wind,rain sensors", "1.0");
present(CHILD_ID_TEMP, S_TEMP, "Temperatura");
ds18b20.requestTemperatures();
send(msgTemperature.set((int)ds18b20.getTempCByIndex(0)));
}
void loop()
{
if (millis() - lastmillis >= 1800000) { //1800000 = 30 minut
lastmillis = millis();
ds18b20.requestTemperatures();
#ifdef MY_DEBUG
Serial.print("Aktualna temperatura: ");
Serial.println(ds18b20.getTempCByIndex(0));
#endif
send(msgTemperature.set(ds18b20.getTempCByIndex(0),2));
}
}
Node 1:
#include <OneWire.h>
#include <DallasTemperature.h>
#define DS18B20_PIN 3
// Enable debug prints to serial monitor
#define MY_DEBUG
// Enable RS485 transport layer
#define MY_RS485
// Define this to enables DE-pin management on defined pin
#define MY_RS485_DE_PIN 2
// Set RS485 baud rate to use
#define MY_RS485_BAUD_RATE 9600
// Enable this if RS485 is connected to a hardware serial port
#define MY_RS485_HWSERIAL Serial
#define MY_NODE_ID 1
#include <MySensors.h>
OneWire oneWire(DS18B20_PIN);
DallasTemperature ds18b20(&oneWire);
int gas_din = 4;
int gas_ain = A0;
double long lastmillis = 0;
uint32_t SLEEP_TIME = 5000; // Sleep time between reports (in milliseconds)
#define CHILD_ID_ANALOG 1
#define CHILD_ID_BINARY 2
#define CHILD_ID_TEMPERATURE 3
// Initialize motion message
MyMessage msg_gas_analog(CHILD_ID_ANALOG, V_LEVEL);
MyMessage msg_gas_binary(CHILD_ID_BINARY, V_TRIPPED);
MyMessage msg_temperature(CHILD_ID_TEMPERATURE, V_TEMP);
void setup()
{
ds18b20.begin();
pinMode(gas_din, INPUT);
pinMode(gas_ain, INPUT);
}
void presentation()
{
// Send the sketch version information to the gateway and Controller
sendSketchInfo("Gas Sensor", "1.0");
// Register all sensors to gw (they will be created as child devices)
present(CHILD_ID_ANALOG, S_AIR_QUALITY, "MQ5-poziom gazu");
delay(50);
present(CHILD_ID_BINARY, S_SMOKE, "MQ5 - Wyciek gazu");
delay(50);
present(CHILD_ID_TEMPERATURE, S_TEMP, "Temperatura z czujnika gazu");
}
void loop()
{
ds18b20.requestTemperatures();
bool tripped = digitalRead(gas_din) == LOW;
if ( (lastmillis == 0) || (millis() >= lastmillis + 1800000) || tripped ) { //1800000 = 30 minut
lastmillis += 1800000;
send(msg_gas_binary.set(tripped ? "1" : "0"));
delay(10);
send(msg_gas_analog.set(analogRead(gas_ain)));
delay(10);
send(msg_temperature.set(ds18b20.getTempCByIndex(0), 2));
delay(1000);
}
// sleep(SLEEP_TIME);
delay(10000);
}
Node 2:
#include "DHT.h" // biblioteka DHT
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LPS.h>
#include <NeoSWSerial.h>
// pins for SoftwareSerial
#define SDS_PIN_RX 4
#define SDS_PIN_TX 2
NeoSWSerial mySerial(SDS_PIN_RX, SDS_PIN_TX); // RX, TX
// Enable debug prints to serial monitor
#define MY_DEBUG
// Enable RS485 transport layer
#define MY_RS485
// Define this to enables DE-pin management on defined pin
#define MY_RS485_DE_PIN 3
// Set RS485 baud rate to use
#define MY_RS485_BAUD_RATE 9600
#define MY_NODE_ID 2
// Enable this if RS485 is connected to a hardware serial port
//#define MY_RS485_HWSERIAL Serial1
#define MY_RS485_SWSERIAL mySerial
#include <MySensors.h>
uint32_t SLEEP_TIME = 1800000 ; // Sleep time between reports (in milliseconds) 1800000 is 30 minutes
//#define DIGITAL_INPUT_SENSOR 3 // The digital input you attached your motion sensor. (Only 2 and 3 generates interrupt!)
#define CHILD_ID_DTH_TEMP 1
#define CHILD_ID_DTH_HUM 2
#define CHILD_ID_DS_TEMP 3
#define CHILD_ID_PS_TEMP 4
#define CHILD_ID_PS_BARO 5
#define DHTPIN 6 // numer pinu sygnałowego
#define DHTTYPE DHT21 // typ czujnika (DHT11). Jesli posiadamy DHT22 wybieramy DHT22
#define DS18B20_PIN 5
DHT dht(DHTPIN, DHTTYPE);
OneWire oneWire(DS18B20_PIN);
DallasTemperature ds18b20(&oneWire);
LPS ps;
MyMessage msgDthTemp(CHILD_ID_DTH_TEMP, V_TEMP);
MyMessage msgDthHum(CHILD_ID_DTH_HUM, V_HUM);
MyMessage msgDsTemp(CHILD_ID_DS_TEMP, V_TEMP);
MyMessage msgPsTemp(CHILD_ID_PS_TEMP, V_TEMP);
MyMessage msgPsPressure(CHILD_ID_PS_BARO, V_PRESSURE);
void setup()
{
dht.begin();
ds18b20.begin();
Wire.begin();
if (!ps.init())
{
Serial.println("Failed to autodetect pressure sensor!");
while (1);
}
ps.enableDefault();
}
void presentation()
{
// Send the sketch version information to the gateway and Controller
sendSketchInfo("Weather Sensor", "1.0");
// Register all sensors to gw (they will be created as child devices)
present(CHILD_ID_DTH_TEMP, S_TEMP);
delay(50);
present(CHILD_ID_DTH_HUM, S_HUM);
delay(50);
present(CHILD_ID_DS_TEMP, S_TEMP);
delay(50);
present(CHILD_ID_PS_TEMP, S_TEMP);
delay(50);
present(CHILD_ID_PS_BARO, V_PRESSURE);
}
void loop()
{
float t = dht.readTemperature();
float h = dht.readHumidity();
// Sprawdzamy czy są odczytane wartości
if (isnan(t) || isnan(h))
{
Serial.println("Blad odczytu danych z czujnika");
} else
{
send(msgDthTemp.set(t, 1));
delay(10);
send(msgDthHum.set(h, 1));
delay(10);
}
ds18b20.requestTemperatures();
send(msgDsTemp.set(ds18b20.getTempCByIndex(0), 1));
delay(10);
send(msgPsTemp.set(ps.readTemperatureC(), 1));
delay(10);
send(msgPsPressure.set(ps.readPressureMillibars(), 1));
delay(10);
// Sleep until interrupt comes in on motion sensor. Send update every two minute.
sleep(SLEEP_TIME);
}
Regards