'MySensoring' a GE Washer
-
This is another very simple "Wash Cycle Completed" sensor. It's design uses the same Optocoupler sensing design I used in the Kiddie Smoke Detector project. The only difference is that I'm using 1 AC to DC transformer, and a boost module to boost the washer speaker power to fire the Optocoupler.
Parts:
- 1 Cheap AC/DC converter
- 1 Optocoupler
- 1 Step up Regulator
- 1 Small Proto Board.
- Some wire
Highlights:
Use the Washers .5vdc Signal Piezo to interface with the Pro-Mini. The voltage to the Piezo is to low to drive the Optocoupler so I had to use a boost module to boost the voltage to the Optocoupler. I'm not sure what the long term effect will be on washers control board Piezo drive circuit, so I will follow up if I encounter a problem.Again Uses the same sketch as the Kiddie Smoke Project, with the only change being to CYCLE_INTERVAL (For my dryer 3 works well)
Sketch:
// Based on Author: Patrick 'Anticimex' Fallberg Interrupt driven binary switch example with dual interrupts #include <MySensor.h> #include <SPI.h> #define SKETCH_NAME "Washer End Cycle" #define SKETCH_MAJOR_VER "1" #define SKETCH_MINOR_VER "1" #define CHILD_ID 3 #define SIREN_SENSE_PIN 3 // Arduino Digital I/O pin for optocoupler for siren unsigned int SLEEP_TIME = 32400; // Sleep time between reads (in seconds) 32400 = 9hrs? long CYCLE_COUNTER = 3; // This is the number of times we want the Audio Counter to reach before triggering a signal to controller. unsigned long CYCLE_INTERVAL = 3; // How long do we want to watch once first detected (in seconds) //Adjust for your smoke detector, you want to pick up the siren signal at least 3 time to help stop false alarms. unsigned long CYCLE_RATE = 90; // How fast do we want to move checking the Pin state in the Status Check (in Millis) Adjust for your smoke detector //Adjust for your smoke detector, you want to pick up the siren signal at least 3 time to help stop false alarms. unsigned long CYCLE_TIME_OKSTATUS = 8; // How long do we want to watch for "all clear" once we have confirmed an Alarm (in seconds) unsigned long CYCLE_RATE_OKSTATUS = 500; // How fast do we want to move checking the Pin state when checking for an OK status (in Millis) int oldValue=1; int value=0; MySensor sensor_node; MyMessage msg(CHILD_ID, V_TRIPPED); void setup() { sensor_node.begin(); // Setup the Siren Pin HIGH pinMode(SIREN_SENSE_PIN, INPUT_PULLUP); // Send the sketch version information to the gateway and Controller sensor_node.sendSketchInfo(SKETCH_NAME, SKETCH_MAJOR_VER"."SKETCH_MINOR_VER); sensor_node.present(CHILD_ID, S_SMOKE); //Send the state -- Always send Alarm state on power up. sensor_node.send(msg.setSensor(CHILD_ID).set("1"), true); } // Loop will iterate on changes on the BUTTON_PINs void loop() { // Check to see if we have a alarm. I always want to check even if we are coming out of sleep for heartbeat. AlarmStatus(); // Sleep until we get a audio power hit on the optocoupler or 9hrs sensor_node.sleep(SIREN_SENSE_PIN-2,FALLING, SLEEP_TIME * 1000UL); } void AlarmStatus() { // We will check the status now, this could be called by an interrupt or heartbeat int siren_audio_count =0; long cycle_time =0; unsigned long startedAt = millis(); Serial.println("Status Check"); //Read the Pin value = digitalRead(SIREN_SENSE_PIN); // If Pin return a 0 (LOW), then we have a Alarm Condition if (value != 1) { //We are only going to check for status for CYCLE_INTERVAL time I think this should help stabilize Siren Sensing while(millis() - startedAt < CYCLE_INTERVAL * 1000) { //We are going to check CYCLE_RATE fast if(millis() - cycle_time > CYCLE_RATE ) { // save the last time you Checked cycle_time = millis(); //We will count each time SIREN_SENSE_PIN is 0 (Alarm - LOW) for the above time and at the above rate. value = digitalRead(SIREN_SENSE_PIN); if (value != 1) { siren_audio_count++; Serial.print("Audio Count: "); Serial.println(siren_audio_count); } } } // Eval siren audio hit count against our limit. If we are => then CYCLE_COUNTER then lets start a loop for "All Clear" reset // If we continue to return an audio power hit, then we will continue to send to the controller. if (siren_audio_count>=CYCLE_COUNTER) { Serial.println("Alarm Detected"); do { //update gateway with bad news. //sensor_node.send(msg.set("1")); sensor_node.send(msg.setSensor(CHILD_ID).set("1"), true); Serial.println("Alarm Detected Sent to gateway"); } while (IsAlarmAllClear()!=1); } } //Pin returned a 1 (High) so there is no alarm. else { IsAlarmAllClear(); } } int IsAlarmAllClear() // We are looking for an gap in time that we no longer see an audio power hit to the optocoupler. { int alarmOn =0; long cycle_time =0; unsigned long startedAt = millis(); //We are only going to check for status for CYCLE_TIME_OKSTATUS time while(millis() - startedAt < CYCLE_TIME_OKSTATUS * 1000) { //We are going to check CYCLE_RATE_OKSTATUS fast if(millis() - cycle_time > CYCLE_RATE_OKSTATUS) { // save the last time you Checked cycle_time = millis(); int value = digitalRead(SIREN_SENSE_PIN); if (value != 1) //We are still in an alarm state { alarmOn++; } } } if (alarmOn < 1) { // We don't have any sign that we are still in an alarm status //Send all clear msg to controller //sensor_node.send(msg.set("0")); sensor_node.send(msg.setSensor(CHILD_ID).set("0"), true); // Used to update the node - NOT used for battery check. sensor_node.sendBatteryLevel(random(1, 100) ); Serial.println("All Clear"); return 1; } else { // We are still in an alarm status //The calling function will handle sending NOT CLEAR to controller Serial.println("NOT CLEAR"); return 0; }}
Here a some Pictures:





-
Thanks! i updated it to version 2.0 but it's working perfectly
// Based on Author: Patrick 'Anticimex' Fallberg Interrupt driven binary switch example with dual interrupts // Enable debug prints to serial monitor #define MY_DEBUG // Enable and select radio type attached #define MY_RADIO_NRF24 //#define MY_RADIO_RFM69 //#define MY_REPEATER_FEATURE #define MY_NODE_ID 17 #include <SPI.h> #include <MySensors.h> #define CHILD_ID 1 #define SIREN_SENSE_PIN 3 // Arduino Digital I/O pin for optocoupler for siren unsigned int SLEEP_TIME = 32400; // Sleep time between reads (in seconds) 32400 = 9hrs? long CYCLE_COUNTER = 3; // This is the number of times we want the Audio Counter to reach before triggering a signal to controller. unsigned long CYCLE_INTERVAL = 3; // How long do we want to watch once first detected (in seconds) //Adjust for your smoke detector, you want to pick up the siren signal at least 3 time to help stop false alarms. unsigned long CYCLE_RATE = 90; // How fast do we want to move checking the Pin state in the Status Check (in Millis) Adjust for your smoke detector //Adjust for your smoke detector, you want to pick up the siren signal at least 3 time to help stop false alarms. unsigned long CYCLE_TIME_OKSTATUS = 8; // How long do we want to watch for "all clear" once we have confirmed an Alarm (in seconds) unsigned long CYCLE_RATE_OKSTATUS = 500; // How fast do we want to move checking the Pin state when checking for an OK status (in Millis) int oldValue=1; int value=0; //MySensors sensor_node; MyMessage msg(CHILD_ID, V_TRIPPED); void setup() { // Setup the Siren Pin HIGH pinMode(SIREN_SENSE_PIN, INPUT_PULLUP); } void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo("Washer End Cycle", "1.1"); present(CHILD_ID, S_SMOKE); //Send the state -- Always send Alarm state on power up. send(msg.setSensor(CHILD_ID).set("1"), true); } // Loop will iterate on changes on the BUTTON_PINs void loop() { // Check to see if we have a alarm. I always want to check even if we are coming out of sleep for heartbeat. AlarmStatus(); // Sleep until we get a audio power hit on the optocoupler or 9hrs sleep(SIREN_SENSE_PIN-2,FALLING, SLEEP_TIME * 1000UL); } void AlarmStatus() { // We will check the status now, this could be called by an interrupt or heartbeat int siren_audio_count =0; long cycle_time =0; unsigned long startedAt = millis(); Serial.println("Status Check"); //Read the Pin value = digitalRead(SIREN_SENSE_PIN); // If Pin return a 0 (LOW), then we have a Alarm Condition if (value != 1) { //We are only going to check for status for CYCLE_INTERVAL time I think this should help stabilize Siren Sensing while(millis() - startedAt < CYCLE_INTERVAL * 1000) { //We are going to check CYCLE_RATE fast if(millis() - cycle_time > CYCLE_RATE ) { // save the last time you Checked cycle_time = millis(); //We will count each time SIREN_SENSE_PIN is 0 (Alarm - LOW) for the above time and at the above rate. value = digitalRead(SIREN_SENSE_PIN); if (value != 1) { siren_audio_count++; Serial.print("Audio Count: "); Serial.println(siren_audio_count); } } } // Eval siren audio hit count against our limit. If we are => then CYCLE_COUNTER then lets start a loop for "All Clear" reset // If we continue to return an audio power hit, then we will continue to send to the controller. if (siren_audio_count>=CYCLE_COUNTER) { Serial.println("Alarm Detected"); do { //update gateway with bad news. //sensor_node.send(msg.set("1")); send(msg.setSensor(CHILD_ID).set("1"), true); Serial.println("Alarm Detected Sent to gateway"); } while (IsAlarmAllClear()!=1); } } //Pin returned a 1 (High) so there is no alarm. else { IsAlarmAllClear(); } } int IsAlarmAllClear() // We are looking for an gap in time that we no longer see an audio power hit to the optocoupler. { int alarmOn =0; long cycle_time =0; unsigned long startedAt = millis(); //We are only going to check for status for CYCLE_TIME_OKSTATUS time while(millis() - startedAt < CYCLE_TIME_OKSTATUS * 1000) { //We are going to check CYCLE_RATE_OKSTATUS fast if(millis() - cycle_time > CYCLE_RATE_OKSTATUS) { // save the last time you Checked cycle_time = millis(); int value = digitalRead(SIREN_SENSE_PIN); if (value != 1) //We are still in an alarm state { alarmOn++; } } } if (alarmOn < 1) { // We don't have any sign that we are still in an alarm status //Send all clear msg to controller //sensor_node.send(msg.set("0")); send(msg.setSensor(CHILD_ID).set("0"), true); // Used to update the node - NOT used for battery check. sendBatteryLevel(random(1, 100) ); Serial.println("All Clear"); return 1; } else { // We are still in an alarm status //The calling function will handle sending NOT CLEAR to controller Serial.println("NOT CLEAR"); return 0; } }
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login