├── README.md ├── .gitattributes └── CO2_Cuckoo_Clock ├── CO2_Cuckoo_Clock.ino ├── SCD30.h └── DFPlayer.h /README.md: -------------------------------------------------------------------------------- 1 | # CO2 Cuckoo Clock 2 | 3 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /CO2_Cuckoo_Clock/CO2_Cuckoo_Clock.ino: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #define SOUND 5 | #define SERVO 6 | #define SENS_SCD30 7 | 8 | #define LOOPTIME 30000 9 | #define CO2LIMIT 600 10 | 11 | unsigned int CO2; 12 | static const int servoPin = 5; 13 | 14 | Servo servo1; 15 | 16 | #ifdef SENS_SCD30 17 | #include "SCD30.h" 18 | #endif 19 | 20 | #ifdef SOUND 21 | #include "DFPlayer.h" 22 | #endif 23 | 24 | 25 | void alarm() { 26 | #ifdef SERVO 27 | servo1.write(0); 28 | delay(2000); 29 | #endif 30 | 31 | #ifdef SOUND 32 | for (int i = 0; i < 3; i++) { 33 | playFile(1); 34 | delay(500); 35 | } 36 | #endif 37 | 38 | #ifdef SERVO 39 | servo1.write(180); 40 | delay(2000); 41 | #endif 42 | 43 | #ifdef SOUND 44 | playFile(6); // I'll be back 45 | #endif 46 | 47 | } 48 | 49 | void setup() 50 | { 51 | Serial.begin(115200); 52 | Serial.println("Start init"); 53 | Wire.begin(); 54 | #ifdef SOUND 55 | DFPlayerInit(); 56 | #endif 57 | 58 | #ifdef SENS_SCD30 59 | SCD30init(); 60 | #endif 61 | 62 | #ifdef SERVO 63 | servo1.attach(servoPin); 64 | servo1.write(180); 65 | #endif 66 | Serial.println("End init"); 67 | } 68 | 69 | void loop() 70 | { 71 | // read sensor 72 | 73 | 74 | #ifdef SENS_SCD30 75 | CO2 = SCD30read(); 76 | #endif 77 | 78 | if (CO2 > CO2LIMIT) { 79 | alarm(); 80 | } 81 | 82 | delay(LOOPTIME); 83 | } 84 | -------------------------------------------------------------------------------- /CO2_Cuckoo_Clock/SCD30.h: -------------------------------------------------------------------------------- 1 | #include "SparkFun_SCD30_Arduino_Library.h" //Click here to get the library: http://librarymanager/All#SparkFun_SCD30 2 | SCD30 airSensor; 3 | 4 | 5 | bool SCD30init() { 6 | bool working; 7 | // if (airSensor.begin(Wire, false) == false) if you do not want autocalibration. 8 | if (airSensor.begin() == false) { 9 | working = false; 10 | } else { 11 | working = true; 12 | airSensor.setMeasurementInterval(4); //Change number of seconds between measurements: 2 to 1800 (30 minutes) 13 | 14 | airSensor.setAltitudeCompensation(350); //Set altitude of the sensor in m 15 | 16 | // airSensor.setAmbientPressure(835); //Current ambient pressure in mBar: 700 to 1200 17 | 18 | float offset = airSensor.getTemperatureOffset(); 19 | Serial.print("Current temp offset: "); 20 | Serial.print(offset, 2); 21 | Serial.println("C"); 22 | 23 | //airSensor.setTemperatureOffset(5); //Optionally we can set temperature offset to 5°C 24 | } 25 | } 26 | 27 | 28 | int SCD30read() { 29 | int _CO2; 30 | float _humidity; 31 | float _temperature; 32 | float _temperatureOffset; 33 | while (!airSensor.dataAvailable()) { 34 | Serial.print("."); 35 | } 36 | _CO2 = airSensor.getCO2(); 37 | Serial.print("co2(ppm):"); 38 | Serial.print(_CO2); 39 | 40 | Serial.print(" temp(C):"); 41 | Serial.print(airSensor.getTemperature(), 1); 42 | 43 | Serial.print(" humidity(%):"); 44 | Serial.print(airSensor.getHumidity(), 1); 45 | 46 | Serial.println(); 47 | 48 | return (_CO2); 49 | } 50 | -------------------------------------------------------------------------------- /CO2_Cuckoo_Clock/DFPlayer.h: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | DFRobotDFPlayerMini myDFPlayer; 4 | 5 | int numberFiles; 6 | 7 | void printDetail(uint8_t type, int value) { 8 | switch (type) { 9 | case TimeOut: 10 | Serial.println(F("Time Out!")); 11 | break; 12 | case WrongStack: 13 | Serial.println(F("Stack Wrong!")); 14 | break; 15 | case DFPlayerCardInserted: 16 | Serial.println(F("Card Inserted!")); 17 | break; 18 | case DFPlayerCardRemoved: 19 | Serial.println(F("Card Removed!")); 20 | break; 21 | case DFPlayerCardOnline: 22 | Serial.println(F("Card Online!")); 23 | break; 24 | case DFPlayerPlayFinished: 25 | Serial.print(F("Number:")); 26 | Serial.print(value); 27 | Serial.println(F(" Play Finished!")); 28 | break; 29 | case DFPlayerError: 30 | Serial.print(F("DFPlayerError:")); 31 | switch (value) { 32 | case Busy: 33 | Serial.println(F("Card not found")); 34 | break; 35 | case Sleeping: 36 | Serial.println(F("Sleeping")); 37 | break; 38 | case SerialWrongStack: 39 | Serial.println(F("Get Wrong Stack")); 40 | break; 41 | case CheckSumNotMatch: 42 | Serial.println(F("Check Sum Not Match")); 43 | break; 44 | case FileIndexOut: 45 | Serial.println(F("File Index Out of Bound")); 46 | break; 47 | case FileMismatch: 48 | Serial.println(F("Cannot Find File")); 49 | break; 50 | case Advertise: 51 | Serial.println(F("In Advertise")); 52 | break; 53 | default: 54 | break; 55 | } 56 | break; 57 | default: 58 | break; 59 | } 60 | } 61 | 62 | void waitFinish() { 63 | while (!myDFPlayer.available()) { 64 | delay(100); 65 | } 66 | Serial.println(); 67 | printDetail(myDFPlayer.readType(), myDFPlayer.read()); 68 | while (!myDFPlayer.available()) { 69 | delay(100); 70 | } 71 | while (myDFPlayer.readType() != DFPlayerPlayFinished) printDetail(myDFPlayer.readType(), myDFPlayer.read()); 72 | } 73 | 74 | void playFile(int number) { 75 | if (number > myDFPlayer.readFileCounts()){ 76 | number = myDFPlayer.readFileCounts(); 77 | Serial.println("File not available"); 78 | } 79 | myDFPlayer.play(number); 80 | waitFinish(); 81 | } 82 | 83 | void DFPlayerInit() { 84 | Serial2.begin(9600); 85 | delay(1000); 86 | Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)")); 87 | 88 | while (!myDFPlayer.begin(Serial2)) { //Use softwareSerial to communicate with mp3. 89 | Serial.println(F("Unable to begin:")); 90 | Serial.println(F("1.Please recheck the connection!")); 91 | Serial.println(F("2.Please insert the SD card!")); 92 | delay(1000); 93 | } 94 | Serial.println(F("DFPlayer Mini online.")); 95 | 96 | myDFPlayer.volume(20); //Set volume value. From 0 to 30 97 | } 98 | --------------------------------------------------------------------------------