added serial code for communication
This commit is contained in:
parent
9e4a28db2e
commit
4f6f68bc09
|
@ -1,18 +1,31 @@
|
||||||
|
|
||||||
#define PIN_DATA_VOL_A 5
|
#define PIN_DATA_VOL_A 8
|
||||||
#define PIN_DATA_VOL_B 6
|
#define PIN_DATA_VOL_B 7
|
||||||
#define PIN_DATA_VOL_C 7
|
#define PIN_DATA_VOL_C 6
|
||||||
#define PIN_DATA_VOL_D 8
|
#define PIN_DATA_VOL_D 5
|
||||||
#define PIN_DATA_CLOCK 9
|
#define PIN_DATA_CLOCK 9
|
||||||
#define PIN_SR_DATA 2
|
#define PIN_SR_DATA 2
|
||||||
#define PIN_SR_LTCH 3
|
#define PIN_SR_LTCH 3
|
||||||
#define PIN_SR_CLOCK 4
|
#define PIN_SR_CLOCK 4
|
||||||
#define PIN_LED 13
|
#define PIN_LED 13
|
||||||
|
|
||||||
|
// Serial Protocol:
|
||||||
|
// 9600 Baud
|
||||||
|
// 1 char: room number 1-5
|
||||||
|
// 2 char: command v (volume) / r (relais)
|
||||||
|
// relais command:
|
||||||
|
// 3 char: a or b
|
||||||
|
// volume command:
|
||||||
|
// 3-5 char: 0-100 volume
|
||||||
|
|
||||||
|
|
||||||
long tick;
|
long tick;
|
||||||
uint16_t relaisData = 0xffff;
|
uint16_t relaisData = 0xffff;
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
Serial.setTimeout(100);
|
||||||
|
|
||||||
pinMode(PIN_DATA_VOL_A, OUTPUT);
|
pinMode(PIN_DATA_VOL_A, OUTPUT);
|
||||||
pinMode(PIN_DATA_VOL_B, OUTPUT);
|
pinMode(PIN_DATA_VOL_B, OUTPUT);
|
||||||
pinMode(PIN_DATA_VOL_C, OUTPUT);
|
pinMode(PIN_DATA_VOL_C, OUTPUT);
|
||||||
|
@ -26,12 +39,19 @@ void setup() {
|
||||||
// shift out one time 0xffff to set all pins high. our relais boards
|
// shift out one time 0xffff to set all pins high. our relais boards
|
||||||
// are active-low
|
// are active-low
|
||||||
shiftRelais(relaisData);
|
shiftRelais(relaisData);
|
||||||
|
|
||||||
|
setVolume(1, 50);
|
||||||
|
setVolume(2, 50);
|
||||||
|
setVolume(3, 50);
|
||||||
|
setVolume(4, 50);
|
||||||
|
setVolume(5, 50);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void shiftRelais(uint16_t data) {
|
void shiftRelais(uint16_t data) {
|
||||||
digitalWrite(PIN_SR_LTCH, LOW);
|
digitalWrite(PIN_SR_LTCH, LOW);
|
||||||
shiftOut(PIN_SR_DATA, PIN_SR_CLOCK, MSBFIRST, (data >> 8));
|
shiftOut(PIN_SR_DATA, PIN_SR_CLOCK, MSBFIRST, (data >> 8));
|
||||||
shiftOut(PIN_SR_DATA, PIN_SR_CLOCK, MSBFIRST, data);
|
shiftOut(PIN_SR_DATA, PIN_SR_CLOCK, MSBFIRST, data & 0xff);
|
||||||
digitalWrite(PIN_SR_LTCH, HIGH);
|
digitalWrite(PIN_SR_LTCH, HIGH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,9 +95,9 @@ void switchInputs(uint8_t channel, bool state) {
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
if(state) {
|
if(state) {
|
||||||
relaisData |= _BV(9) | _BV(8);
|
relaisData |= (_BV(15) | _BV(14));
|
||||||
} else {
|
} else {
|
||||||
relaisData &= ~(_BV(9) | _BV(8));
|
relaisData &= ~(_BV(15) | _BV(14));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -119,37 +139,53 @@ void setVolume(uint8_t volume, uint8_t dataPin) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint8_t volume = 0;
|
|
||||||
uint8_t room = 0;
|
|
||||||
bool flag = false;
|
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
|
|
||||||
long currentMillis = millis();
|
long currentMillis = millis();
|
||||||
|
|
||||||
|
if (Serial.available() > 0) {
|
||||||
|
String ser = Serial.readString();
|
||||||
|
|
||||||
if(currentMillis - tick > 500) {
|
int room = ser.charAt(0) - 48;
|
||||||
|
|
||||||
setVolume(volume, PIN_DATA_VOL_A);
|
if(room >= 1 && room <= 5) {
|
||||||
setVolume(volume, PIN_DATA_VOL_B);
|
|
||||||
setVolume(volume, PIN_DATA_VOL_C);
|
|
||||||
setVolume(volume, PIN_DATA_VOL_D);
|
|
||||||
|
|
||||||
volume++;
|
char command = ser.charAt(1);
|
||||||
if(volume > 100) volume = 0;
|
|
||||||
|
|
||||||
switchInputs(room++, flag);
|
|
||||||
|
|
||||||
if(room == 5) {
|
|
||||||
room = 0;
|
|
||||||
flag = !flag;
|
|
||||||
}
|
|
||||||
|
|
||||||
tick = currentMillis;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if(command == 'v') { //volume
|
||||||
|
int datapin=0;
|
||||||
|
|
||||||
|
switch(room){
|
||||||
|
case 1:
|
||||||
|
datapin=PIN_DATA_VOL_A;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
datapin=PIN_DATA_VOL_B;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
datapin=PIN_DATA_VOL_C;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
datapin=PIN_DATA_VOL_D;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
int vol=ser.substring(2).toInt();
|
||||||
|
setVolume(vol,datapin);
|
||||||
|
|
||||||
|
} else if(command == 'r') { // relais
|
||||||
|
|
||||||
|
char state = ser.charAt(2);
|
||||||
|
|
||||||
|
if (state=='a') {
|
||||||
|
switchInputs(room,true);
|
||||||
|
} else if (state=='b') {
|
||||||
|
switchInputs(room,false);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // end if command check
|
||||||
|
} // end if room check
|
||||||
|
} // end serial available check
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,52 +1,61 @@
|
||||||
#include <Homie.h>
|
#include <Homie.h>
|
||||||
#include <ArduinoOTA.h>
|
#include <ArduinoOTA.h>
|
||||||
|
|
||||||
|
#define ROOM_NUMBERS 5
|
||||||
|
|
||||||
|
// Serial Protocol:
|
||||||
|
// 9600 Baud
|
||||||
|
// 1 char: room number 1-5
|
||||||
|
// 2 char: command v (volume) / r (relais)
|
||||||
|
// relais command:
|
||||||
|
// 3 char: a or b
|
||||||
|
// volume command:
|
||||||
|
// 3-5 char: 0-100 volume
|
||||||
|
|
||||||
|
|
||||||
long lastTickMillis;
|
long lastTickMillis;
|
||||||
|
uint8_t volume[ROOM_NUMBERS], volumeLast[ROOM_NUMBERS];
|
||||||
|
String relais[ROOM_NUMBERS], relaisLast[ROOM_NUMBERS];
|
||||||
|
|
||||||
HomieNode volumeNode("volume", "volume");
|
HomieNode volumeNode("volume", "volume");
|
||||||
HomieNode switchNode("switches", "switch");
|
HomieNode switchNode("switches", "switch");
|
||||||
|
|
||||||
bool nodeInputHandlerVolume(const HomieRange& range, const String& value) {
|
bool nodeInputHandlerVolume(const HomieRange& range, const String& value) {
|
||||||
Homie.getLogger() << "VOL " << range.index << " set to " << value << endl;
|
|
||||||
|
|
||||||
int r = value.toInt();
|
int vol = value.toInt();
|
||||||
if(r >= 0 && r <= 127) {
|
if(range.index >= 1 && range.index <= ROOM_NUMBERS && vol >= 0 && vol <= 100) {
|
||||||
|
volumeNode.setProperty("volume").setRange(range).send(value);
|
||||||
volumeNode.setProperty("output").setRange(range).send(value);
|
volume[range.index-1] = vol;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool nodeInputHandlerRelais(const HomieRange& range, const String& value) {
|
||||||
|
|
||||||
|
if(range.index >= 1 && range.index <= 5 && (value == "a" || value == "b")) {
|
||||||
|
switchNode.setProperty("switch").setRange(range).send(value);
|
||||||
|
relais[range.index-1] = value;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool nodeInputHandlerVolume(const HomieRange& range, const String& value) {
|
|
||||||
Homie.getLogger() << "VOL " << range.index << " set to " << value << endl;
|
|
||||||
|
|
||||||
switchNode.setProperty("switch").setRange(range).send(value);
|
|
||||||
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
Serial.begin(115200);
|
Serial.begin(9600);
|
||||||
Serial << endl << endl;
|
|
||||||
|
|
||||||
Homie_setFirmware("audiocontroller", "1.0.0");
|
|
||||||
|
|
||||||
volumeNode.advertiseRange("volume", 1, 4).settable(nodeInputHandlerVolume);
|
Homie_setFirmware("audiocontroller", "1.0.0");
|
||||||
switchNode.advertiseRange("switch", 1, 4).settable(nodeInputHandlerVolume);
|
Homie.disableLogging();
|
||||||
|
|
||||||
|
volumeNode.advertiseRange("volume", 1, ROOM_NUMBERS).settable(nodeInputHandlerVolume);
|
||||||
|
switchNode.advertiseRange("switch", 1, ROOM_NUMBERS).settable(nodeInputHandlerRelais);
|
||||||
|
|
||||||
Homie.setup();
|
Homie.setup();
|
||||||
Homie.getLogger() << "started" << endl;
|
|
||||||
|
|
||||||
ArduinoOTA.setHostname(Homie.getConfiguration().deviceId);
|
ArduinoOTA.setHostname(Homie.getConfiguration().deviceId);
|
||||||
ArduinoOTA.begin();
|
ArduinoOTA.begin();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,14 +63,33 @@ void loop() {
|
||||||
Homie.loop();
|
Homie.loop();
|
||||||
ArduinoOTA.handle();
|
ArduinoOTA.handle();
|
||||||
|
|
||||||
long currentMillis = millis();
|
// wait for at least 200ms before sending new command because
|
||||||
|
// the arduino mini has a 100ms serial timeout
|
||||||
|
|
||||||
|
for(uint8_t i = 0; i < ROOM_NUMBERS; i++) {
|
||||||
|
|
||||||
|
if(volume[i] != volumeLast[i]) {
|
||||||
|
if(millis() - lastTickMillis >= 400) {
|
||||||
|
Serial.print(i+1);
|
||||||
|
Serial.print("v");
|
||||||
|
Serial.print(volume[i]);
|
||||||
|
volumeLast[i] = volume[i];
|
||||||
|
lastTickMillis = millis();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(currentMillis - lastTickMillis >= 100) {
|
if(relais[i] != relaisLast[i]) {
|
||||||
|
if(millis() - lastTickMillis >= 400) {
|
||||||
|
Serial.print(i+1);
|
||||||
|
Serial.print("r");
|
||||||
|
Serial.print(relais[i]);
|
||||||
|
relaisLast[i] = relais[i];
|
||||||
|
lastTickMillis = millis();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
lastTickMillis = currentMillis;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue