Fragen RS485 Gateway

Begonnen von Ranseyer, 31 Oktober 2017, 09:27:25

Vorheriges Thema - Nächstes Thema

Beta-User

Interessant, dass es so dann auch funktioniert.

In dem unteren der Links kann man ausrechnen, welche Pullup-/Pulldown-Werte bei welchen Kabeln und Längen gut sind. Soweit ich das verstanden habe (Achtung: Laie...), sollten die am Besten in der Mitte des Bus sitzen.

Aber 390 Ohm auf jeder Seite kommt mir niedrig vor. Auf den Modulen sind jeweils 10k verbaut, wenn du also was hast mit um die 1k, würde ich damit mal anfangen (die 2*120 Ohm bleiben so).

Gruß, Beta-User
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

smoudo

Hmm da kommen bei 30 Meter Buslänge ca 540 Ohm raus.  Auf dem Rechner wird nur am Anfang der Pullup / Pulldown gesetzt.
Interessant. Ich geh mal Widerstände schnacken :)

grüße

MAtze

Ranseyer

Mir scheint diese Variante ganz nett:

Stand dürfte aber auf jeden Fall zu seinen einen (jeden) Bus am Anfang und am Ende zu terminieren. Also niemals in der Mitte, oder noch öfters.

Quelle:
https://raw.githubusercontent.com/ranseyer/MySensors-HW/master/MySensors-HM-easy-PCB-RFM-CC1101-RS485-NRF/1_Standard/Schematic010.png
(Den Text unter dem MAX48* beachten...)
FHEM mit FTUI. Homematic-Funk für Thermostate und Licht. MySensors als Basis für eigene HW.
Zentrale ist der MAPLE-CUL mit RFM69+HModUART-AddOn.
Doku zu meinen Projekten: Github/Ranseyer. Platinen falls verfügbar gerne auf Anfrage.
Support: gerne wenn ich Zeit+Lust habe im Forum. Nicht per PN!

smoudo

ICh habe das Beispiel 120 Ohm auf A<->B und 390 Ohm A<->VCC und B<->GND
umgesetzt. Ergebnis ist unverändert. Die Beiden Nodes die schn funktionierten gehen immer noch.
Das letzte Node sendet zwar beim boot das es da ist, aber keine Readings mehr.
Bei einer Node Eingangsversorgung über USB von 4.6 V, liegt der Bus auf 0,33V

Entweder passen die Widerstände nicht, oder es ist ein error drin!

grüße

Matze

smoudo

#19

*******************************
*
* REVISION HISTORY
* Version 1.0 - Henrik Ekblad
* Version 1.1 - GizMoCuz
*
* DESCRIPTION
* Use this sensor to measure volume and flow of your house Watermeter.
* You need to set the correct pulsefactor of your meter (pulses per m3).
* The sensor starts by fetching current volume reading from gateway (VAR 1).
* Reports both volume and flow back to gateway.
*
* Unfortunately millis() won't increment when the Arduino is in
* sleepmode. So we cannot make this sensor sleep if we also want
* to calculate/report flow.
* http://www.mysensors.org/build/pulse_water
*/

// 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

#define MY_NODE_ID 104

#include <MySensors.h>

#define DIGITAL_INPUT_SENSOR 3                  // The digital input you attached your sensor.  (Only 2 and 3 generates interrupt!)

#define PULSE_FACTOR 100                       // Nummber of blinks per m3 of your meter (One rotation/liter)

#define SLEEP_MODE false                        // flowvalue can only be reported when sleep mode is false.

#define MAX_FLOW 30                             // Max flow (l/min) value to report. This filters outliers.

#define CHILD_ID 1                              // Id of the sensor child

unsigned long SEND_FREQUENCY =
    30000;           // Minimum time between send (in milliseconds). We don't want to spam the gateway.

MyMessage flowMsg(CHILD_ID,V_FLOW);
MyMessage volumeMsg(CHILD_ID,V_VOLUME);
MyMessage lastCounterMsg(CHILD_ID,V_VAR1);

double ppl = ((double)PULSE_FACTOR)/1000;        // Pulses per liter

