Distance + Relay Sensor (Alarm für antike Standuhr)

Begonnen von presskopf, 27 Mai 2018, 13:38:08

Vorheriges Thema - Nächstes Thema

presskopf

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);
}