Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

Smartifisering av ringeklokke


Anbefalte innlegg

Koblet opp ding-dong reléet med svakere motstand og med emitter mot jord - funker!

 

Lærte at pin 16 på ESP8266 ikke bør brukes til dette reléet som lager ding-dong-lyd, pin'en går HIGH i 100ms ved boot, og det sømmer seg ikke. Pin 15 skal passe bedre.

Endret av berland
Lenke til kommentar
Del på andre sider

Loddet opp resten og satt inn i sikringskap - det funker!

 

Det trengs litt debouncing for optokobleren, det gjør jeg i programvare. Koden får kun bytte tilstand hvert 2. sekund mellom PÅ og AV for dingelyd.

 

Laget en vanlig ding-dong-lyd (400ms) en lynkjapp (50ms) og en dobbel kjapp (100ms, 50ms pause, 100 ms lyd). Dette kan sikkert brukes til noe etterhvert, og flere sekvenser kan jo lett lages.

 

STOR takk til @DeVille og @Televimsen for hjelp. Uten dere hadde jeg gitt opp ?

 

2018-09-22 18.13.28.jpg

2018-09-22 18.13.35.jpg

Lenke til kommentar
Del på andre sider

Koden er egenlaget, med utgangspunkt i eksemplene som følger med Arduino IDE;

#include <PubSubClient.h>
#include <ESP8266WiFi.h>
#include <ArduinoOTA.h>
#include <stdlib.h>

void callback(char* topic, byte* payload, unsigned int length);

 //EDIT THESE LINES TO MATCH YOUR SETUP
const char* mqtt_server = "";
const char* ssid = "";
const char* password = "";

// Pin 16 is "not safe", it goes to HIGH on boot.. Cannot be used for ding-dong.
const int switchPin1 = 16; // for deactivating all ding-dong-sound. goes high for 100ms on boot. s
const int switchPin2 = 15; // OpenHAB triggered ding-dong.

unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 2000; // Don't allow less than two secs for state change

unsigned long lastHeartbeat = 0;
unsigned long heartbeatDelay = 60000;
int heartbeatcounter = 0;

char const* switchTopic1 = "doorbell/activate";
char const* switchTopic2 = "doorbell/force";

int doorbellChimeState;
int prevChimeState;
const int inputPin = 14;

WiFiClient wifiClient;
PubSubClient client(mqtt_server, 1883, callback, wifiClient);

void setup() {
  //initialize the switch as an output and set to LOW (off)
  pinMode(switchPin1, OUTPUT); // Relay Switch 1, deaktivering av all ding-dong.
  digitalWrite(switchPin1, LOW);

  pinMode(switchPin2, OUTPUT); // Relay Switch 2; ding-dong
  digitalWrite(switchPin2, LOW);

  pinMode(inputPin, INPUT_PULLUP);

  ArduinoOTA.setHostname("Doorbell ESP8266"); // A name given to your ESP8266 module when discovering it as a port in ARDUINO IDE
  ArduinoOTA.begin(); // OTA initialization

  //start the serial line for debugging
  Serial.begin(115200);
  delay(100);

  //start wifi subsystem
  WiFi.begin(ssid, password);
  //attempt to connect to the WIFI network and then connect to the MQTT server
  reconnect();

  client.publish("doorbell/unit", "booted");
  //wait a bit before starting the main loop
  delay(100);
  client.publish("doorbell/unit", "starting");

  String ipaddress = WiFi.localIP().toString();
  char ipchar[ipaddress.length()+1];
  ipaddress.toCharArray(ipchar,ipaddress.length()+1);
  client.publish("doorbell/IP", ipchar);

}


char buffer[10];

