ZoRaC Skrevet 30. mars 2017 Skrevet 30. mars 2017 Som nevnt i et par tråder, så har jeg planer om å finne en løsning på å kunne trigge HS fra min Harmony-fjernkontroll. Harmony-plugin baserer seg på "polling" og det vil da ta tid før den reagerer på noe. Jeg har derfor tenkt å lage en (billig og enkel) løsning selv! Utstyr: • NodeMCU • IR-modul • 3D-printet boks Første "oppkobling": Hva jeg ellers har gjort: • lagt til en ny TV i Harmony-oppsettet (av et merke jeg ikke har) og sagt at denne alltid er på • opprettet en ny device i HS for fjernkontrollen, foreløpig bare med statusrange 0-99999999 Tanken er å først bare bruke denne koden: https://github.com/markszabo/IRremoteESP8266/blob/master/examples/IRrecvDemo/IRrecvDemo.ino til å finne verdiene for tallene 0-9 på fjernkontrollen. Deretter opprette 10 statusvalues på devicen. F.eks kan det som er tallet 1 på fjernkontrollen være status "filmlys". Deretter skal NodeMCU lytte etter IR-signal og sende de til HS via JSON. Første forsøk gikk ikke så bra - ser ikke ut til at den mottar noe IR-signal. Har prøvd 2 IR-mottakere, annen datapin, både 3v og vin for strøm, prøvde til og med å snu IR-mottakeren, i tilfelle pinnene var motsatt. Forslag til videre feilsøking? 1 Siter
ZoRaC Skrevet 30. mars 2017 Forfatter Skrevet 30. mars 2017 1 time siden, ZoRaC skrev: Forslag til videre feilsøking? Fant denne metoden for å teste IR-mottakeren: https://learn.adafruit.com/ir-sensor/testing-an-ir-sensor Må bare vente til resistorene jeg har bestilt kommer i posten... Siter
Lazarus Skrevet 30. mars 2017 Skrevet 30. mars 2017 Jeg hadde en ir receiver som så ut som din, den hadde annen pin out enn de som refereres til som den vanlige pin out. Min brant opp og da jeg satte inn en annen receiver så virket det fint. Tester du med standard demoprosjekt for IRremote(8266) biblioteket eller egen kode? er det ingen respons? hvilke pins bruker du på NodeMCU(Det har veldig mye å si da min resatte all kode ved restart når jeg benyttet meg av "feil" pin...). Siter
ZoRaC Skrevet 8. april 2017 Forfatter Skrevet 8. april 2017 (endret) Den 30.3.2017 klokken 22.34, Lazarus skrev: Tester du med standard demoprosjekt for IRremote(8266) biblioteket eller egen kode? er det ingen respons? hvilke pins bruker du på NodeMCU(Det har veldig mye å si da min resatte all kode ved restart når jeg benyttet meg av "feil" pin...). Testet med eksempel-fila for IR-biblioteket. Ingen respons. Prøvde forskjellige, D4 og D6. Passet på å i koden bruke konstantene D4 og D6, så da skal det bli rett. Har nå fått LEDs og resistorer og testet metoden over - ingen lys i LED. For å sjekke at LED var i orden, fjernet jeg IR-mottakeren, men får ikke lys da heller... Bruker G og VU på NodeMCU (måler 5,28v der). Koblet den lange LED-pinnen til VU og mellom en av de korte og G satte jeg inn en 220 Ohm resistor. Prøvde alle de 3 korte pinnene på LED, men ingen lys. Hva gjøre jeg feil? EDIT: Den lange skulle være G og de 3 andre VU (3 forskjellige farger). Da skal jeg prøve med IR-mottakeren igjen! Endret 8. april 2017 av ZoRaC Siter
ZoRaC Skrevet 8. april 2017 Forfatter Skrevet 8. april 2017 Da har jeg prøvd med flere forskjellig IR-mottakere, men får ikke lys i LED... har også dobbelsjekket datasheets og pinout på IR-mottaker skal være riktig. Noen flere forslag? Kan jeg måle pinout på IR-mottakeren på noe vis for å verifisere? Siter
ZoRaC Skrevet 25. april 2017 Forfatter Skrevet 25. april 2017 Da har jeg fått nye IR-mottakere, av en annen type ("TSOP4838"). Koblet opp testen med en LED og resistor, men får fortsatt ikke lys i LED'en! Koblet det også opp mot NodeMCU'en (prøvd både D1 og D6), men den registrerer heller ikke noe signal. Prøvd å mate IR-mottakeren med både 3v og 5v, men ingen forskjell. Hva i all verden kan være problemet?? De fleste fjernkontroller er vel på 38 Khz? Siter
ZoRaC Skrevet 11. mai 2017 Forfatter Skrevet 11. mai 2017 (endret) Endelig litt fremgang! Viser seg at Canal Digital-fjernkontrollen jeg har testet med går på Bluetooth, ikke IR! I tillegg lot jeg settingen på Harmony stå til "All", siden jeg skal teste direkte nå, men etterhvert er det hub'en som skal sende signalet. Viser seg at "All" ikke betyr "Alle"! ? Endret til "Remote only" og da blinket LEDen! Endret 11. mai 2017 av ZoRaC Siter
ZoRaC Skrevet 11. mai 2017 Forfatter Skrevet 11. mai 2017 Da fungerer det! La inn "kodene" for alle tall fra 0-9 på fjernkontrollen: Så etter hvert som jeg finner ut hva de skal brukes til, så endrer jeg bare navn på dem og legger dem inn i Harmony med egen knapp på skjermen. Koden jeg bruker nå (skal endres en del og slås sammen med DHT22-koden jeg bruker, for jeg skal kjøre begge deler på samme NodeMCU): #include <ESP8266WiFi.h> #include <IRremoteESP8266.h> #include <WiFiClientSecure.h> WiFiClientSecure client; int RECV_PIN = D1; // Update these with values suitable for your network. const char* ssid = "..."; const char* password = "...."; const char* host = "homeseer.local"; const int httpsPort = 443; WiFiClient espClient; IRrecv irrecv(RECV_PIN); decode_results results; long lastMsg = 0; char msg[50]; int value = 0; void setup_wifi() { delay(100); // We start by connecting to a WiFi network Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } randomSeed(micros()); Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); Serial.print("PIN:"); Serial.println(RECV_PIN); } void setup() { Serial.begin(115200); Serial.setDebugOutput(true); setup_wifi(); irrecv.enableIRIn(); // Start the receiver } void loop() { long now = millis(); if (now - lastMsg > 2000) { Serial.print("-"); lastMsg = now; if (irrecv.decode(&results)) { irrecv.resume(); // Receive the next value Serial.println(results.value); sendDataToHS(525, String(results.value)); } } } bool sendDataToHS(int dvRef, String data) { if (!client.connect(host, httpsPort)) { Serial.println("Connection failed"); return false; } String url = "/JSON?request=controldevicebyvalue&ref=" + String(dvRef) + "&value=" + String(data); client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Authorization: Basic BASE64-STRENG-HER\r\n" + "User-Agent: ESP8266\r\n" + "Connection: close\r\n\r\n"); Serial.println("Request sent (device " + String(dvRef) + ", data " + String(data) + ")"); while (client.connected()) { String line = client.readStringUntil('\n'); if (line == "\r") { Serial.println("headers received"); return true; break; } } return false; } 3 Siter
ZoRaC Skrevet 11. mai 2017 Forfatter Skrevet 11. mai 2017 Da var jeg i mål! Her er koden jeg brukter, den har da både en IR-mottaker og en DHT22 temp/fukt tiloblet. // http://platformio.org/lib/show/721/TaskScheduler/examples #include <TaskScheduler.h> void checkIR(); void checkDHT(); void checkWifi(); Task tskCheckIR(1000, TASK_FOREVER, &checkIR); Task tskCheckDHT(30000, TASK_FOREVER, &checkDHT); Task tskCheckWifi(10000, TASK_FOREVER, &checkWifi); Scheduler runner; // Including the ESP8266 WiFi library #include <ESP8266WiFi.h> #include <IRremoteESP8266.h> #include <DHT.h> #include <WiFiClientSecure.h> // Use WiFiClientSecure class to create TLS connection // https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/examples/HTTPSRequest/HTTPSRequest.ino WiFiClientSecure client; // Uncomment one of the lines below for whatever DHT sensor type you're using! //#define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT21 // DHT 21 (AM2301) #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 // Replace with your network details const char* ssid = "...."; const char* password = "....."; IPAddress ip(192, 168, 0, 10); IPAddress subnet(255, 255, 255, 0); IPAddress gateway(192, 168, 0, 1); IPAddress dns(192, 168, 0, 1); const char* host = "homeseer.local"; const int httpsPort = 443; String lastTemperature; String lastHumidity; // DHT Sensor const int DHTPin = D6; // Initialize DHT sensor. DHT dht(DHTPin, DHTTYPE); // IR-sensor int IRPin = D1; IRrecv irrecv(IRPin); decode_results IRresults; void checkIR() { Serial.println("Sjekker IR"); if (irrecv.decode(&IRresults)) { irrecv.resume(); // Receive the next value Serial.println(IRresults.value); sendDataToHS(525, String(IRresults.value)); } Serial.println("END: Sjekker IR"); } void checkDHT() { Serial.println("Sjekker DHT"); String strHumidity = String((int)(dht.readHumidity() + 0.5)); String strTemperature = String(dht.readTemperature()); if (strTemperature != lastTemperature) { Serial.println("Temp er:" + strTemperature + " - Forrige var:" + lastTemperature); sendDataToHS(520, strTemperature); lastTemperature = strTemperature; } if (strHumidity != lastHumidity) { Serial.println("Fukt er:" + strHumidity + " - Forrige var:" + lastHumidity); sendDataToHS(521, strHumidity); lastHumidity = strHumidity; } Serial.println("END: Sjekker DHT"); } void checkWifi() { Serial.println("Sjekker wifi"); if (WiFi.status() != WL_CONNECTED) { Serial.println("Mistet wifi, reconnect..."); WiFi.begin(ssid, password); } while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("END: Sjekker wifi"); } // only runs once on boot void setup() { // Initializing serial port for debugging purposes Serial.begin(115200); delay(10); // Connecting to WiFi network Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.config(ip, gateway, subnet, dns); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println(WiFi.macAddress()); // Printing the ESP IP address Serial.println(WiFi.localIP()); configTime(3 * 3600, 3600, "pool.ntp.org", "time.nist.gov"); dht.begin(); irrecv.enableIRIn(); // Start the receiver runner.init(); runner.addTask(tskCheckDHT); runner.addTask(tskCheckIR); runner.addTask(tskCheckWifi); tskCheckDHT.enable(); tskCheckIR.enable(); tskCheckWifi.enable(); } // runs over and over again void loop() { runner.execute(); } bool sendDataToHS(int dvRef, String data) { if (!client.connect(host, httpsPort)) { Serial.println("Connection failed"); return false; } String url = "/JSON?request=controldevicebyvalue&ref=" + String(dvRef) + "&value=" + String(data); client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Authorization: Basic BASE64-STRENG-HER\r\n" + "User-Agent: ESP8266\r\n" + "Connection: close\r\n\r\n"); Serial.println("Request sent (device " + String(dvRef) + ", data " + String(data) + ")"); while (client.connected()) { String line = client.readStringUntil('\n'); if (line == "\r") { Serial.println("headers received"); return true; break; } } return false; } 3 Siter
ZoRaC Skrevet 11. mai 2017 Forfatter Skrevet 11. mai 2017 Glemte bilde av "sluttproduktet": Kanskje ikke like pen finish som @xibriz sitt prosjekt, men... 1 Siter
xibriz Skrevet 11. mai 2017 Skrevet 11. mai 2017 Takk for det Men med tanke på tidligere prosjekter så tror jeg vi har samme ånden 1 Siter
ZoRaC Skrevet 11. mai 2017 Forfatter Skrevet 11. mai 2017 (endret) 8 minutter siden, xibriz skrev: Takk for det Men med tanke på tidligere prosjekter så tror jeg vi har samme ånden Haha! Det der så mer ut som min løsning, ja! Dremel-blad (7 blad, 22-50 mm - regner med noe av det funker bra?) er på vei, sammen med projectbox! Edit: og en pakke "standoffs" Endret 11. mai 2017 av ZoRaC Siter
xibriz Skrevet 11. mai 2017 Skrevet 11. mai 2017 Har ikke prøvd de bladene du linker til, men de fungerer sikkert. Jeg bruker slike "engangs"-blader. Men de er litt skumle fordi de knekker fort hvis man ikke er forsiktig. 1 Siter
Moskus Skrevet 11. mai 2017 Skrevet 11. mai 2017 3 timer siden, ZoRaC skrev: Viser deg at Canal Digital-fjernkontrollen jeg har testet med går på Bluetooth, ikle IR! Unnskyld, men: ? Siter
ZoRaC Skrevet 11. mai 2017 Forfatter Skrevet 11. mai 2017 16 minutter siden, Moskus skrev: Unnskyld, men: Just my luck... har aldri brukt den, for jeg la jo boksen rett inn på Harmony med en gang. Og tilfeldigvis var det bare de to fjernkontrollene som lå tilgjengelig, alle andre var jo pakket vekk (pga Harmony). Så jeg kunne nok fått ferdig dette for ganske mange uker siden... Siter
ZoRaC Skrevet 13. mai 2017 Forfatter Skrevet 13. mai 2017 Jeg tenker utvide med styring av en 5V/0.3A vifte (via et relé). Strømtilførselen er en USB-kabel, så jeg tenker koble NodeMCU og vifta (via reléet) i parallell. Men, vil motoren i vifta skape spenningsfall ved start, som kan "forstyrre" NodeMCU? Bør jeg i såfall parallellkoble en kondensator for å redusere det problemet? Hvilken kondensator, i så fall? Siter
ZoRaC Skrevet 6. juli 2017 Forfatter Skrevet 6. juli 2017 Har begynt å gå fra prototype til mer "ferdig" produkt. Innser at jeg ikke kan feste NodeMCU i boksen, for da får jeg ikke satt inn USB-kabel for å programmere den... 1 Siter
xibriz Skrevet 7. juli 2017 Skrevet 7. juli 2017 15 timer siden, ZoRaC skrev: Innser at jeg ikke kan feste NodeMCU i boksen, for da får jeg ikke satt inn USB-kabel for å programmere den... Du kan se om du får til å programmere/oppdatere den OTA (Over The Air) Siter
ZoRaC Skrevet 8. juli 2017 Forfatter Skrevet 8. juli 2017 Den 7.7.2017 klokken 9.58, xibriz skrev: Du kan se om du får til å programmere/oppdatere den OTA (Over The Air) Ja, det kan være en mulighet, hvis det er sikkert nok. får lese litt om det. Enkleste er kanskje å bare la den ligge løst. Siter
Anbefalte innlegg
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.