volatile unsigned long pulseCount = 0;
volatile unsigned long lastBlink = 0;
volatile double flow = 0;
bool pcReceived = false;
unsigned long oldPulseCount = 0;
unsigned long newBlink = 0;
double oldflow = 0;
double volume =0;
double oldvolume =0;
unsigned long lastSend =0;
unsigned long lastPulse =0;

void setup()
{
// initialize our digital pins internal pullup resistor so one pulse switches from high to low (less distortion)
pinMode(DIGITAL_INPUT_SENSOR, INPUT_PULLUP);

pulseCount = oldPulseCount = 0;

// Fetch last known pulse count value from gw
request(CHILD_ID, V_VAR1);

lastSend = lastPulse = millis();

attachInterrupt(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), onPulse, FALLING);
}

void presentation()
{
// Send the sketch version information to the gateway and Controller
sendSketchInfo("Gas Meter", "1.0");

// Register this device as Gasflow sensor
present(CHILD_ID, S_GAS);
}

void loop()
{
unsigned long currentTime = millis();

// Only send values at a maximum frequency or woken up from sleep
if (SLEEP_MODE || (currentTime - lastSend > SEND_FREQUENCY)) {
lastSend=currentTime;

if (!pcReceived) {
//Last Pulsecount not yet received from controller, request it again
request(CHILD_ID, V_VAR1);
return;
}

if (!SLEEP_MODE && flow != oldflow) {
oldflow = flow;

Serial.print("l/min:");
Serial.println(flow);

// Check that we dont get unresonable large flow value.
// could hapen when long wraps or false interrupt triggered
if (flow<((unsigned long)MAX_FLOW)) {
send(flowMsg.set(flow, 2));                   // Send flow value to gw
}
}

// No Pulse count received in 2min
if(currentTime - lastPulse > 120000) {
flow = 0;
}

// Pulse count has changed
if ((pulseCount != oldPulseCount)||(!SLEEP_MODE)) {
oldPulseCount = pulseCount;

Serial.print("pulsecount:");
Serial.println(pulseCount);

send(lastCounterMsg.set(pulseCount));                  // Send  pulsecount value to gw in VAR1

double volume = ((double)pulseCount/((double)PULSE_FACTOR));
if ((volume != oldvolume)||(!SLEEP_MODE)) {
oldvolume = volume;

Serial.print("volume:");
Serial.println(volume, 3);

send(volumeMsg.set(volume, 3));               // Send volume value to gw
}
}
}
if (SLEEP_MODE) {
sleep(SEND_FREQUENCY);
}
}

void receive(const MyMessage &message)
{
if (message.type==V_VAR1) {
unsigned long gwPulseCount=message.getULong();
pulseCount += gwPulseCount;
flow=oldflow=0;
Serial.print("Received last pulse count from gw:");
Serial.println(pulseCount);
pcReceived = true;
}
}

void onPulse()
{
if (!SLEEP_MODE) {
unsigned long newBlink = micros();
unsigned long interval = newBlink-lastBlink;

if (interval!=0) {
lastPulse = millis();
if (interval<500000L) {
// Sometimes we get interrupt on RISING,  500000 = 0.5sek debounce ( max 120 l/min)
return;
}
flow = (60000000.0 /interval) / ppl;
}
lastBlink = newBlink;
}
pulseCount++;
}




Der Sketch ist ein leicht geänderter Water Meter pulse mit einem tcrt5000 auf D3 der beim Gaszähler auf der 6 einen reflektierenden
Punkt erfasst. Die Lichtschranke löst auch brav aus (erkennbar an der LED).
Die Readings flow1, value11 und volume1 werden nicht erzeugt.

Grüße

Matze

Ranseyer

Funktioniert dieser Node denn generell ?  (Also z.B. alleine am Bus ?)

(4,6V ist m.E. auch nicht sooo doll. Habe festgestelt mit 3,3V geht es zuverlässig gar nicht... Oder hat da noch gemand genauere Erfahrungen zur Spannung?)
FHEM mit FTUI. Homematic-Funk für Thermostate und Licht. MySensors als Basis für eigene HW.
Zentrale ist der MAPLE-CUL mit RFM69+HModUART-AddOn.
Doku zu meinen Projekten: Github/Ranseyer. Platinen falls verfügbar gerne auf Anfrage.
Support: gerne wenn ich Zeit+Lust habe im Forum. Nicht per PN!

