add led set topic and reduce code size by removing serial prints

This commit is contained in:
interfisch 2020-12-26 13:57:34 +01:00
parent ad13789b12
commit fe83cff969
1 changed files with 97 additions and 28 deletions

View File

@ -1,12 +1,13 @@
/* /*
* Ideas/TODO: * Ideas/TODO:
* POT_MIN, POT_MAX as variable with calibration procedure. Drive slowly to both ends until value does not get lower. * POT_MIN, POT_MAX as variable with calibration procedure. Drive slowly to both ends until value does not get lower.
* Motor error checking. Timeout overall (if regulation fails or stuck). Timeout movement (motor is tunring but no change in poti value detected). Move right direction.
* Hardware: motorentstörkondensatoren einbauen direkt an motor. 47nF + zu - und zwei 10nF + zu case und - zu case
* PI Optimieren. aktuell overshoot
* Implement knob menu structure
*/ */
//#define DEBUG
//#define INFOMSG //print info messages
#include <Arduino.h> #include <Arduino.h>
#include <Adafruit_NeoPixel.h> #include <Adafruit_NeoPixel.h>
@ -31,12 +32,16 @@ void setSelectionChannel(uint8_t i, boolean state);
void setMuteChannel(uint8_t i, boolean state); void setMuteChannel(uint8_t i, boolean state);
void publishCurrentSetVolume(); void publishCurrentSetVolume();
void publishAllStates(int pn, String pTopicname, boolean (*pgetBit) (uint8_t)); void publishAllStates(int pn, String pTopicname, boolean (*pgetBit) (uint8_t));
void changeRelaisByNumberTopic(uint8_t pn, String pTopicPrefix, String pTopic, String pspayload, void (*psetXChannel) (uint8_t, boolean)); void changeRelaisByNumberTopic(uint8_t pn, String pTopicPrefix, uint8_t pindex, String pspayload, void (*psetXChannel) (uint8_t, boolean));
void setRelaisByNumber(uint8_t pn, String pTopicPrefix, uint8_t pnumber, bool pstate, void (*psetXChannel) (uint8_t, boolean)); void setRelaisByNumber(uint8_t pn, String pTopicPrefix, uint8_t pnumber, bool pstate, void (*psetXChannel) (uint8_t, boolean));
float getSetVolume(); float getSetVolume();
uint8_t getIndex(uint8_t pn, String pTopic);
#define LEDPIN 9 //PB1 = D9 = Pin15 #define LEDPIN 9 //PB1 = D9 = Pin15
Adafruit_NeoPixel leds = Adafruit_NeoPixel(9, LEDPIN, NEO_GRB + NEO_KHZ800); #define NUMLED 9
Adafruit_NeoPixel leds = Adafruit_NeoPixel(NUMLED, LEDPIN, NEO_GRB + NEO_KHZ800);
uint32_t led_colors_standby[NUMLED];
uint8_t wheelpos=0; uint8_t wheelpos=0;
#include "Ethernet.h" #include "Ethernet.h"
@ -160,6 +165,8 @@ long last_ledupdate=0;
#define INTERVAL_LEDUPDATE 50 #define INTERVAL_LEDUPDATE 50
void setup() { void setup() {
led_colors_standby[NUMLED-1] = Wheel(100); //set default color for volume led
pinMode(PIN_BUTTON,INPUT_PULLUP); pinMode(PIN_BUTTON,INPUT_PULLUP);
button_knob = Button(); button_knob = Button();
@ -170,35 +177,48 @@ void setup() {
pinMode(SRCLOCK, OUTPUT); pinMode(SRCLOCK, OUTPUT);
pinMode(SRDATA, OUTPUT); pinMode(SRDATA, OUTPUT);
leds.begin();
leds.clear();
/*for(uint8_t i=0;i<leds.numPixels();i++){ //set color of all leds
}*/
leds.setPixelColor(0, leds.Color(20,20,0)); leds.setPixelColor(NUMLED-1, leds.Color(20,20,20)); leds.show();
#if defined(INFOMSG) || defined(DEBUG)
Serial.begin(9600); Serial.begin(9600);
while (!Serial) {}; while (!Serial) {};
Serial.println("Boot"); Serial.println("Boot");
#endif
leds.begin();
leds.clear();
for(uint8_t i=0;i<leds.numPixels();i++){ //set color of all leds
leds.setPixelColor(i, leds.Color(20,20,0));
}
leds.show();
if (useethernet) if (useethernet)
{ {
leds.setPixelColor(1, leds.Color(0,20,0)); leds.show();
#ifdef INFOMSG
Serial.println("DHCP.."); Serial.println("DHCP..");
#endif
if (Ethernet.begin(mac) == 0) { // setup ethernet communication using DHCP if (Ethernet.begin(mac) == 0) { // setup ethernet communication using DHCP
leds.setPixelColor(2, leds.Color(20,0,0)); leds.show();
useethernet=false; useethernet=false;
//Unable to configure Ethernet using DHCP //Unable to configure Ethernet using DHCP
#ifdef INFOMSG
Serial.println("DHCP Err"); Serial.println("DHCP Err");
#endif
delay(200); delay(200);
//for (;;); //for (;;);
}else{ }else{
leds.setPixelColor(2, leds.Color(0,20,0)); leds.show();
useethernet=true; useethernet=true;
#ifdef INFOMSG
Serial.print("IP: "); Serial.print("IP: ");
Serial.println(Ethernet.localIP()); Serial.println(Ethernet.localIP());
Serial.println(); Serial.println();
#endif
ip = String (Ethernet.localIP()[0]); ip = String (Ethernet.localIP()[0]);
ip = ip + "."; ip = ip + ".";
@ -207,17 +227,28 @@ void setup() {
ip = ip + String (Ethernet.localIP()[2]); ip = ip + String (Ethernet.localIP()[2]);
ip = ip + "."; ip = ip + ".";
ip = ip + String (Ethernet.localIP()[3]); ip = ip + String (Ethernet.localIP()[3]);
//Serial.println(ip); //Serial.println(ip);
// setup mqtt client // setup mqtt client
#ifdef INFOMSG
Serial.println("Conf MQTT"); Serial.println("Conf MQTT");
#endif
mqttClient.setClient(ethClient); mqttClient.setClient(ethClient);
leds.setPixelColor(3, leds.Color(0,20,0)); leds.show();
mqttClient.setServer(MQTTBROKER, MQTTPORT); mqttClient.setServer(MQTTBROKER, MQTTPORT);
leds.setPixelColor(4, leds.Color(0,20,0)); leds.show();
#ifdef INFOMSG
Serial.println("MQTT ok"); Serial.println("MQTT ok");
#endif
mqttClient.setCallback(callback); mqttClient.setCallback(callback);
leds.setPixelColor(5, leds.Color(0,20,0)); leds.show();
} }
}else{ }else{
leds.setPixelColor(1, leds.Color(20,0,0)); leds.show();
#ifdef INFOMSG
Serial.println("Eth disabled"); Serial.println("Eth disabled");
#endif
} }
@ -229,15 +260,21 @@ void setup() {
last_send = millis(); last_send = millis();
leds.setPixelColor(6, leds.Color(0,20,0)); leds.show();
} }
void reconnect() { void reconnect() {
// Loop until reconnected // Loop until reconnected
if (!mqttClient.connected()) { if (!mqttClient.connected()) {
#ifdef INFOMSG
Serial.print("MQTT .."); Serial.print("MQTT ..");
#endif
// Attempt to connect // Attempt to connect
if (mqttClient.connect(CLIENT_ID)) { if (mqttClient.connect(CLIENT_ID)) {
#ifdef INFOMSG
Serial.println("connected"); Serial.println("connected");
#endif
publishCurrentSetVolume(); publishCurrentSetVolume();
mqttClient.publish("audiomixer/ip", ip.c_str()); //Publish own ip mqttClient.publish("audiomixer/ip", ip.c_str()); //Publish own ip
mqttClient.subscribe("audiomixer/volume/set"); //subscribe to /set, republish without /set mqttClient.subscribe("audiomixer/volume/set"); //subscribe to /set, republish without /set
@ -252,9 +289,16 @@ void reconnect() {
mqttClient.subscribe((char*) sub_topic.c_str()); mqttClient.subscribe((char*) sub_topic.c_str());
} }
for (uint8_t i=0;i<NUMLED;i++) { //with range
String sub_topic="audiomixer/led_"+String(i)+"/set";
mqttClient.subscribe((char*) sub_topic.c_str());
}
} else { } else {
#ifdef INFOMSG
Serial.print("failed, rc="); Serial.print("failed, rc=");
Serial.print(mqttClient.state()); Serial.print(mqttClient.state());
#endif
} }
} }
} }
@ -265,7 +309,9 @@ void loop() {
if (useethernet){ if (useethernet){
if (!mqttClient.connected()) { if (!mqttClient.connected()) {
if (loopmillis-last_mqttreconnectattempt > MQTTRECONNECTDELAY) { if (loopmillis-last_mqttreconnectattempt > MQTTRECONNECTDELAY) {
#ifdef INFOMSG
Serial.println("Recon. mqtt"); Serial.println("Recon. mqtt");
#endif
reconnect(); reconnect();
last_mqttreconnectattempt=loopmillis; last_mqttreconnectattempt=loopmillis;
} }
@ -488,8 +534,9 @@ void loop() {
switch(menu_mode) { switch(menu_mode) {
case 0: //volume case 0: //volume
if (poti_reachedposition) { //idle if (poti_reachedposition) { //idle
for(uint8_t i=0;i<leds.numPixels()-1;i++){ //set color of all front leds for(uint8_t i=0;i<leds.numPixels();i++){ //set color of all front leds
leds.setPixelColor(i, Wheel(wheelpos+i*10)); //leds.setPixelColor(i, Wheel(wheelpos+i*10));
leds.setPixelColor(i, led_colors_standby[i]);
} }
}else{ //motor is currently moving }else{ //motor is currently moving
leds.clear(); leds.clear();
@ -539,7 +586,7 @@ void loop() {
//Volume LED //Volume LED
leds.setPixelColor(leds.numPixels()-1, Wheel(wheelpos)); //volume poti led //leds.setPixelColor(leds.numPixels()-1, Wheel(wheelpos)); //volume poti led
leds.show(); leds.show();
} }
@ -567,7 +614,9 @@ void loop() {
*/ */
if (loopmillis%5001==0) { //TODO: remove when working if (loopmillis%5001==0) { //TODO: remove when working
#ifdef INFOMSG
Serial.println(loopmillis); //alive print. for debugging Serial.println(loopmillis); //alive print. for debugging
#endif
} }
@ -577,18 +626,19 @@ void loop() {
void callback(char* topic, byte* payload, unsigned int length) { void callback(char* topic, byte* payload, unsigned int length) {
payload[length] = '\0'; //add end of string character payload[length] = '\0'; //add end of string character
String spayload = String((char*)payload); String spayload = String((char*)payload);
#ifdef INFOMSG
Serial.print("msg:"); Serial.print("msg:");
Serial.print(topic); Serial.print(topic);
for (unsigned int i = 0; i < length; i++) { for (unsigned int i = 0; i < length; i++) {
Serial.print((char)payload[i]); Serial.print((char)payload[i]);
} }
Serial.println(); Serial.println();
#endif
if (String(topic).equals("audiomixer/volume/set")){ if (String(topic).equals("audiomixer/volume/set")){
float _floatvalue = spayload.toFloat(); float _floatvalue = spayload.toFloat();
_floatvalue=constrain(_floatvalue,0.0,100.0); _floatvalue=constrain(_floatvalue,0.0,100.0);
@ -624,14 +674,29 @@ void callback(char* topic, byte* payload, unsigned int length) {
publishAllStates(NUMSELECTCHANNELS,"select_", &getSelection); publishAllStates(NUMSELECTCHANNELS,"select_", &getSelection);
}else if (String(topic).startsWith("audiomixer/enable_")) { //with range }else if (String(topic).startsWith("audiomixer/enable_")) { //with range
changeRelaisByNumberTopic(NUMMUTECHANNELS,"audiomixer/enable_", topic, spayload, &setMuteChannel); changeRelaisByNumberTopic(NUMMUTECHANNELS,"audiomixer/enable_", getIndex(NUMMUTECHANNELS, topic), spayload, &setMuteChannel);
}else if (String(topic).startsWith("audiomixer/select_")) { }else if (String(topic).startsWith("audiomixer/select_")) {
changeRelaisByNumberTopic(NUMSELECTCHANNELS,"audiomixer/select_", topic, spayload, &setSelectionChannel); changeRelaisByNumberTopic(NUMSELECTCHANNELS,"audiomixer/select_", getIndex(NUMSELECTCHANNELS, topic), spayload, &setSelectionChannel);
}else if (String(topic).startsWith("audiomixer/led_")) {
//Serial.print("Mute string="); Serial.println(spayload);
uint8_t _index=getIndex(NUMLED, topic);
if (_index<255) { //index ok
led_colors_standby[_index] = spayload.toInt();
} }
}
}
uint8_t getIndex(uint8_t pn, String pTopic) {
uint8_t _index=255;
for (uint8_t i=0; i<pn && _index==255; i++) {
if (String(pTopic).endsWith(String(i)+"/set")) {
_index=i;
}
}
return _index;
} }
@ -702,7 +767,9 @@ void publishCurrentSetVolume()
char pub_payload[8]; // Buffer big enough for 7-character float char pub_payload[8]; // Buffer big enough for 7-character float
dtostrf(_setpercentage, 1, 2, pub_payload); dtostrf(_setpercentage, 1, 2, pub_payload);
mqttClient.publish("audiomixer/volume", pub_payload); mqttClient.publish("audiomixer/volume", pub_payload);
#ifdef INFOMSG
Serial.print("pub="); Serial.println(_setpercentage); Serial.print("pub="); Serial.println(_setpercentage);
#endif
} }
void publishAllStates(int pn, String pTopicname, boolean (*pgetBit) (uint8_t)){ void publishAllStates(int pn, String pTopicname, boolean (*pgetBit) (uint8_t)){
@ -717,22 +784,24 @@ void publishAllStates(int pn, String pTopicname, boolean (*pgetBit) (uint8_t)){
} }
} }
void changeRelaisByNumberTopic(uint8_t pn, String pTopicPrefix, String pTopic, String pspayload, void (*psetXChannel) (uint8_t, boolean)) void changeRelaisByNumberTopic(uint8_t pn, String pTopicPrefix, uint8_t pindex, String pspayload, void (*psetXChannel) (uint8_t, boolean))
{ {
uint8_t _index=255; /*uint8_t _index=255;
for (uint8_t i=0; i<pn && _index==255; i++) { for (uint8_t i=0; i<pn && _index==255; i++) {
if (String(pTopic).equals(pTopicPrefix+String(i)+"/set")) { if (String(pTopic).equals(pTopicPrefix+String(i)+"/set")) {
_index=i; _index=i;
} }
} }*/
if (_index==255) { if (pindex==255) {
Serial.println("Index OOR"); #ifdef INFOMSG
Serial.println("idx OOR");
#endif
}else{ //index ok }else{ //index ok
bool _state=false; bool _state=false;
if (pspayload.equalsIgnoreCase("true")) { if (pspayload.equalsIgnoreCase("true")) {
_state=true; _state=true;
} }
setRelaisByNumber(pn, pTopicPrefix, _index, _state, psetXChannel); setRelaisByNumber(pn, pTopicPrefix, pindex, _state, psetXChannel);
} }
} }