Hallo,
ich habe eine Standuhr, bei der regelmäßig die Gewichte aufgezogen werden müssen. Sie reagiert sehr sensibel darauf, wenn man es vergisst und die Gewichte am Boden aufkommen. Dann spielt das Uhrwerk "verrückt" und die Uhr muss gefühlt 50 x angestoßen werden, damit sie wieder läuft. Naja, eine altes Teil halt.
Daher baue ich mir gerade eine "Alarmanlage", die mault, wenn es wieder nötig ist So übersehe ich es hoffentlich nicht mehr.
So soll die Node aussehen:
PIN 6+7 Abstandssensor
PIN 4 Relay 1
PIN 5 Relay 2
PIN 3 Buzzer
Der Abstandsensor meldet FHEM, wie weit die Gewichte noch vom Boden entfernt sind.
Am Relay 1 hängt eine rote LED, die über ein Notify geschaltet werden soll. (z.B. bei Abständen kleiner 20 cm)
Am Relay 2 hängt nix; es ist nur ein Dummy, das bei ON eine kleine Soundroutine an den Buzzer schickt (ohne tone(), da es offenbar einen Timerkonflikt von tone() und ping() gibt.)) Aber das tut so gut genug. (z.B. bei Abständen kleiner 10 cm)
Ich bin beim C-Programmieren nicht so super firm, aber vielleicht kann jemand den Code gebrauchen, denn es funktioniert zumindest schon mal wie beschrieben.
Für Verbesserungsvorschläge bin ich ebenfalls offen:
So muss die gesamte Steuerung ja wahrlich nicht über FHEM gehen. Charmanter wäre es sicher die Parameter (Abstände für LED und Buzzer) von FHEM an die Node zu übergeben dort zu speichern und ohne ein Notify den Alarm auslösen. Wie man das aufsetzt, übersteigt allerdings aktuell meine Kenntnisse.
Viele Grüße und Danke vorab
Matthias
List vom Sensor
Internals:
CFGFN
DEF 103
IODev gateway
I_SKETCH_NAME Distance and Relay Sensor
I_SKETCH_VERSION 1.0
NAME MYSENSOR_103
NR 137962
STATE ???
TYPE MYSENSORS_DEVICE
ack 0
protocol 2.2.0
radioId 103
repeater 1
READINGS:
2018-05-26 17:37:59 SKETCH_NAME Distance and Relay Sensor
2018-05-26 17:37:59 SKETCH_VERSION 1.0
2018-05-27 13:08:04 distance 31
2018-05-26 17:37:59 parentId 0
2018-05-26 17:55:07 status1 on
2018-05-26 18:10:41 status2 off
readingMappings:
0:
13:
name distance
43:
name unitprefix
1:
17:
name power1
2:
name status1
val:
0.0 off
1.0 on
2:
17:
name power2
2:
name status2
val:
0.0 off
1.0 on
sensorMappings:
0:
receives:
sends:
16
15
1:
receives:
sends:
16
15
10:
receives:
sends:
6
7
11:
receives:
sends:
11
12:
receives:
sends:
12
14
13:
receives:
24
sends:
17
18
54
55
56
24
14:
receives:
sends:
45
21
0
2
15:
receives:
sends:
13
43
16:
receives:
sends:
23
17:
receives:
sends:
18:
receives:
sends:
19:
receives:
36
sends:
36
2:
receives:
sends:
16
15
20:
receives:
32
sends:
33
50
32
21:
receives:
24
sends:
34
35
24
22:
receives:
sends:
37
43
23:
receives:
24
25
26
27
28
sends:
24
25
26
27
28
24:
receives:
sends:
37
43
25:
receives:
sends:
19
20
26:
receives:
40
17
sends:
40
17
27:
receives:
41
17
sends:
41
17
28:
receives:
40
sends:
40
29:
receives:
sends:
2
0
45
44
21
46
22
3:
receives:
2
17
sends:
2
17
30:
receives:
sends:
38
39
14
31:
receives:
sends:
2
16
32:
receives:
sends:
16
15
33:
receives:
sends:
37
16
15
34:
receives:
sends:
37
16
15
35:
receives:
sends:
37
16
15
36:
receives:
47
sends:
47
37:
receives:
sends:
34
35
38:
receives:
sends:
49
39:
receives:
sends:
0
51
52
53
2
4:
receives:
2
3
17
sends:
2
3
17
5:
receives:
29
30
31
3
sends:
29
30
31
3
6:
receives:
sends:
0
42
7:
receives:
sends:
1
8:
receives:
sends:
4
5
9:
receives:
sends:
8
9
10
setcommands:
sets:
power1
power2
reboot
status1 off,on
status2 off,on
time
typeMappings:
0:
type temperature
1:
type humidity
10:
type direction
11:
type uv
12:
type weight
13:
type distance
14:
type impedance
15:
type armed
val:
0 off
1 on
16:
type tripped
val:
0 off
1 on
17:
type power
18:
type energy
19:
type button_on
2:
type status
val:
0 off
1 on
20:
type button_off
21:
type hvacflowstate
22:
type hvacspeed
23:
type brightness
range:
max 100
min 0
step 1
24:
type value1
25:
type value2
26:
type value3
27:
type value4
28:
type value5
29:
type up
3:
type percentage
range:
max 100
min 0
step 1
30:
type down
31:
type stop
32:
type ir_send
33:
type ir_receive
34:
type flow
35:
type volume
36:
type lockstatus
val:
0 off
1 on
37:
type level
38:
type voltage
39:
type current
4:
type pressure
40:
type rgb
41:
type rgbw
42:
type id
43:
type unitprefix
44:
type hvacsetpointcool
45:
type hvacsetpointheat
46:
type hvacflowmode
47:
type text
48:
type custom
49:
type position
5:
type forecast
val:
0 stable
1 sunny
2 cloudy
3 unstable
4 thunderstorm
5 unknown
50:
type ir_record
51:
type ph
52:
type orp
53:
type ec
54:
type value
55:
type va
56:
type power_factor
6:
type rain
7:
type rainrate
8:
type wind
9:
type gust
Attributes:
IODev gateway
mapReading_distance 0 distance
mapReading_power1 1 power
mapReading_power2 2 power
mapReading_status1 1 status 0.0:off 1.0:on
mapReading_status2 2 status 0.0:off 1.0:on
mapReading_unitprefix 0 unitprefix
mode repeater
setReading_power1 1
setReading_power2 1
setReading_status1 off,on
setReading_status2 off,on
version 2.2.0
Arduino-Sketch:
/**
* 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-2015 Sensnology AB
* Full contributor list: https://github.com/mysensors/Arduino/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 - Henrik EKblad
*
* DESCRIPTION
* This sketch provides an example how to implement a distance sensor using HC-SR04
* http://www.mysensors.org/build/distance
*/
// Enable debug prints
#define MY_NODE_ID 103
#define MY_DEBUG
// Enable and select radio type attached
#define MY_RADIO_NRF24
//#define MY_RADIO_RFM69
#define MY_REPEATER_FEATURE
#include <SPI.h>
#include <MySensors.h>
#include <NewPing.h>
#define CHILD_ID_DIS 0 //Child ID für Distanz-Sensor
#define CHILD_ID_REL1 1 //Child ID für Relais 1
#define CHILD_ID_REL2 2 //Child ID für Relais 2
#define TRIGGER_PIN 6 // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN 7 // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 300 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
unsigned long SLEEP_TIME = 5000; // Sleep time between reads (in milliseconds)
#define RELAY_PIN 4 // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
#define NUMBER_OF_RELAYS 2 // Total number of attached relays
#define RELAY_ON 1 // GPIO value to write to turn on attached relay
#define RELAY_OFF 0 // GPIO value to write to turn off attached relay
#define PIEZO_PIN 3 // Da hängt der Buzzer dran
#define MaxI 50
int REL_1value; //Status des Relais 1
int REL_2value; //Status des Relais 2
int lastREL_1value; //letzter Status des Relais 1
int lastREL_2value; //letzter Status des Relais 2
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
MyMessage msgDis(CHILD_ID_DIS, V_DISTANCE);
MyMessage msgRel1(CHILD_ID_REL1, V_STATUS);
MyMessage msgRel2(CHILD_ID_REL2, V_STATUS);
int lastDist;
bool metric = true;
void before()
{
for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
// Then set relay pins in output mode
pinMode(pin, OUTPUT);
// Set relay to last known state (using eeprom storage)
digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF);
}
}
void setup()
{
metric = getControllerConfig().isMetric;
pinMode (PIEZO_PIN, OUTPUT);
}
void presentation() {
// Send the sketch version information to the gateway and Controller
sendSketchInfo("Distance and Relay Sensor", "1.0");
// Register all sensors to gw (they will be created as child devices)
present(CHILD_ID_DIS, S_DISTANCE);
present(CHILD_ID_REL1, S_BINARY);
present(CHILD_ID_REL2, S_BINARY);
// for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
// Register all sensors to gw (they will be created as child devices)
// present(sensor, S_BINARY);
//}
}
void loop()
{
int dist = metric?sonar.ping_cm():sonar.ping_in();
Serial.print("Ping: ");
Serial.print(dist); // Convert ping time to distance in cm and print result (0 = outside set distance range)
Serial.println(metric?" cm":" in");
if (dist != lastDist) {
send(msgDis.set(dist));
lastDist = dist;
}
// Einlesen des Status der Relay-Pins
REL_1value=digitalRead(RELAY_PIN+0);
REL_2value=digitalRead(RELAY_PIN+1);
// Prüfen ob sicher der Wert des Relay-Pins geändert hat; nur wenn Änderung, dann senden an Gateway und Serial
if (REL_1value != lastREL_1value) {
send(msgRel1.set(REL_1value, 1));
Serial.print(REL_1value);
lastREL_1value = REL_1value;
}
// Prüfen ob sicher der Wert des Relay-Pins geändert hat; nur wenn Änderung, dann senden an Gateway und Serial
if (REL_2value != lastREL_2value) {
send(msgRel2.set(REL_2value, 1));
Serial.print(REL_2value);
lastREL_2value = REL_2value;
}
// Prüfen ob Relay 2 auf ON, dann kurze Krach-Routine
if (REL_2value == HIGH){
for (int i = 0; i < MaxI; i++) {
krach ();
}
}
sleep(SLEEP_TIME);
}
void receive(const MyMessage &message)
{
// We only expect one type of message from controller. But we better check anyway.
if (message.type==V_STATUS) {
// Change relay state
digitalWrite(message.sensor-1+RELAY_PIN, message.getBool()?RELAY_ON:RELAY_OFF);
// Store state in eeprom
saveState(message.sensor, message.getBool());
// Write some debug info
Serial.print("Incoming change for sensor:");
Serial.print(message.sensor);
Serial.print(", New status: ");
Serial.println(message.getBool());
}
}
void krach()
{
digitalWrite(PIEZO_PIN, HIGH);
delay(10);
digitalWrite(PIEZO_PIN, LOW);
delay(10);
}