#include #define MY_DEBUG #define MY_RADIO_RF24 #define MY_RF24_CHANNEL (105) #define MY_RF24_PA_LEVEL RF24_PA_HIGH #if F_CPU == 8000000L #define MY_BAUD_RATE 38400 #endif #define MY_TRANSPORT_WAIT_READY_MS 10000 // Set blinking period #define MY_DEFAULT_LED_BLINK_PERIOD 300 // Inverses the behavior of leds #define MY_WITH_LEDS_BLINKING_INVERSE // Flash leds on rx/tx/err #define MY_DEFAULT_ERR_LED_PIN A3 // Error led pin #define MY_DEFAULT_TX_LED_PIN A4 // the PCB, on board LED #define MY_DEFAULT_RX_LED_PIN A5 // Receive led pin #include #include #include unsigned long cRun; int cSec, adc, move, oldmov, minLight, minLightDB, LightInt, timeDelay, curDelay; uint8_t sdsPeriod; bool lamp; //float avgL; #define RX_PIN 2 #define TX_PIN 3 #define LAMP_OUT 5 SoftwareSerial sSerial(RX_PIN, TX_PIN); SDS011 sds; MyMessage msgHum25(0, V_LEVEL); MyMessage msgHum10(1, V_LEVEL); MyMessage msgLightLev(2, V_LEVEL); MyMessage msgLightLevSet(3, V_VAR1); MyMessage msgMillis(3, V_VAR4); MyMessage msgMove(4, V_TRIPPED); MyMessage msgLamp(5, V_VAR1); void sendData(MyMessage msg, int status); void sendData(MyMessage msg, float status); void sendData(MyMessage msg, bool status); void SDS011workmode(byte mode, SoftwareSerial *ser); void setup() { Serial.begin(115200); sSerial.begin(9600); //set_per(2, &sSerial); SDS011workmode(2, &sSerial); sds.begin(&sSerial); Serial.println("Begin"); //Serial.println(sds.queryFirmwareVersion().toString()); // prints firmware version //Serial.println(sds.setActiveReportingMode().toString()); // ensures sensor is in 'active' reporting mode //Serial.println(sds.setCustomWorkingPeriod(3).toString()); // sensor sends data every 3 minutes //sds.setActiveReportingMode(); //sds.setCustomWorkingPeriod(1); pinMode(A1, INPUT_PULLUP); pinMode(LAMP_OUT, OUTPUT); //digitalWrite(7, HIGH); //saveState(6, 2); minLight = (loadState(0) << 8) + loadState(1); minLightDB = (loadState(2) << 8) + loadState(3); LightInt = (loadState(4) << 8) + loadState(5); sdsPeriod = loadState(6); timeDelay = (loadState(8) << 8) + loadState(9); curDelay = -1; Serial.print(F("Min Light"));Serial.println(minLight); Serial.print(F("Min LightDB"));Serial.println(minLightDB); Serial.print(F("LightInt"));Serial.println(LightInt); Serial.print(F("SDS Period"));Serial.println(sdsPeriod); Serial.print(F("Time Delay"));Serial.println(timeDelay); SDS011workmode(sdsPeriod, &sSerial); // if(minLight == 0) minLight = 5; //adc = analogRead(A0); oldmov = 0; lamp = false; cRun = millis(); cSec = 0; } void presentation() { sendSketchInfo("Koridor", "1.0"); present(0, S_DUST, "pm2.5"); present(1, S_DUST, "pm10"); present(2, S_LIGHT_LEVEL, "minLight"); present(3, S_CUSTOM, "minLightSet"); present(4, S_MOTION, "Move"); present(5, S_CUSTOM, "LampOut"); } void loop() { float p25, p10; //move = digitalRead(A1); if(digitalRead(A1) > 0){ if(curDelay == -1) sendData(msgMove, true); move = true; curDelay = timeDelay; } // if(move != oldmov){ // oldmov = move; // sendData(msgMove, move); // //send(msgMove.set(move)); // } adc = analogRead(A0); if ((adc <= minLight) && (move == 1)){ analogWrite(LAMP_OUT, LightInt); if(lamp == false){ Serial.println("Lamp ON"); Serial.print("ADC: ");Serial.print(adc); Serial.print(", Move: ");Serial.println(move); sendData(msgLightLev, adc); //send(msgLightLev.set(adc, 2)); wait(50); sendData(msgLamp, true); //send(msgLamp.set(true)); lamp = true; } } else if((adc > (minLight + minLightDB)) || (move == 0)){ analogWrite(LAMP_OUT, 0); if(lamp == true){ Serial.println("Lamp OFF"); Serial.print("ADC: ");Serial.print(adc); Serial.print(", Move: ");Serial.println(move); sendData(msgLightLev, adc); //send(msgLightLev.set(adc, 2)); wait(50); sendData(msgLamp, false); //send(msgLamp.set(false)); lamp = false; } } if(cRun + 999 < millis()){ cRun = millis(); if(curDelay == 0) { sendData(msgMove, false); move = false; curDelay = -1; } if(curDelay > 0) curDelay--; int error = sds.read(&p25, &p10); //Serial.print("ADC: ");Serial.print(adc);Serial.print(", Move: ");Serial.println(move); if (!error) { Serial.println(millis()/1000); Serial.println("P2.5: " + String(p25)); Serial.println("P10: " + String(p10)); sendData(msgHum25, p25); //send(msgHum25.set(p25, 1)); wait(100); sendData(msgHum10, p10); //send(msgHum10.set(p10, 1)); } if (++cSec > 19){ cSec = 0; wait(100); sendData(msgLightLev, adc); //send(msgLightLev.set(adc)); wait(100); uint32_t ms = millis(); send(msgMillis.set(ms)); } } } void receive(const MyMessage &message) { if((message.sensor == 3) && (message.type == V_VAR1)){ minLight = message.getInt(); saveState(0, (minLight>>8) & 0xFF); saveState(1, minLight & 0xFF); Serial.print("minLight:"); Serial.println(minLight); } if((message.sensor == 3) && (message.type == V_VAR2)){ minLightDB = message.getInt(); saveState(2, (minLightDB>>8) & 0xFF); saveState(3, minLightDB & 0xFF); Serial.print("LightDB:"); Serial.println(minLightDB); } if((message.sensor == 3) && (message.type == V_VAR3)){ LightInt = message.getInt(); saveState(4, (LightInt>>8) & 0xFF); saveState(5, LightInt & 0xFF); Serial.print("Light Int:"); if (lamp == true) analogWrite(6, LightInt); Serial.println(LightInt); } if((message.sensor == 3) && (message.type == V_VAR5)){ sdsPeriod = message.getInt(); saveState(6, sdsPeriod); Serial.print("Sds period:"); Serial.println(sdsPeriod); } if((message.sensor == 5) && (message.type == V_VAR2)){ timeDelay = message.getInt(); saveState(8, (timeDelay>>8) & 0xFF); saveState(9, timeDelay & 0xFF); Serial.print("time period:"); Serial.println(timeDelay); } } ////////////////// sends work mode command to SDS011 ////////////////////// void SDS011workmode(byte mode, SoftwareSerial *ser) { byte cs = 7 + mode; uint8_t sleep_command[] = {0xAA, 0xB4, 0x08, 0x01, mode, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, cs, 0xAB}; // ^^ 0 for continuous, 1-30 for 1-30 min delay between turns on. ^^ checksum: 07 for 0x00, 08 for 0x01 and so on for (uint8_t i = 0; i < 19; i++) { ser->write(sleep_command[i]); } } void sendData(MyMessage msg, bool status) { bool send_data = false; uint8_t count = 0; while(send_data == false){ count++; send_data = send(msg.set(status)); wait(1000, C_SET, msg.type); if ((count == 3)&&(send_data == 0)){ // Если сделано 3 попытки и нет подтверждения отправки count = 0; // Обнуляем счётчик send_data = true; // Выходим из цикла } } } void sendData(MyMessage msg, float status) { bool send_data = false; uint8_t count = 0; while(send_data == false){ count++; send_data = send(msg.set(status, 1)); wait(1000, C_SET, msg.type); if ((count == 3 )&&(send_data == 0)){ // Если сделано 3 попытки и нет подтверждения отправки count = 0; // Обнуляем счётчик send_data = 1; // Выходим из цикла } } } void sendData(MyMessage msg, int status) { bool send_data = false; uint8_t count = 0; while(send_data == false){ count++; send_data = send(msg.set(status)); wait(1000, C_SET, msg.type); if ((count == 3 )&&(send_data == 0)){ // Если сделано 3 попытки и нет подтверждения отправки count = 0; // Обнуляем счётчик send_data = 1; // Выходим из цикла } } }