Go Down

Topic: MQTT- ethernet, hoe toggle switch veranderen in pushbutton. Arduino Uno (Read 587 times) previous topic - next topic

2stimpy

Al een tijdje ben ik aan het worstelen om een juiste oplossing te vinden op mijn vraag.
Het liefst had ik het zelf uitgedokterd, maar ik kom er niet uit.

Onderstaande code heb ik van codebender.
Hierin zitten een paar kleine veranderingen verwerk zodat dit op zich prima werkt en ook via MQTT de juiste berichten zend. Dit is een code die bij 1 keer indrekken de led aan zet en een on bericht verstuurd, nog een keer drukken zet het weer uit en stuurt een off bericht. en toggle switch dus.


Ik wil een setup maken  voor bij mijn toegangs poort.

#1, Een druktoets om de bel te activeren, dat is een drukknop. Via home assistant wil ik dan op basis van het MQTT bericht een relais schakelen die een bel aan stuurt. Met een Automation in HA zet ik de schakelaar na een halve seconde automatisch weer uit. Feitelijk maak ik daarmee een drukknop. dat werkt voor deze toepassing prima.

#2, Een doorrij sensor die bij onderbreking van de straal een contact verbreekt. Dat werkt ook prima want de led schakelt pas in als de knop los gelaten word. Dus als iets de straal onderbreekt dan gaat de led aan en komt het bericht aan, door een automatisering gaat deze na een halve seconde weer uit.
Zolang als de straal dan onderbroken blijft zal er niet nog weer een signaal verstuurd worden. Prima dus.

#3 en #4 zijn reed contacten die registreren of het hek open is, of dicht. Hiervoor ben ik dus eigenlijk de drukknop functionaliteit nodig.
Als het hek dicht is maakt de reedcontact verbinding en dan is de knop dus feitelijk continu aan.
Als het hek open gaat dan verbreekt het contact, met de huidige code schakelt hij dan pas.

Ik hoop dat imand mij in de juiste richting kan helpen.
Dat kan natuurlijk ook betekenen dat ik een heel andere weg in moet slaan.
Ik wil dit wel op een arduino uno uit voeren, omdat ik die heb, en met de ethernet shield bedraad verbinding kan maken.

Code: [Select]
/*
 Example MQTT-switch-relay-node with 4 buttons and 4 leds
 
  - connects to an MQTT server
  - publishes "hello world" to the topic "led"
  - subscribes to the topic "led"
  - controls 4 leds on pins 2,3,5 and 6 - leds can be replaced with relays
  - reads 4 button on pins 7,8,9 and 10
  - turns on/off a specific led when it receives a specific "on"/"off" from the "led" topic
  - sends a specific "on"/"off" to the "led" topic a specific button is pressed
  - multiple arduino's with same generic sketch can run parallel to each other
  - multiple arduino's need each to have a unique ip-addres, unique mac address and unique MQTT client-ID

  - tested on arduino-uno with W5100 ethernet shield
  - Ethernet Shield W5100 uses pins 4,10,11,12,13
  - availbale digital pins: 1,2,3,5,6,7,8,9,10
*/

//------------------------------------------------------------------------------

#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#include <Bounce2.h>

// Set led variables to Arduino digital pins
int led1 = 2;
int led2 = 3;
int led3 = 5;                             // pin 4 used by ethernet shield
int led4 = 6;


// Set button variables to Arduino digital pins
int button1 = 7;
int button2 = 8;
int button3 = 9;
int button4 = 10;                         // pins 11,12,13 used by ethernetshield

// Set variables to act as virtual switches
// Set variable values initially to LOW (and not HIGH)
int led1Value = LOW;             
int led2Value = LOW;
int led3Value = LOW;
int led4Value = LOW;


//---------------------------------------------------------------------------

// Arduino MAC address is on a sticker on your Ethernet shield
// must be unique for every node in same network
// To make a new unique address change last letter

byte mac[]    = { 0xxE, 0xxD, 0xxE, 0xxF, 0xxE, 0xxE }; 

// Unique static IP address of this Arduino - change to adapt to your network
IPAddress ip(x, x, x, x);

// IP Address of your MQTT broker - change to adapt to your network
IPAddress server(x, x, x, x);

// Handle and convert incoming MQTT messages ----------------------------------------

void callback(char* topic, byte* payload, unsigned int length) {
  // handle message arrived
  String content="";
  char character;
  for (int num=0;num<length;num++) {
      character = payload[num];
      content.concat(character);
  }   
  Serial.println(topic);
  Serial.println(content); // message sent out by button actions is returned from broker and serial printed


// Set specific virtual switches on basis of specific incoming messages ----------------------------
 
  if (content == "1on") {
    led1Value = HIGH;
  }
 
  if (content == "1off") {
    led1Value = LOW;
  }
 
  if (content == "2on") {
    led2Value = HIGH;
  }
 
  if (content == "2off") {
    led2Value = LOW;
  }

 
  if (content == "3on") {
    led3Value = HIGH;
  }
 
  if (content == "3off") {
    led3Value = LOW;
  }
 
  if (content == "4on") {
    led4Value = HIGH;
  }
 
  if (content == "4off") {
    led4Value = LOW;
  }
 
   
  // Set digital pin states according to virtual switch settings
   
  digitalWrite(led1,led1Value);
  digitalWrite(led2,led2Value);
  digitalWrite(led3,led3Value);
  digitalWrite(led4,led4Value);

}