void loop(){
  // read the state of the doorbell active sensing circuit
  doorbellChimeState = digitalRead(inputPin);

  //client.publish("doorbell/state", itoa(doorbellChimeState, buffer, 10));
  
  if ((doorbellChimeState == HIGH) && (prevChimeState != HIGH) && (millis() > lastDebounceTime + debounceDelay)) {
    lastDebounceTime = millis();
    client.publish("doorbell/chiming", "OFF");
    prevChimeState = doorbellChimeState; 
  }
  if ((doorbellChimeState == LOW) && (prevChimeState != LOW) && (millis() > lastDebounceTime + debounceDelay)) {
    lastDebounceTime = millis();
    client.publish("doorbell/chiming", "ON");
    prevChimeState = doorbellChimeState;
  }

  // Check heartbeat
  if (millis() > lastHeartbeat + heartbeatDelay) {
     lastHeartbeat = millis();
     client.publish("doorbell/heartbeat", itoa(heartbeatcounter, buffer, 10));
     heartbeatcounter++;
  }

  //reconnect if connection is lost
  if (!client.connected() && WiFi.status() == 3) {reconnect(); }

  //maintain MQTT connection
  client.loop();

  //MUST delay to allow ESP8266 WIFI functions to run
  delay(10);
  ArduinoOTA.handle();
}

void callback(char* topic, byte* payload, unsigned int length) {

  //convert topic to string to make it easier to work with
  String topicStr = topic;
  //EJ: Note:  the "topic" value gets overwritten everytime it receives confirmation (callback) message from MQTT

  //Print out some debugging info
  Serial.println("Callback update.");
  Serial.print("Topic: ");
  Serial.println(topicStr);

  if (topicStr == switchTopic1) {
    //turn the switch on if the payload is '1' and publish to the MQTT server a confirmation message
    if(payload[0] == '1'){
      digitalWrite(switchPin1, HIGH);
      client.publish("doorbell/confirmActive", "1");
    }

    //turn the switch off if the payload is '0' and publish to the MQTT server a confirmation message
    else if (payload[0] == '0'){
      digitalWrite(switchPin1, LOW);
      client.publish("doorbell/confirmActive", "0");
      }
   }
   else if (topicStr == switchTopic2) {
     if (payload[0] == '3'){
       // Quick ding-dong
       client.publish("doorbell/confirmForce", "3");
       digitalWrite(switchPin2, HIGH);
       delay(40);
       digitalWrite(switchPin2, LOW);
     }     
     if (payload[0] == '2'){
       // Quick double ding-dong
       client.publish("doorbell/confirmForce", "2");
       digitalWrite(switchPin2, HIGH);
       delay(100);
       digitalWrite(switchPin2, LOW);
       delay(150);
       digitalWrite(switchPin2, HIGH);
       delay(100);
       digitalWrite(switchPin2, LOW);
     }
     if(payload[0] == '1'){
       digitalWrite(switchPin2, HIGH);
       client.publish("doorbell/confirmForce", "1");
       client.publish("doorbell/forcechiming", "on");
       delay(400);
       digitalWrite(switchPin2, LOW);
       client.publish("doorbell/forcechiming", "off");
       }
     //turn the switch off if the payload is '0' and publish to the MQTT server a confirmation message
     // THIS SHOULD NEVER BE NECESSARY
     else if (payload[0] == '0'){
       digitalWrite(switchPin2, LOW);
       client.publish("doorbell/confirmForce", "0");
     }
   }
}

void reconnect() {

  //attempt to connect to the wifi if connection is lost
  if(WiFi.status() != WL_CONNECTED){
    //debug printing
    Serial.print("Connecting to ");
    Serial.println(ssid);

    //loop while we wait for connection
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }

    //print out some more debug once connected
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
  }

  //make sure we are connected to WIFI before attemping to reconnect to MQTT
  if(WiFi.status() == WL_CONNECTED){
  // Loop until we're reconnected to the MQTT server
    while (!client.connected()) {
      Serial.print("Attempting MQTT connection...");

      // Generate client name based on MAC address and last 8 bits of microsecond counter
      String clientName;
      clientName = "esp8266-doorbell";
      
      //if connected, subscribe to the topic(s) we want to be notified about
      //EJ: Delete "mqtt_username", and "mqtt_password" here if you are not using any
      if (client.connect((char*) clientName.c_str())) { 
        Serial.println("\tMQTT Connected");
        client.subscribe(switchTopic1);
        client.subscribe(switchTopic2);
        client.publish("doorbell/unit", "connected mqtt");
        // client.publish("doorbell/ip", WiFi.localIP());
      }

      //otherwise print failed for debugging
      else{Serial.println("\tFailed."); abort();}
    }
  }
}

 

  • Like 1
