diff --git a/BigRoomMyS/include/main.h b/BigRoomMyS/include/main.h index 1cc9691..d3df219 100644 --- a/BigRoomMyS/include/main.h +++ b/BigRoomMyS/include/main.h @@ -4,10 +4,12 @@ #include #include "MHZ19.h" +#define DEBUG #define MY_DEBUG #define MY_RADIO_RF24 #define MY_RF24_CHANNEL (105) #define MY_RF24_PA_LEVEL RF24_PA_MAX +#define MY_TRANSPORT_WAIT_READY_MS 5000 //#define MY_REPEATER_FEATURE #define MY_DEFAULT_ERR_LED_PIN (A3) // Error led pin @@ -17,24 +19,32 @@ #include #include // Remove if using HardwareSerial or non-uno compatabile device #include +#include + +void printDeb(String msg); #define RX_PIN 8 #define TX_PIN 7 #define BAUDRATE 9600 -#define MOTION (4) +#define MOTION (3) +#define PS (4) #define LED_WHITE (5) #define LED_BLUE (6) MHZ19 myMHZ19; SoftwareSerial mySerial(RX_PIN, TX_PIN); HTU21D myHTU21D(HTU21D_RES_RH10_TEMP13); +RunningMedian samples = RunningMedian(5 * sizeof(int)); -uint8_t periodMinCO2; -uint8_t periodMotion; -uint8_t curDelay; -uint8_t spLight, dbLight; -uint16_t levelBlue, levelWhite; +//uint8_t periodMinCO2; +byte periodMotion; +int8_t curDelay; +uint16_t spLight, dbLight; +uint8_t timeLight; +byte levelBlue, levelWhite; bool move, lightWhite; float temp, hum; +bool bLamp, wLamp; +uint8_t statLamp; #endif \ No newline at end of file diff --git a/BigRoomMyS/platformio.ini b/BigRoomMyS/platformio.ini index e881e68..2ece4d9 100644 --- a/BigRoomMyS/platformio.ini +++ b/BigRoomMyS/platformio.ini @@ -17,4 +17,5 @@ lib_deps = MySensors @ ^2.3.2 wifwaf/MH-Z19 @ ^1.5.3 enjoyneering/HTU21D @ ^1.2.1 - featherfly/SoftwareSerial @ ^1.0 \ No newline at end of file + featherfly/SoftwareSerial @ ^1.0 + robtillaart/RunningMedian @ ^0.3.3 \ No newline at end of file diff --git a/BigRoomMyS/src/main.cpp b/BigRoomMyS/src/main.cpp index 21ec851..464e317 100644 --- a/BigRoomMyS/src/main.cpp +++ b/BigRoomMyS/src/main.cpp @@ -12,7 +12,21 @@ MyMessage msgCO2(3, V_VAR1); MyMessage msgLight(3, V_VAR2); MyMessage msgTimeWork(3, V_VAR3); MyMessage msgTimeMotion(3, V_VAR4); -MyMessage msgPeriod(3, V_VAR5); +//MyMessage msgPeriodCO2(3, V_VAR5); +MyMessage msgWLamp(4, V_DIMMER); +MyMessage msgSPLight(5, V_VAR1); +MyMessage msgDBLight(5, V_VAR2); +MyMessage msgWLight(5, V_VAR3); +MyMessage msgTimeLight(5, V_VAR4); + +void before(){ + pinMode(PS, OUTPUT); + digitalWrite(PS, LOW); + pinMode(LED_BLUE, OUTPUT); + pinMode(LED_WHITE, OUTPUT); + digitalWrite(LED_BLUE, HIGH); + digitalWrite(LED_WHITE, HIGH); +} void setup() { pinMode(MOTION, INPUT_PULLUP); @@ -20,7 +34,7 @@ void setup() { myMHZ19.begin(mySerial); // *Important, Pass your Stream reference here myMHZ19.autoCalibration(false); - char myVersion[4]; + /*char myVersion[4]; myMHZ19.getVersion(myVersion); Serial.print("\nFirmware Version: "); for(byte i = 0; i < 4; i++) @@ -37,22 +51,38 @@ void setup() { Serial.println(myMHZ19.getBackgroundCO2()); Serial.print("Temperature Cal: "); Serial.println(myMHZ19.getTempAdjustment()); - Serial.print("ABC Status: "); myMHZ19.getABC() ? Serial.println("ON") : Serial.println("OFF"); - periodMinCO2 = loadState(0); - if(periodMinCO2 == 0) periodMinCO2 = 1; - periodMotion = loadState(1); - if(periodMotion == 0) periodMotion = 60; - spLight = (loadState(2) << 8) + loadState(3); - spLight = (loadState(4) << 8) + loadState(5); - levelBlue = (loadState(6) << 8) + loadState(7); - levelWhite = (loadState(8) << 8) + loadState(9); + Serial.print("ABC Status: "); myMHZ19.getABC() ? Serial.println("ON") : Serial.println("OFF");*/ + // periodMinCO2 = loadState(0); + // sendDataI(msgPeriodCO2, periodMinCO2); + // if(periodMinCO2 == 0) periodMinCO2 = 1; + periodMotion = loadState(11); + sendDataI(msgTimeMotion, periodMotion); +// if(periodMotion == 0) periodMotion = 60; + spLight = (loadState(12) << 8) + loadState(13); + sendDataI(msgSPLight, spLight); + dbLight = (loadState(14) << 8) + loadState(15); + sendDataI(msgDBLight, dbLight); + levelBlue = loadState(6); + levelWhite = loadState(7); + // timeLight = loadState(8); + // sendDataI(msgTimeWork, timeLight); + // Serial.print(F("PeriodCO2:"));Serial.println(periodMinCO2); + Serial.print(F("PeriodMove:"));Serial.println(periodMotion); + Serial.print(F("SPLight:"));Serial.println(spLight); + Serial.print(F("DBLight:"));Serial.println(dbLight); + Serial.print(F("BLevel:"));Serial.println(levelBlue); + Serial.print(F("WLevel:"));Serial.println(levelWhite); + //Serial.print(F("TimeLight:"));Serial.println(timeLight); myHTU21D.begin(); + curDelay = -1; + wLamp = bLamp = false; + statLamp = 0; } void loop() { static uint32_t cRun = millis(); static uint8_t sec = 0; - static uint8_t minuts = 0; + //static uint8_t minuts = 0; if(digitalRead(MOTION) > 0){ if(curDelay == -1) sendDataB(msgMove, true); @@ -61,20 +91,43 @@ void loop() { } uint16_t LightLev = analogRead(A0); - if (LightLev < spLight && move){ - analogWrite(LED_BLUE, levelBlue); + samples.add(LightLev); + LightLev = samples.getMedian(); + if ((LightLev < spLight) && move && !bLamp){ + analogWrite(LED_BLUE, (levelBlue) * 2.55); + statLamp |= 0x01; + bLamp = true; + Serial.println(F("BLamp On")); } else if((LightLev > (spLight + dbLight)) || (move == 0)){ - analogWrite(LED_BLUE, 0); + //analogWrite(LED_BLUE, 0); + digitalWrite(LED_BLUE, LOW); + statLamp &= 0xFE; + bLamp = false; } - if(lightWhite) - analogWrite(LED_WHITE, levelWhite); - else - analogWrite(LED_WHITE, 0); + if(lightWhite && !wLamp){ + analogWrite(LED_WHITE, (levelWhite) * 2.55); + statLamp |= 0x02; + wLamp = true; + Serial.println(F("WLamp On")); + } + else if (!lightWhite){ + //analogWrite(LED_WHITE, 0); + digitalWrite(LED_WHITE, LOW); + statLamp &= 0xFD; + wLamp = false; + } + if(statLamp > 0) digitalWrite(PS, HIGH); + else digitalWrite(PS, LOW); + if((cRun + 1000) <= millis()){ //Once per second cRun = millis(); + if(curDelay > -1){ + Serial.println("ADC: " + String(LightLev) + " MV:" + String(move) + " TMv:" + curDelay + " SL:" + String(statLamp) + " PS:" + digitalRead(PS)); + Serial.println("SPL: " + String(spLight) + " DBL:" + String(dbLight)+ " BL:" + String(bLamp)); + } sec++; if(curDelay > 0) curDelay--; if(curDelay == 0){ @@ -85,14 +138,14 @@ void loop() { if((sec + 2) % 30 == 0){ temp = myHTU21D.readTemperature(); hum = myHTU21D.readCompensatedHumidity(); - Serial.println("Temp: " + String(temp)); - Serial.println("Hum: " + String(hum)); + // Serial.println("Temp: " + String(temp)); + // Serial.println("Hum: " + String(hum)); } if(sec == 59){ - minuts++; + //minuts++; sec = 0; - } - if(minuts == periodMinCO2){ + // } + // if(minuts == periodMinCO2){ int CO2; // Buffer for CO2 CO2 = myMHZ19.getCO2(); // Request CO2 (as ppm) @@ -102,21 +155,23 @@ void loop() { sendDataI(msgCO2, CO2); wait(50); } - else{ - Serial.println("CO2err:" + String(myMHZ19.errorCode)); - } + // else{ + // Serial.println("CO2err:" + String(myMHZ19.errorCode)); + // } if(temp != HTU21D_ERROR){ - Serial.println("Send"); + // Serial.println("Send"); - Serial.println("Temp: " + String(temp)); - Serial.println("Hum: " + String(hum)); + // Serial.println("Temp: " + String(temp)); + // Serial.println("Hum: " + String(hum)); sendDataF(msgTemp, temp); wait(50); sendDataF(msgHum, hum); wait(50); } - sendDataI(msgTimeWork, cRun); - minuts = 0; + sendDataF(msgTimeWork, cRun / 60000.0); + wait(50); + sendDataI(msgLight, LightLev); + //minuts = 0; } } } @@ -128,17 +183,49 @@ void presentation() present(1, S_HUM, F("Humid")); present(2, S_MOTION, F("Motion")); present(3, S_CUSTOM, F("CO2_Light_Time")); + present(4, S_DIMMER, F("White Light")); + present(5, S_CUSTOM, F("Blue Light SP_DB")); } void receive(const MyMessage &message) { + // if((message.sensor == 3) && (message.type == V_VAR5)){ + // periodMinCO2 = message.getByte(); + // saveState(0, periodMinCO2); + // } if((message.sensor == 3) && (message.type == V_VAR4)){ - periodMotion = message.getByte(); - saveState(1, periodMotion); + periodMotion = message.getULong(); + printDeb("PerMot:" + String(periodMotion)); + saveState(11, periodMotion); } - if((message.sensor == 3) && (message.type == V_VAR5)){ - periodMinCO2 = message.getByte(); - saveState(0, periodMinCO2); + if((message.sensor == 4) && (message.type == V_DIMMER)){ + levelWhite = message.getULong(); + printDeb("LevelW:" + String(dbLight)); + saveState(7, levelWhite); + if(wLamp) analogWrite(LED_WHITE, (levelWhite) * 2.55); + } + if((message.sensor == 5) && (message.type == V_VAR3)){ + levelBlue = message.getULong(); + printDeb("LevelB:" + String(levelBlue)); + saveState(6, levelBlue); + if(bLamp) analogWrite(LED_BLUE, (levelBlue) * 2.55); + } + if((message.sensor == 4) && (message.type == V_STATUS)){ + lightWhite = message.getBool(); + //saveState(6, lightWhite); + } + if((message.sensor == 5) && (message.type == V_VAR1)){ + spLight = message.getULong(); + printDeb("SPL:" + String(spLight)); + saveState(12, (spLight >> 8) & 0xFF); + saveState(13, spLight & 0xFF); + + } + if((message.sensor == 5) && (message.type == V_VAR2)){ + dbLight = message.getULong(); + printDeb("DBL:" + String(dbLight)); + saveState(14, (dbLight >> 8) & 0xFF); + saveState(15, dbLight & 0xFF); } } @@ -189,3 +276,10 @@ void sendDataB(MyMessage msg, bool val) } } } + +void printDeb(String msg) +{ +#ifdef DEBUG + Serial.println(msg); +#endif +} \ No newline at end of file