// Initiate instances -----------------------------------

EthernetClient ethClient;
PubSubClient client(server, 1883, callback, ethClient);

// Initiate a bouncer instance for each button
Bounce bouncer1 = Bounce();
Bounce bouncer2 = Bounce();
Bounce bouncer3 = Bounce();
Bounce bouncer4 = Bounce();

//-------------------------------------------------------

void setup()

{

  // setup led, button, bouncer 1 -----------------------
  pinMode(led1, OUTPUT);
  pinMode(button1,INPUT);
  digitalWrite(button1,HIGH);
  bouncer1 .attach(button1);
  bouncer1 .interval(5);

  // setup led, button, bouncer 2 -----------------------
  pinMode(led2, OUTPUT);
  pinMode(button2,INPUT);
  digitalWrite(button2,HIGH);
  bouncer2 .attach(button2);
  bouncer2 .interval(5);

  // setup led, button, bouncer 3 -----------------------
  pinMode(led3, OUTPUT);
  pinMode(button3,INPUT);
  digitalWrite(button3,HIGH);
  bouncer3 .attach(button3);
  bouncer3 .interval(5);

  // setup led, button, bouncer 4 -----------------------
  pinMode(led4, OUTPUT);
  pinMode(button4,INPUT);
  digitalWrite(button4,HIGH);
  bouncer4 .attach(button4);
  bouncer4 .interval(5);

  // setup serial and ethernet communications -------------------------------

  // Setup serial connection
  Serial.begin(9600);

  // Setup ethernet connection to MQTT broker
  Ethernet.begin(mac, ip);
  if (client.connect("arduino-ip-238", "xxxxxx", "xxxxx")) {  // change as desired - clientname must be unique for MQTT broker
    client.publish("led","hello world - here arduino ip 239");
    Serial.println("connected");
    client.subscribe("led"); // subscribe to topic "led"
  }
}

//----------------------------------------------

void loop()
{

// Listen for button interactions and take actions ---------------------------------------- 
// Note: Button actions do send MQTT message AND do set led(x)Value to HIGH or LOW

  if (bouncer1.update()) {
    if (bouncer1.read() == HIGH) {
      if (led1Value == LOW) {
        led1Value = HIGH;
        client.publish("led","1on");
      } else {
        led1Value = LOW;
        client.publish("led","1off");
      }
    }
  } 

//-----------------------------------------------
 
  if (bouncer2.update()) {
    if (bouncer2.read() == HIGH) {
      if (led2Value == LOW) {
        led2Value = HIGH;
        client.publish("led","2on");
      } else {
        led2Value = LOW;
        client.publish("led","2off");
      }
    }
  } 
 
//------------------------------------------------ 

  if (bouncer3.update()) {
    if (bouncer3.read() == HIGH) {
      if (led3Value == LOW) {
        led3Value = HIGH;
        client.publish("led","3on");
      } else {
        led3Value = LOW;
        client.publish("led","3off");
      }
    }
  } 

//-----------------------------------------------
 
  if (bouncer4.update()) {
    if (bouncer4.read() == HIGH) {
      if (led4Value == LOW) {
        led4Value = HIGH;
        client.publish("led","4on");
      } else {
        led4Value = LOW;
        client.publish("led","4off");
      }
    }
  } 
 
//------------------------------------------------ 
 
  client.loop();
}

// End of sketch ---------------------------------
 

MAS3

Hoi 2stimpy, welkom bij het Nederlandstalige gedeelte van dit forum.

Jouw code is niet heel erg groot, maar bevat wel wat meer dan wat je hier laat zien.
Ik doel daarmee op bounce2.
Dat is ongetwijfeld een methode om te debouncen, het afhandelen van contactdender.
Maar ik heb geen idee hoe dat ding dat doet, alleen over hoe dit over het algemeen ongeveer word gedaan.
Dit ding kan jouw wens wel beïnvloeden.

Ik vermeod dat de oplossing van je probleem te vinden zal zijn in de blink without delay sketch.]
Dat is heel vaak het geval, daarom staat daar ook een opmerking over in mijn handtekening onder elke post.
Maar ik heb er ook een kort onderwerp over gemaakt hier in het Nederlandstalige gedeelte, en dat onderwerp is vastgezet zodat ie altijd bovenaan dit gedeelte te vinden is.
Van die sketch kun je veel meer leren dan je in de 1e instantie zou denken, en daarom raad je je ook hier weer aan het ding erbij te pakken en een paar keer door te lezen om het te doorgronden.
Daarna kun je er eens flink mee gaan spelen en die code aanpassen om te zien of dat doet wat jij er van verwacht.
Dat heb ik ook gedaan en kwam daarbij dus tot de conclusie dat er uit die sketch heel veel te leren valt, wat ik elke keer als ik iets aan het coden ben weer gebruik.
Hierbij gaat het dus niet alleen om het voorkomen van delay(), want dat heb ik in jouw code ook niet gezien.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

2stimpy

Bedankt voor je antwoord, ik had inderdaad ook al even op die blink without delay gekeken.
Maar omdat ik deze weg was ingeslagen wilde ik eerst kijken of ik dit op een simpele manier aan de praat kon krijgen.

Go Up