Lenke til kommentar
Del på andre sider

Koden over er den jeg har kompilert til firmware i Arduino IDE, og så flasher jeg ESP8266 med den. Brikka var kanske en "NodeMCU" når jeg kjøpte den, men etter at jeg har flashet min egen ringeklokke-firmware, er det ingen spor av NodeMCU lenger på den.

Lenke til kommentar
Del på andre sider

  • 2 uker senere...

Fikk etterhvert også testes "deaktiveringen" av lyd. Oppdaget da en bug i koblingene som gjorde at jeg måtte lodde om ("2" fra optokobler flyttet fra ledning "4" til ledning "6"). Tegningen som tidligere er lenket til er oppdatert og er riktig. Problemet var at når dørklokka var lydløs, så kom det heller ikke strøm til optokobler, og da fikk jeg ikke pushmelding hvis noen ringte på.

 

Laget trykkepanel i HABPanel (ja, dette innbyr til tull). Trykker man på den grønne knappen så blir den rød, og da er det ingen lyd i ringeklokka.

dingdongknapper.png.e42176b404907e083bab1155ac4f919c.png

 

Implementerte regler:

* Hvis det ringer på, så får jeg push på telefon, Alexa sier i fra, og det kommer opp melding på TV hvis det er på ("Toast" på LG-tv)

* Hvis det ringer på, og vi ikke er hjemme, så dimmes utelys noe ned.

* Hvis det ringer på, og vi er hjemme, men lys er noe neddimmet, skrus utelys på full styrke.

 

Ikke-implementert: Gi lyd i garasje/verksted når det ringer på. Mangler en styrbar lydkilde her, så det må på plass. Kanskje en Alexa til.

 

Idéstadiet:

* Deaktivere lyd når alarm er på. Men vet ikke om det er noe poeng.

* Deaktivere lyd om natta. Ikke noe poeng, har ikke blitt vekket uten grunn av ringeklokka om natta. Ringer noen på om natta er det kanskje et poeng å våkne.

 

31. oktober får jeg finne på noe mer, trenger tilgang til utendørs fargelys-spot! Blinkende utelys ihvertfall.

 

Lenke til kommentar
Del på andre sider

49 minutter siden, berland skrev:

31. oktober får jeg finne på noe mer, trenger tilgang til utendørs fargelys-spot! Blinkende utelys ihvertfall.

 

Jeg har 3x ikea Trådfri rgb i utelysene. :) kobler de og en liten høyttaler til ringeklokka ;) 

Lenke til kommentar
Del på andre sider

  • 6 måneder senere...

Litt utenfor temaet kanskje, men jeg vurderer å få satt inn en MeanWell HDR-15 (AC/DC strømforsyning) til RPi Zero som skal lese fra en Oss-brikke. 

Hvordan er disse transformatorene (inkludert ringeklokke-transformator) typisk koblet? Står de bare på en hvilken som helst kurs, eller skal de ha en egen sikring?

 

Vil tro de har et internt overbelastningsvern som kutter, og er avstengt til sikring er skrudd av/på igjen?

Lenke til kommentar
Del på andre sider

På 10.5.2019 den 13.23, DIYglenn skrev:

Litt utenfor temaet kanskje, men jeg vurderer å få satt inn en MeanWell HDR-15 (AC/DC strømforsyning) til RPi Zero som skal lese fra en Oss-brikke. 

Hvordan er disse transformatorene (inkludert ringeklokke-transformator) typisk koblet? Står de bare på en hvilken som helst kurs, eller skal de ha en egen sikring?

 

Min trafo er koblet på en tilfeldig annen kurs.

Lenke til kommentar
Del på andre sider

Bli med i samtalen

Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.