smoudo

Ich habe den Sketch auf 2 verschiedenen Nanos drauf. jeweils mit unterschiedlicher ID.
Auf dem Steckbrett am Bus dran hats funktioniert und die Pings der Lichtschranke wurden hochgezählt.
Am Zähler mit den anderen Nodes komischerweise nicht mehr. Busleitungslänge ist an der stelle ca. 30m
Bei beiden Nanos das gleiche Szenario.

smoudo

Ich habe die Widerstände am Gateway und am letzten Node montiert. Die geringe Busspannung stört mich dabei ein wenig.
Hatte mal jemand was von 2,7V geschrieben was drauf sein sollte. Da ist 0.33V natürlich ein Stück weit von weg.
Am Gateway hol ich mir die 5V vom Pi. da könnte ich nochmal messen was da effektiv durch geht.

smoudo

Pi gibt dem Node 4,2V ich habe jetzt nochmal ne brücke drauf gelötet das die Spannung vom Pi direkt auf den Pullup geht.
bringt auf dem Bus am Pi gemessen 0,5V Spannung. Es wird leicht besser funktioniert aber immer noch nicht :(

Beta-User

Doofe Frage: Paßt das IO?

(Wenn du mehrere hast, kann es sein, dass die node dem falschen Interface zugeordnet wird, ist mir jedenfallst auch schon passiert. Es sind dann auch Fehler im log zu sehen: die verworfenen, weil nicht zuordenbaren readings ;) ).

Wenn es das nicht ist, und am Anfang und Ende des Bus je 120 Ohm verbaut sind, muß ich nach dem code-Fix suchen...
Denn an sich scheint das elektrische Design ja ok zu sein.
Was die Spannung angeht: zwischen A und B sollte nur dann Spannung anliegen, wenn gesendet wird, sonst eigentlich 0V (jedenfalls, wenn ich die diversen Quellen dazu richtig verstehe).
Zitat+-200mV is the magic number with rs485. rs485 line 3 states:

       
  • Va - Vb < -0.2V = "1"
  • Va - Vb > 0.2V = "0"
  • |Va - Vb| < 0.2V = "idle"
As I know the line should be in idle state when nobody is sending.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

smoudo

IO in fhem meinst du? Jepp passt ist MySensorsGateway

Beta-User

Das meinte ich.
Ich habe 2 MySensors-GW's (für nRF und RS485, beide seriell). Manchmal scheint die Zuordnung von neuen Nodes nicht auf das richtige IO gemappt zu werden (warum auch immer, kann auch sein, dass es an einer "alten" NodeID liegt, an die sich configDB noch erinnert. Dann kommen tatsächlich nur die "Kopfdaten" an bzw. werden aktualisiert.

Scheint ja aber nicht das Problem zu sein.

Daher also der Code:

In den RS485-Teil der Sketche das einfügen
#define MY_RS485_SOH_COUNT 3MyTransportRS485.cpp wie folgt ändern:

Am Anfang einfügen:
#if !defined(MY_RS485_SOH_COUNT) #define MY_RS485_SOH_COUNT 1 #endif

Im "sending code" das
// Start of header by writing multiple SOH for(byte w=0; w<1; w++) { _dev.write(SOH); } wie folgt ändern:
// Start of header by writing multiple SOH for(byte w=0; w<MY_RS485_SOH_COUNT; w++) { _dev.write(SOH); }
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

smoudo

Das hatte ich erst vermutet und deshalb schon mit frischen Node IDs getestet.

Muss ich auch die funktionierenden nodes umflashen?

Beta-User

Erst mal nicht, denke ich.


Bzw: auf den Modulen sind 20k pull-Widerstände drauf. Würde also ggf. da auch mit höheren Werten mal testen.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

smoudo

Wo sind da pullups? Ich hab die MAX 487 drauf, nicht die rs485 Arduino Module