NodeMCU ESP8266 - Philips Hue lamp

Hardware / electronica onderwerpen
Berichten: 2
Geregistreerd: 16 Jan 2021, 23:44

NodeMCU ESP8266 - Philips Hue lamp

Berichtdoor Victorc » 16 Jan 2021, 23:55

Goedendag!

Ik ben begonnen met een project met ESP8266 (mijn eerste project).
Wat ik wil doen is het volgende. Ik wil een wandschakelaar aansluiten op de ESP8266, om een Philips Hue lamp te schakelen. Elke keer als de wandschakelaar in een andere stand wordt gezet, wil ik de status van de lamp veranderen (is de lamp aan, dan uitzetten en andersom).

Mijn idee is om de ground en pin1 aan de wandschakelaar te verbinden. Afhankelijk van de status van de wandschakelaar, wordt pin1 dan met de ground verbonden.

De code die ik gebruik is:
Code: Alles selecteren
#include <ESP8266WiFi.h>
#include <SPI.h>

// Wifi Settings
const char* ssid = "xxx";
const char* password = "xxx";

// Hue Settings

const char hueHubIP[] = "xxx"; // Hue Bridge IP
const int hueHubPort = 80;
const char hueUsername[]="xxx"; // Hue Bridge user -To create a user check this page (http://support.intuilab.com/kb/connecte ... hue-lights)
String light="1";

// Commands

String hue_on="{\"on\":true}";
String hue_off="{\"on\":false}";

boolean state = false; // for monitoring switch state changes
boolean previousState; // ditto
boolean onOffState = false;   // To store actual on/off state of light as reported by Hue bridge
int switchPin = 5; // -- control sense pin, mapped to D1 on NodeMCU

WiFiClient client;

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);     // Initialize LED_BUILTIN pin as output

  Serial.begin(9600);
  pinMode(switchPin, INPUT_PULLUP); // pin will be pulled low by grounding load terminal on switch
  delay(10);

  // We start by connecting to a WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  //WiFi.config(ip, gateway, subnet);
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
 
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  previousState = digitalRead(switchPin); // for checking for state change
  digitalWrite(LED_BUILTIN, HIGH);  // HIGH = Turn the LED off
  Serial.println("State Switch:");
  Serial.println(previousState);
}

void loop() {
  state = digitalRead(switchPin); // for checking for state change

  if (state != previousState) // state change
  {
    previousState == state;
   
    getHue();
    delay(500);
   
    if (onOffState == true)                         // If lights are on, send "Off" command
    {
      Serial.println("");
      Serial.print("Switch lamp off");
      String command =  "{\"on\": false}";
      setHue(command);
      digitalWrite(LED_BUILTIN, LOW);   // LOW = Turn the LED on (opposite of Arduino)
    }
    else                                            // If lights are off, send "On" command
    {
      Serial.println("");
      Serial.print("Switch lamp on");
      String command =  "{\"on\": true}";
      setHue(command);
      digitalWrite(LED_BUILTIN, HIGH);  // HIGH = Turn the LED off
    }
  }
}


void setHue(String command)
{
  if (client.connect(hueHubIP, hueHubPort))
  {
    client.print("PUT /api/");
    client.print(hueUsername);
    client.print("/lights/");
    client.print(light);
    client.println("/state HTTP/1.1");
    client.println("keep-alive");
    client.print("Host: ");
    client.println(hueHubIP);
    client.print("Content-Length: ");
    client.println(command.length());
    client.println("Content-Type: text/plain;charset=UTF-8");
    client.println();                             // Blank line before body
    client.println(command);
    client.stop();
  }
}

void getHue()
{
  if (client.connect(hueHubIP, hueHubPort))
  {
    client.print("GET /api/");
    client.print(hueUsername);
    client.print("/lights/");
    client.print(light);
    client.println(" HTTP/1.1");
    client.print("Host: ");
    client.println(hueHubIP);
    client.println("Content-type: application/json");
    client.println("keep-alive");
    client.println();
    while (client.connected())
    {
      if (client.available())
      {
        client.findUntil("\"on\":", "\0");
        onOffState = (client.readStringUntil(',') == "true");
        break;
      }
    }
    client.stop();
  }
}


Om te testen of het werkt, voordat ik het aansluit op de wandschakelaar, heb ik de Ground met pin 1 verbonden. Als ik dat doe, blijft de status van de lamp constant wisselen (lamp gaat continue aan/uit). Terwijl mijn verwachting is dat de stand van de lamp maar 1 keer veranderd.

Het lijkt erop dat de code goed is, maar dat ik de electronica niet goed aansluit. Wie kan me op weg helpen?
Alvast bedankt!

Advertisement

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: NodeMCU ESP8266 - Philips Hue lamp

Berichtdoor shooter » 18 Jan 2021, 21:56

zet eens een delay net na het opvragen van de digitalread, want nu gaat het allemaal erg snel natuurlijk.of pak een 10 kiloohm weerstand en zet die aan de 3.3 Volt, en wat gebeurt er met de LED blijft die wel goed? dan heb je een fout in het aansturen doe er maar eens een paar delays tussen want het gaat allemaal erg snel natuurlijk.
paul deelen
shooter@home.nl

Berichten: 2
Geregistreerd: 16 Jan 2021, 23:44

Re: NodeMCU ESP8266 - Philips Hue lamp

Berichtdoor Victorc » 18 Jan 2021, 22:56

Er zat een fout in de code. Het werkt nu super!
Bedankt voor de hulp.

Berichten: 1
Geregistreerd: 03 Okt 2021, 11:28

Re: NodeMCU ESP8266 - Philips Hue lamp

Berichtdoor JvI » 03 Okt 2021, 11:36

Ik ben ook net begonnen met ESP8266. Wil jou code als basis gebruiken voor mijn eerste project.
Kun jij aangeven wat de fout was in jouw code?
Bedankt!

Terug naar ESP Hardware

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten