Removed deprecated projects, Added DS5 control
This commit is contained in:
parent
e239197a91
commit
145984c2f8
15 changed files with 368 additions and 567 deletions
|
@ -1,36 +0,0 @@
|
||||||
#include "ABROModel.c"
|
|
||||||
|
|
||||||
// Declarations
|
|
||||||
|
|
||||||
|
|
||||||
void setup() {
|
|
||||||
// Initializations
|
|
||||||
pinMode(11, INPUT);
|
|
||||||
pinMode(8, INPUT);
|
|
||||||
pinMode(5, INPUT);
|
|
||||||
pinMode(13, OUTPUT);
|
|
||||||
|
|
||||||
|
|
||||||
// Init model file
|
|
||||||
reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop() {
|
|
||||||
|
|
||||||
// Inputs
|
|
||||||
A = digitalRead(11) ? HIGH : LOW;
|
|
||||||
B = digitalRead(8) ? HIGH : LOW;
|
|
||||||
R = digitalRead(5) ? HIGH : LOW;
|
|
||||||
|
|
||||||
|
|
||||||
// Reaction of model
|
|
||||||
tick();
|
|
||||||
|
|
||||||
// Outputs
|
|
||||||
if (O) {
|
|
||||||
digitalWrite(13, HIGH);
|
|
||||||
} else {
|
|
||||||
digitalWrite(13, LOW);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
129
ABRO/ABROModel.c
129
ABRO/ABROModel.c
|
@ -1,129 +0,0 @@
|
||||||
/*****************************************************************************/
|
|
||||||
/* G E N E R A T E D C C O D E */
|
|
||||||
/*****************************************************************************/
|
|
||||||
/* KIELER - Kiel Integrated Environment for Layout Eclipse RichClient */
|
|
||||||
/* */
|
|
||||||
/* http://www.informatik.uni-kiel.de/rtsys/kieler/ */
|
|
||||||
/* Copyright 2014 by */
|
|
||||||
/* + Kiel University */
|
|
||||||
/* + Department of Computer Science */
|
|
||||||
/* + Real-Time and Embedded Systems Group */
|
|
||||||
/* */
|
|
||||||
/* This code is provided under the terms of the Eclipse Public License (EPL).*/
|
|
||||||
/*****************************************************************************/
|
|
||||||
char A;
|
|
||||||
char B;
|
|
||||||
char R;
|
|
||||||
char O;
|
|
||||||
char _trig;
|
|
||||||
char _trig2;
|
|
||||||
char _ABRO_local__termRegion;
|
|
||||||
char _ABRO_local__termRegion2;
|
|
||||||
char _GO;
|
|
||||||
char g0;
|
|
||||||
char g1;
|
|
||||||
char PRE_g1;
|
|
||||||
char g2;
|
|
||||||
char g4;
|
|
||||||
char g5;
|
|
||||||
char g6;
|
|
||||||
char g7;
|
|
||||||
char PRE_g7;
|
|
||||||
char g8;
|
|
||||||
char g9;
|
|
||||||
char g11;
|
|
||||||
char g12;
|
|
||||||
char g13;
|
|
||||||
char g14;
|
|
||||||
char PRE_g14;
|
|
||||||
char g15;
|
|
||||||
char g17;
|
|
||||||
char g18;
|
|
||||||
char g19;
|
|
||||||
char g20;
|
|
||||||
char PRE_g20;
|
|
||||||
char g21;
|
|
||||||
char g22;
|
|
||||||
char g23;
|
|
||||||
char g24;
|
|
||||||
char PRE_g24;
|
|
||||||
char g25;
|
|
||||||
char _condg4;
|
|
||||||
char _condg13;
|
|
||||||
char _condg19;
|
|
||||||
char g6_e1;
|
|
||||||
char g12_e2;
|
|
||||||
char g18_e3;
|
|
||||||
void reset() {
|
|
||||||
_GO = 1;
|
|
||||||
PRE_g1 = 0;
|
|
||||||
PRE_g7 = 0;
|
|
||||||
PRE_g14 = 0;
|
|
||||||
PRE_g20 = 0;
|
|
||||||
PRE_g24 = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
void tick() {
|
|
||||||
{
|
|
||||||
g0 = _GO;
|
|
||||||
g25 = (PRE_g24);
|
|
||||||
g8 = (PRE_g7);
|
|
||||||
g9 = (g8 && R);
|
|
||||||
if (g9) {
|
|
||||||
_trig = 1;
|
|
||||||
}
|
|
||||||
g2 = (PRE_g1);
|
|
||||||
if (g2) {
|
|
||||||
_trig = 0;
|
|
||||||
_trig2 = 0;
|
|
||||||
_ABRO_local__termRegion = 0;
|
|
||||||
_ABRO_local__termRegion2 = 0;
|
|
||||||
}
|
|
||||||
g21 = (PRE_g20);
|
|
||||||
g17 = (g2 || g21);
|
|
||||||
g19 = (g17 && (!(B)));
|
|
||||||
_condg19 = _trig;
|
|
||||||
g18 = ((g17 && B) || (g19 && _condg19));
|
|
||||||
if (g18) {
|
|
||||||
_ABRO_local__termRegion2 = 1;
|
|
||||||
}
|
|
||||||
g15 = (PRE_g14);
|
|
||||||
g11 = (g2 || g15);
|
|
||||||
g13 = (g11 && (!(A)));
|
|
||||||
_condg13 = _trig;
|
|
||||||
g12 = ((g13 && _condg13) || (g11 && A));
|
|
||||||
if (g12) {
|
|
||||||
_ABRO_local__termRegion = 1;
|
|
||||||
}
|
|
||||||
g4 = (g2 || (g8 && (!(R))));
|
|
||||||
_condg4 = (_ABRO_local__termRegion && _ABRO_local__termRegion2);
|
|
||||||
g5 = (g4 && _condg4);
|
|
||||||
if (g5) {
|
|
||||||
_trig2 = 1;
|
|
||||||
}
|
|
||||||
g6 = (g9 || g5);
|
|
||||||
g7 = (g4 && (!(_condg4)));
|
|
||||||
g14 = (g13 && (!(_condg13)));
|
|
||||||
g20 = (g19 && (!(_condg19)));
|
|
||||||
g12_e2 = (!(g14));
|
|
||||||
g6_e1 = (!(g7));
|
|
||||||
g18_e3 = (!(g20));
|
|
||||||
g22 = ((g6_e1 || g6) && (g12_e2 || g12) && (g18_e3 || g18) && (g6 || g12 || g18));
|
|
||||||
g1 = (_GO || (g25 && R) || (g22 && _trig));
|
|
||||||
if (g1) {
|
|
||||||
O = 0;
|
|
||||||
}
|
|
||||||
g23 = (g22 && (!(_trig)));
|
|
||||||
if (g23) {
|
|
||||||
O = 1;
|
|
||||||
}
|
|
||||||
g24 = (g23 || (g25 && (!(R))));
|
|
||||||
}
|
|
||||||
PRE_g1 = g1;
|
|
||||||
PRE_g7 = g7;
|
|
||||||
PRE_g14 = g14;
|
|
||||||
PRE_g20 = g20;
|
|
||||||
PRE_g24 = g24;
|
|
||||||
_GO = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
|
@ -1,23 +0,0 @@
|
||||||
void setup() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop() {
|
|
||||||
convert1(129);
|
|
||||||
convert2(129);
|
|
||||||
convert3(129);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int convert1(int color_in) {
|
|
||||||
return 4096 / ( 256 / color_in);
|
|
||||||
}
|
|
||||||
|
|
||||||
int convert2(int color_in) {
|
|
||||||
return color_in << 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
int convert3(int color_in) {
|
|
||||||
return (int) (4096 / ( 256 / (float) color_in));
|
|
||||||
}
|
|
||||||
|
|
1
ESP8266-MQTT-Teufel-DS5/.gitignore
vendored
Normal file
1
ESP8266-MQTT-Teufel-DS5/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
ESP8266-MQTT-Teufel-DS5.h
|
13
ESP8266-MQTT-Teufel-DS5/ESP8266-MQTT-Teufel-DS5..h.template
Normal file
13
ESP8266-MQTT-Teufel-DS5/ESP8266-MQTT-Teufel-DS5..h.template
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
// WiFi configuration
|
||||||
|
const char* ssid = "http://kiel.freifunk.net/";
|
||||||
|
const char* password = "";
|
||||||
|
|
||||||
|
// MQTT Broker
|
||||||
|
const char* mqtt_server = "broker.mqtt-dashboard.com";
|
||||||
|
|
||||||
|
// Device identification
|
||||||
|
const char* mqtt_device_name = "esp8266benq"
|
||||||
|
|
||||||
|
// MQTT topics
|
||||||
|
const char* mqtt_topic_power = "benq/power";
|
||||||
|
const char* mqtt_topic_lamptime = "benq/lamptime";
|
354
ESP8266-MQTT-Teufel-DS5/ESP8266-MQTT-Teufel-DS5.ino
Normal file
354
ESP8266-MQTT-Teufel-DS5/ESP8266-MQTT-Teufel-DS5.ino
Normal file
|
@ -0,0 +1,354 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Nis Wechselberg
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
**********************************************************************/
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* ESP8266-MQTT-Teufel-DS5-Control
|
||||||
|
*
|
||||||
|
* Links the ESP8266 based control board to an mqtt broker.
|
||||||
|
* The program uses multiple topics for incoming and outgoing messages.
|
||||||
|
* Incoming topics:
|
||||||
|
* - <mqtt_device>/command
|
||||||
|
* Outgoing topics:
|
||||||
|
* - <mqtt_device>/powerState
|
||||||
|
**********************************************************************/
|
||||||
|
#include <ESP8266WiFi.h>
|
||||||
|
#include <ESP8266mDNS.h>
|
||||||
|
#include <WiFiUdp.h>
|
||||||
|
#include <ArduinoOTA.h>
|
||||||
|
#include <PubSubClient.h>
|
||||||
|
#include "ESP8266-MQTT-Teufel-DS5.h"
|
||||||
|
|
||||||
|
#define DEBUGTOSERIAL 1
|
||||||
|
|
||||||
|
// Timing for publishing powerState
|
||||||
|
unsigned long lastMsg = 0;
|
||||||
|
unsigned long publishInterval = 5000;
|
||||||
|
|
||||||
|
// Message buffer
|
||||||
|
char msg[50];
|
||||||
|
|
||||||
|
// Last known state
|
||||||
|
int powerState = 0;
|
||||||
|
|
||||||
|
// Volume control. Valid range is [-55,10]
|
||||||
|
int curVol = 0;
|
||||||
|
int targetVol = 0;
|
||||||
|
unsigned long lastVolChange = 0;
|
||||||
|
unsigned long volumeInterval = 500;
|
||||||
|
// Process tracker for calibration. 0 = nothing, 1 = decreasing, 2 = increasing
|
||||||
|
uint8_t recalibrateState = 0;
|
||||||
|
int calibrateLowerLimit = -55;
|
||||||
|
int calibrateUpperLimit = -22;
|
||||||
|
|
||||||
|
// Pin config
|
||||||
|
const int irSendPin = 13;
|
||||||
|
const int powerProbePin = 12;
|
||||||
|
|
||||||
|
// Global mqtt client object
|
||||||
|
WiFiClient espClient;
|
||||||
|
PubSubClient client(espClient);
|
||||||
|
|
||||||
|
// Command/code mapping
|
||||||
|
char* commands[] = {
|
||||||
|
"power", "mute", "51", "opt1",
|
||||||
|
"opt2", "coax1", "coax2", "tv",
|
||||||
|
"cd", "aux", "display", "return",
|
||||||
|
"mode", "speaker", "test", //"volUp",
|
||||||
|
"left", "ok", "right", //"volDown",
|
||||||
|
"fLeft", "center", "fRight", "sLeft",
|
||||||
|
"sub", "sRight"};
|
||||||
|
uint32_t codes[] = {
|
||||||
|
0x807F50AF, 0x807FD02F, 0x807F708F, 0x807F609F,
|
||||||
|
0x807FF00F, 0x807F48B7, 0x807FE01F, 0x807FC837,
|
||||||
|
0x807F6897, 0x807F40BF, 0x807FE817, 0x807FC03F,
|
||||||
|
0x807FE21D, 0x807F629D, 0x807FA25D, //0x807F7A85,
|
||||||
|
0x807FDA25, 0x807F5AA5, 0x807F1AE5, //0x807F6A95,
|
||||||
|
0x807FCA35, 0x807F4AB5, 0x807F8A75, 0x807FF20D,
|
||||||
|
0x807F728D, 0x807FB24D};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initial setup for arduino
|
||||||
|
*/
|
||||||
|
void setup() {
|
||||||
|
|
||||||
|
// Configure pins
|
||||||
|
pinMode(irSendPin, OUTPUT);
|
||||||
|
digitalWrite(irSendPin, HIGH);
|
||||||
|
|
||||||
|
// Configure serial port
|
||||||
|
Serial.begin(115200);
|
||||||
|
delay(10);
|
||||||
|
|
||||||
|
// Prepare WiFi connection
|
||||||
|
setup_wifi();
|
||||||
|
|
||||||
|
// Connect to mqtt broker
|
||||||
|
client.setServer(mqtt_server, 1883);
|
||||||
|
client.setCallback(incoming_mqtt);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Prepares the wireless connection
|
||||||
|
*/
|
||||||
|
void setup_wifi() {
|
||||||
|
// Connect to the WiFi as a client
|
||||||
|
WiFi.mode(WIFI_STA);
|
||||||
|
|
||||||
|
// Do the connection
|
||||||
|
if (DEBUGTOSERIAL) {
|
||||||
|
Serial.println();
|
||||||
|
Serial.print("Connecting to ");
|
||||||
|
Serial.println(ssid);
|
||||||
|
}
|
||||||
|
WiFi.begin(ssid, password);
|
||||||
|
while (WiFi.status() != WL_CONNECTED) {
|
||||||
|
delay(500);
|
||||||
|
if (DEBUGTOSERIAL) {
|
||||||
|
Serial.print(".");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (DEBUGTOSERIAL) {
|
||||||
|
Serial.println("");
|
||||||
|
Serial.println("WiFi connected");
|
||||||
|
|
||||||
|
// Print IP address to serial
|
||||||
|
Serial.print("My IP address: ");
|
||||||
|
Serial.println(WiFi.localIP());
|
||||||
|
}
|
||||||
|
ArduinoOTA.setHostname("esp8266-TeufelDS5");
|
||||||
|
ArduinoOTA.begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Callback method for incoming mqtt messages
|
||||||
|
*/
|
||||||
|
void incoming_mqtt(char* topic, byte* payload, unsigned int length) {
|
||||||
|
if (DEBUGTOSERIAL) {
|
||||||
|
Serial.print("Message arrived [");
|
||||||
|
Serial.print(topic);
|
||||||
|
Serial.print("] ");
|
||||||
|
for (uint8_t i = 0; i < length; i++) {
|
||||||
|
Serial.print((char)payload[i]);
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
char* msgCopy = (char*) malloc(length + 1);
|
||||||
|
memcpy(msgCopy, payload, length);
|
||||||
|
msgCopy[length] = 0;
|
||||||
|
|
||||||
|
// Variable to store the IR code
|
||||||
|
uint32_t code = 0;
|
||||||
|
|
||||||
|
if (strcmp(topic, mqtt_topic_command) == 0) {
|
||||||
|
// Regular command channel triggered
|
||||||
|
for (uint8_t i = 0; i < 24; ++i) {
|
||||||
|
// Compare payload against known commands
|
||||||
|
if (strcmp(msgCopy, commands[i]) == 0) {
|
||||||
|
// Store code and be done
|
||||||
|
code = codes[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Check other special commands
|
||||||
|
if (strcmp(msgCopy, "volReset") == 0) {
|
||||||
|
// Recalibrate volume
|
||||||
|
recalibrateState = 1;
|
||||||
|
curVol = 10;
|
||||||
|
targetVol = calibrateLowerLimit;
|
||||||
|
}
|
||||||
|
if (strcmp(msgCopy, "volUp") == 0) {
|
||||||
|
if (recalibrateState == 0 && targetVol < 10) {
|
||||||
|
if (DEBUGTOSERIAL) {
|
||||||
|
Serial.print("Setting target volume to ");
|
||||||
|
Serial.println(targetVol + 1);
|
||||||
|
}
|
||||||
|
targetVol += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (strcmp(msgCopy, "volDown") == 0) {
|
||||||
|
if (recalibrateState == 0 && targetVol > -55) {
|
||||||
|
if (DEBUGTOSERIAL) {
|
||||||
|
Serial.print("Setting target volume to ");
|
||||||
|
Serial.println(targetVol - 1);
|
||||||
|
}
|
||||||
|
targetVol -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (strcmp(topic, mqtt_topic_volume) == 0) {
|
||||||
|
int newTargetVol = atoi(msgCopy);
|
||||||
|
if (recalibrateState == 0) {
|
||||||
|
if (DEBUGTOSERIAL) {
|
||||||
|
Serial.print("Setting target volume to ");
|
||||||
|
Serial.println(newTargetVol);
|
||||||
|
}
|
||||||
|
targetVol = newTargetVol;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(msgCopy);
|
||||||
|
|
||||||
|
// Check if we found a code to send
|
||||||
|
if (code != 0) {
|
||||||
|
replicateNEC(irSendPin, code, 32);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Blocking reconnect to the mqtt broker
|
||||||
|
*/
|
||||||
|
void reconnect() {
|
||||||
|
// Loop until we're reconnected
|
||||||
|
while (!client.connected()) {
|
||||||
|
if (DEBUGTOSERIAL) {
|
||||||
|
Serial.print("Attempting MQTT connection...");
|
||||||
|
}
|
||||||
|
// Attempt to connect
|
||||||
|
if (client.connect(mqtt_device_name)) {
|
||||||
|
if (DEBUGTOSERIAL) {
|
||||||
|
Serial.println("connected");
|
||||||
|
}
|
||||||
|
// subscribe to incoming topics
|
||||||
|
client.subscribe(mqtt_topic_command);
|
||||||
|
client.subscribe(mqtt_topic_volume);
|
||||||
|
if (DEBUGTOSERIAL) {
|
||||||
|
Serial.println("Subscriptions done");
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
if (DEBUGTOSERIAL) {
|
||||||
|
Serial.print("failed, rc=");
|
||||||
|
Serial.print(client.state());
|
||||||
|
Serial.println(" try again in 5 seconds");
|
||||||
|
}
|
||||||
|
// Wait 5 seconds before retrying
|
||||||
|
delay(5000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateState() {
|
||||||
|
// Read value from digital pin (Levels are inverted)
|
||||||
|
powerState = digitalRead(powerProbePin);
|
||||||
|
|
||||||
|
if (DEBUGTOSERIAL) {
|
||||||
|
Serial.print("New power state determined: ");
|
||||||
|
Serial.println(powerState);
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(msg, 49, "%d", powerState);
|
||||||
|
client.publish(mqtt_topic_powerState, msg);
|
||||||
|
|
||||||
|
// Update volume state
|
||||||
|
snprintf(msg, 49, "%d", curVol);
|
||||||
|
client.publish(mqtt_topic_volumeState, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateVolume() {
|
||||||
|
// Increase volume a notch if requested
|
||||||
|
if (targetVol > curVol) {
|
||||||
|
replicateNEC(irSendPin, 0x807F7A85, 32);
|
||||||
|
curVol += 1;
|
||||||
|
|
||||||
|
snprintf(msg, 49, "%d", curVol);
|
||||||
|
client.publish(mqtt_topic_volumeState, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decrease volume a notch if requested
|
||||||
|
if (targetVol < curVol) {
|
||||||
|
replicateNEC(irSendPin, 0x807F6A95, 32);
|
||||||
|
curVol -= 1;
|
||||||
|
|
||||||
|
snprintf(msg, 49, "%d", curVol);
|
||||||
|
client.publish(mqtt_topic_volumeState, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check recalibration state
|
||||||
|
if (recalibrateState == 2 && curVol == calibrateUpperLimit) {
|
||||||
|
recalibrateState = 0;
|
||||||
|
}
|
||||||
|
if (recalibrateState == 1 && curVol == calibrateLowerLimit) {
|
||||||
|
recalibrateState = 2;
|
||||||
|
targetVol = calibrateUpperLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void replicateNEC(int pin, uint32_t data, int dataLength) {
|
||||||
|
if (DEBUGTOSERIAL) {
|
||||||
|
Serial.print("Sending code ");
|
||||||
|
Serial.println(data, HEX);
|
||||||
|
}
|
||||||
|
// Prepare mask
|
||||||
|
uint32_t mask = 1L << (dataLength -1);
|
||||||
|
// Write initial 9ms+4.5ms pulse
|
||||||
|
digitalWrite(pin, LOW);
|
||||||
|
delayMicroseconds(9000);
|
||||||
|
digitalWrite(pin, HIGH);
|
||||||
|
delayMicroseconds(4500);
|
||||||
|
|
||||||
|
// Write pulses from data
|
||||||
|
while (mask > 0) {
|
||||||
|
digitalWrite(pin, LOW);
|
||||||
|
delayMicroseconds(562);
|
||||||
|
digitalWrite(pin, HIGH);
|
||||||
|
delayMicroseconds(562);
|
||||||
|
if (data & mask) {
|
||||||
|
delayMicroseconds(1124);
|
||||||
|
}
|
||||||
|
mask = mask >> 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write trailing pulse
|
||||||
|
digitalWrite(pin, LOW);
|
||||||
|
delayMicroseconds(562);
|
||||||
|
digitalWrite(pin, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// Check OTA update
|
||||||
|
ArduinoOTA.handle();
|
||||||
|
|
||||||
|
// Ensure MQTT connection
|
||||||
|
if (!client.connected()) {
|
||||||
|
reconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check the inbox
|
||||||
|
client.loop();
|
||||||
|
|
||||||
|
// Maybe update the volume
|
||||||
|
unsigned long now = millis();
|
||||||
|
if (now - lastVolChange > volumeInterval) {
|
||||||
|
lastVolChange = now;
|
||||||
|
updateVolume();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Maybe push the current status
|
||||||
|
if (now - lastMsg > publishInterval) {
|
||||||
|
lastMsg = now;
|
||||||
|
updateState();
|
||||||
|
}
|
||||||
|
}
|
1
ESP8266-mDNS-Subwoofer/.gitignore
vendored
1
ESP8266-mDNS-Subwoofer/.gitignore
vendored
|
@ -1 +0,0 @@
|
||||||
ESP8266-mDNS-Subwoofer.h
|
|
|
@ -1,3 +0,0 @@
|
||||||
// WiFi configuration
|
|
||||||
const char* ssid = "http://kiel.freifunk.net/";
|
|
||||||
const char* password = "";
|
|
|
@ -1,145 +0,0 @@
|
||||||
/********************************************************************************
|
|
||||||
* The MIT License (MIT)
|
|
||||||
*
|
|
||||||
* Copyright (c) 2015 Nis Wechselberg
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
********************************************************************************/
|
|
||||||
#include "ESP8266-mDNS-Subwoofer.h"
|
|
||||||
#include <ESP8266WiFi.h>
|
|
||||||
#include <ESP8266mDNS.h>
|
|
||||||
|
|
||||||
#define SERIAL
|
|
||||||
|
|
||||||
const char* hostString = "ESP_HT_SUB";
|
|
||||||
const unsigned int port = 4721;
|
|
||||||
|
|
||||||
// Server object
|
|
||||||
WiFiServer server(port);
|
|
||||||
|
|
||||||
void setup() {
|
|
||||||
// Configure output pin
|
|
||||||
pinMode(12, OUTPUT);
|
|
||||||
digitalWrite(12, LOW);
|
|
||||||
|
|
||||||
// Setup serial console for debugging
|
|
||||||
#ifdef SERIAL
|
|
||||||
Serial.begin(115200);
|
|
||||||
delay(100);
|
|
||||||
Serial.println("\r\nsetup()");
|
|
||||||
|
|
||||||
Serial.print("Hostname: ");
|
|
||||||
Serial.println(hostString);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Set the Hostname for the WiFi connection
|
|
||||||
WiFi.hostname(hostString);
|
|
||||||
|
|
||||||
// Connect to WiFi, wait for established connection
|
|
||||||
WiFi.mode(WIFI_STA);
|
|
||||||
WiFi.begin(ssid, password);
|
|
||||||
while (WiFi.status() != WL_CONNECTED) {
|
|
||||||
delay(250);
|
|
||||||
#ifdef SERIAL
|
|
||||||
Serial.print(".");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// Print established connection data to console
|
|
||||||
#ifdef SERIAL
|
|
||||||
Serial.println("");
|
|
||||||
Serial.print("Connected to ");
|
|
||||||
Serial.println(ssid);
|
|
||||||
Serial.print("IP address: ");
|
|
||||||
Serial.println(WiFi.localIP());
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Initialize server
|
|
||||||
server.begin();
|
|
||||||
|
|
||||||
// Initialize Multicast DNS responder
|
|
||||||
if (!MDNS.begin(hostString)) {
|
|
||||||
#ifdef SERIAL
|
|
||||||
Serial.println("Error setting up MDNS responder!");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#ifdef SERIAL
|
|
||||||
Serial.println("mDNS responder started");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Announce hometheater service
|
|
||||||
MDNS.addService("hometheater", "tcp", port);
|
|
||||||
MDNS.addServiceTxt("hometheater", "tcp", "Component", "Subwoofer");
|
|
||||||
|
|
||||||
#ifdef SERIAL
|
|
||||||
Serial.println("loop() next");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop() {
|
|
||||||
// Update the mDNS responder
|
|
||||||
MDNS.update();
|
|
||||||
|
|
||||||
// Check if a client connected
|
|
||||||
WiFiClient client = server.available();
|
|
||||||
if (client) {
|
|
||||||
#ifdef SERIAL
|
|
||||||
Serial.println("Client connected");
|
|
||||||
#endif
|
|
||||||
// Wait until the client sends some data or timeout hits
|
|
||||||
unsigned char timeout = 5;
|
|
||||||
while(!client.available() && timeout > 0){
|
|
||||||
delay(1000);
|
|
||||||
timeout = timeout - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (timeout <= 0) {
|
|
||||||
// Timeout was triggered, cleanup and leave
|
|
||||||
} else {
|
|
||||||
// Some data was received
|
|
||||||
String req = client.readStringUntil('\r');
|
|
||||||
client.flush();
|
|
||||||
|
|
||||||
#ifdef SERIAL
|
|
||||||
Serial.println(req);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
String response;
|
|
||||||
// Check for valid command
|
|
||||||
if (req.equals("Dominik")) {
|
|
||||||
// Command valid, trigger switch
|
|
||||||
digitalWrite(12, HIGH);
|
|
||||||
delay(100);
|
|
||||||
digitalWrite(12, LOW);
|
|
||||||
response = "OK\n";
|
|
||||||
} else {
|
|
||||||
// Invalid data, discard
|
|
||||||
response = "ERR\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
client.print(response);
|
|
||||||
delay(10);
|
|
||||||
|
|
||||||
}
|
|
||||||
client.flush();
|
|
||||||
client.stop();
|
|
||||||
}
|
|
||||||
// Throttle looping a bit
|
|
||||||
delay(500);
|
|
||||||
}
|
|
1
WiFi-Serial-Bridge/.gitignore
vendored
1
WiFi-Serial-Bridge/.gitignore
vendored
|
@ -1 +0,0 @@
|
||||||
WiFi-Serial-Bridge.h
|
|
|
@ -1,3 +0,0 @@
|
||||||
// WiFi configuration
|
|
||||||
const char* ssid = "http://kiel.freifunk.net/";
|
|
||||||
const char* password = "";
|
|
|
@ -1,114 +0,0 @@
|
||||||
/********************************************************************************
|
|
||||||
* The MIT License (MIT)
|
|
||||||
*
|
|
||||||
* Copyright (c) 2015 Nis Wechselberg
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
********************************************************************************/
|
|
||||||
|
|
||||||
#include <ESP8266WiFi.h>
|
|
||||||
#include "WiFi-Serial-Bridge.h"
|
|
||||||
|
|
||||||
#define DEBUGTOSERIAL 0
|
|
||||||
|
|
||||||
|
|
||||||
// HTTP configuration
|
|
||||||
const unsigned char port = 80;
|
|
||||||
WiFiServer server(port);
|
|
||||||
|
|
||||||
void setup() {
|
|
||||||
// Set wifi mode to client
|
|
||||||
WiFi.mode(WIFI_STA);
|
|
||||||
delay(5);
|
|
||||||
|
|
||||||
Serial.begin(115200);
|
|
||||||
|
|
||||||
// Connect to WiFi network
|
|
||||||
if (DEBUGTOSERIAL) {
|
|
||||||
Serial.print("Connecting to ");
|
|
||||||
Serial.println(ssid);
|
|
||||||
}
|
|
||||||
WiFi.begin(ssid, password);
|
|
||||||
while (WiFi.status() != WL_CONNECTED) {
|
|
||||||
delay(500);
|
|
||||||
if (DEBUGTOSERIAL) {
|
|
||||||
Serial.print(".");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (DEBUGTOSERIAL) {
|
|
||||||
Serial.println("");
|
|
||||||
Serial.println("WiFi connected");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start the server
|
|
||||||
server.begin();
|
|
||||||
if (DEBUGTOSERIAL) {
|
|
||||||
Serial.print("Server started at IP address ");
|
|
||||||
// Print the IP address
|
|
||||||
Serial.println(WiFi.localIP());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop() {
|
|
||||||
// Check if a client has connected
|
|
||||||
WiFiClient client = server.available();
|
|
||||||
if (client) {
|
|
||||||
int timeout = 5;
|
|
||||||
// Wait until the client sends some data or timeout hits
|
|
||||||
if (DEBUGTOSERIAL) {
|
|
||||||
Serial.println("Client connected");
|
|
||||||
}
|
|
||||||
while(!client.available() && timeout > 0){
|
|
||||||
delay(1000);
|
|
||||||
timeout = timeout - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (timeout <= 0) {
|
|
||||||
client.stop();
|
|
||||||
client.flush();
|
|
||||||
} else {
|
|
||||||
// Read the first line of the request
|
|
||||||
String req = client.readStringUntil('\r');
|
|
||||||
if (DEBUGTOSERIAL) {
|
|
||||||
Serial.println(req);
|
|
||||||
}
|
|
||||||
client.flush();
|
|
||||||
|
|
||||||
String data = "\r";
|
|
||||||
data += req;
|
|
||||||
data += "\r";
|
|
||||||
Serial.print(data);
|
|
||||||
delay(500);
|
|
||||||
|
|
||||||
String response = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";
|
|
||||||
while (Serial.available() > 0) {
|
|
||||||
char inc[2];
|
|
||||||
inc[0] = Serial.read();
|
|
||||||
inc[1] = '\0';
|
|
||||||
response += inc;
|
|
||||||
}
|
|
||||||
|
|
||||||
client.print(response);
|
|
||||||
delay(10);
|
|
||||||
client.flush();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
1
WiFi-Subwoofer/.gitignore
vendored
1
WiFi-Subwoofer/.gitignore
vendored
|
@ -1 +0,0 @@
|
||||||
WiFi-Subwoofer.h
|
|
|
@ -1,3 +0,0 @@
|
||||||
// WiFi configuration
|
|
||||||
const char* ssid = "http://kiel.freifunk.net/";
|
|
||||||
const char* password = "";
|
|
|
@ -1,108 +0,0 @@
|
||||||
/********************************************************************************
|
|
||||||
* The MIT License (MIT)
|
|
||||||
*
|
|
||||||
* Copyright (c) 2015 Nis Wechselberg
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
********************************************************************************/
|
|
||||||
|
|
||||||
#include <ESP8266WiFi.h>
|
|
||||||
#include "WiFi-Subwoofer.h"
|
|
||||||
|
|
||||||
#define DEBUGTOSERIAL 1
|
|
||||||
|
|
||||||
// HTTP configuration
|
|
||||||
const unsigned char port = 80;
|
|
||||||
WiFiServer server(port);
|
|
||||||
|
|
||||||
void setup() {
|
|
||||||
// Set wifi mode to client
|
|
||||||
WiFi.mode(WIFI_STA);
|
|
||||||
delay(5);
|
|
||||||
|
|
||||||
Serial.begin(115200);
|
|
||||||
|
|
||||||
// Connect to WiFi network
|
|
||||||
if (DEBUGTOSERIAL) {
|
|
||||||
Serial.print("Connecting to ");
|
|
||||||
Serial.println(ssid);
|
|
||||||
}
|
|
||||||
WiFi.begin(ssid, password);
|
|
||||||
while (WiFi.status() != WL_CONNECTED) {
|
|
||||||
delay(500);
|
|
||||||
if (DEBUGTOSERIAL) {
|
|
||||||
Serial.print(".");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (DEBUGTOSERIAL) {
|
|
||||||
Serial.println("");
|
|
||||||
Serial.println("WiFi connected");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start the server
|
|
||||||
server.begin();
|
|
||||||
if (DEBUGTOSERIAL) {
|
|
||||||
Serial.print("Server started at IP address ");
|
|
||||||
// Print the IP address
|
|
||||||
Serial.println(WiFi.localIP());
|
|
||||||
}
|
|
||||||
|
|
||||||
pinMode(12, OUTPUT);
|
|
||||||
digitalWrite(12, LOW);
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop() {
|
|
||||||
// Check if a client has connected
|
|
||||||
WiFiClient client = server.available();
|
|
||||||
if (client) {
|
|
||||||
int timeout = 5;
|
|
||||||
// Wait until the client sends some data or timeout hits
|
|
||||||
if (DEBUGTOSERIAL) {
|
|
||||||
Serial.println("Client connected");
|
|
||||||
}
|
|
||||||
while(!client.available() && timeout > 0){
|
|
||||||
delay(1000);
|
|
||||||
timeout = timeout - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (timeout <= 0) {
|
|
||||||
client.stop();
|
|
||||||
client.flush();
|
|
||||||
} else {
|
|
||||||
// Read the first line of the request
|
|
||||||
String req = client.readStringUntil('\r');
|
|
||||||
if (DEBUGTOSERIAL) {
|
|
||||||
Serial.println(req);
|
|
||||||
}
|
|
||||||
client.flush();
|
|
||||||
|
|
||||||
digitalWrite(12, HIGH);
|
|
||||||
delay(100);
|
|
||||||
digitalWrite(12, LOW);
|
|
||||||
|
|
||||||
String response = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";
|
|
||||||
|
|
||||||
client.print(response);
|
|
||||||
delay(10);
|
|
||||||
client.flush();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue