Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. My Project
  3. 'MySensoring' a GE Washer

'MySensoring' a GE Washer

Scheduled Pinned Locked Moved My Project
5 Posts 4 Posters 4.4k Views 6 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • R Offline
    R Offline
    RJ_Make
    Hero Member
    wrote on last edited by
    #1

    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. 1 Cheap AC/DC converter
    2. 1 Optocoupler
    3. 1 Step up Regulator
    4. 1 Small Proto Board.
    5. 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:

    20150613_091041.jpg

    20150613_091049.jpg

    20150613_091057.jpg

    20150613_091106.jpg

    2015-06-13_11-12-02.png

    RJ_Make

    1 Reply Last reply
    4
    • H Offline
      H Offline
      hek
      Admin
      wrote on last edited by
      #2

      You've been busy this weekend ;)

      R 1 Reply Last reply
      0
      • H hek

        You've been busy this weekend ;)

        R Offline
        R Offline
        RJ_Make
        Hero Member
        wrote on last edited by
        #3

        @hek More like a busy week.. :sweat:

        RJ_Make

        1 Reply Last reply
        0
        • A Offline
          A Offline
          arcidodo
          wrote on last edited by
          #4

          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;
                }    
          }
          
          1 Reply Last reply
          0
          • TmasterT Offline
            TmasterT Offline
            Tmaster
            wrote on last edited by Tmaster
            #5

            why not connect the buzzer signal direct to arduino analog read? optocoupter for a 80cents arduino?

            i'm a arduino fan .Even sometimes don't undestanding how to use it :P

            1 Reply Last reply
            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
            Reply
            • Reply as topic
            Log in to reply
            • Oldest to Newest
            • Newest to Oldest
            • Most Votes


            13

            Online

            12.0k

            Users

            11.2k

            Topics

            113.4k

            Posts


            Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
            • Login

            • Don't have an account? Register

            • Login or register to search.
            • First post
              Last post
            0
            • MySensors
            • OpenHardware.io
            • Categories
            • Recent
            • Tags
            • Popular