Dimmer issues
-
I'm running a sketch based on the dimmer example on a pro-mini 5v. It works ok except that when switching on and off it ignores the set percentage and jumps to 100%. This also happens when using a blocky script. I wanted to have the light set at 25% after sunset but then when motion is detected from the motion sensor to set the light level to 100% for 1 min and then return to the previous light level. If i have the light off it returns to zero ok but would prefer it to run at 25% level after sunset.
Anyone had any similar experiences?
/** * The MySensors Arduino library handles the wireless radio link and protocol * between your home built sensors/actuators and HA controller of choice. * The sensors forms a self healing radio network with optional repeaters. Each * repeater and gateway builds a routing tables in EEPROM which keeps track of the * network topology allowing messages to be routed to nodes. * * Created by Henrik Ekblad <henrik.ekblad@mysensors.org> * Copyright (C) 2013-2015 Sensnology AB * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors * * Documentation: http://www.mysensors.org * Support Forum: http://forum.mysensors.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * ******************************* * * DESCRIPTION * This sketch provides a Dimmable LED Light along with Temp/Humidity/voltage sensing as well as Motion sensing. */ #define SN "SecurityLED" #define SV "1.2" #define CHILD_ID_HUM 0 #define CHILD_ID_TEMP 1 #define CHILD_ID_VOLTAGE 2 #define CHILD_ID_PIR 3 #define HUMIDITY_SENSOR_DIGITAL_PIN 6 #define DIGITAL_INPUT_SENSOR 3 // The digital input you attached your motion sensor. #define INTERRUPT DIGITAL_INPUT_SENSOR-2 // Usually the interrupt = pin -2 (on uno/nano anyway) #include <MySensor.h> #include <SPI.h> #include <DHT.h> #include <SimpleTimer.h> // the timer object SimpleTimer timer; #define LED_PIN 5 // Arduino pin attached to MOSFET Gate pin //#define int FADE_DELAY=50; // Delay in ms for each percentage fade up/down (10ms = 1s full-range dim) MySensor gw; DHT dht; float lastTemp; boolean metric = true; float lastHum; float lastVolt; int oldBatteryPcnt = 0; int analogInput = A0; float vout = 0.0; float vin = 0.0; int value = 0; float R1 = 1000000.0; float R2 = 454500.0; boolean sensordelay; static int currentLevel = 0; // Current dim level... MyMessage dimmerMsg(0, V_DIMMER); MyMessage lightMsg(0, V_LIGHT); MyMessage msgHum(CHILD_ID_HUM, V_HUM); MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP); MyMessage msgVolt(CHILD_ID_VOLTAGE, V_VOLTAGE); MyMessage msg(CHILD_ID_PIR, V_TRIPPED); /*** * Dimmable LED initialization method */ void setup() { Serial.println( SN ); gw.begin( incomingMessage ); dht.setup(HUMIDITY_SENSOR_DIGITAL_PIN); pinMode(DIGITAL_INPUT_SENSOR, INPUT); // sets the motion sensor digital pin as input // Register the LED Dimmable Light with the gateway gw.present( 0, S_DIMMER ); gw.sendSketchInfo(SN, SV); // Pull the gateway's current dim level - restore light level upon sendor node power-up //gw.request( 0, V_DIMMER ); gw.present(CHILD_ID_HUM, S_HUM); gw.present(CHILD_ID_TEMP, S_TEMP); gw.present(CHILD_ID_VOLTAGE, V_VOLTAGE); gw.present(CHILD_ID_PIR, S_MOTION); pinMode(analogInput, INPUT); timer.setInterval(120000,readTempHum); // Send Temp every 2 mins timer.setInterval(300000,measureBattery); // Send voltage every 5 mins fadeToLevel( 0 ); readTempHum(); measureBattery(); sensordelay=0; } void ResetTripped(){ sensordelay=0; FADE_DELAY=50; } /*** * Main processing loop */ void loop() { gw.process(); // Read digital motion value boolean tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH; if (tripped ==1 && sensordelay==0) { FADE_DELAY=0; Serial.print("Security Sensor state : "); Serial.println(tripped); gw.send(msg.set(tripped?"1":"0")); // Send tripped value to gw tripped=0; gw.send(msg.set(tripped?"1":"0")); // Send tripped value to gw sensordelay=1; timer.setTimeout(10000,ResetTripped); } timer.run(); } void incomingMessage(const MyMessage &message) { if (message.type == V_LIGHT || message.type == V_DIMMER) { // Retrieve the power or dim level from the incoming request message int requestedLevel = atoi( message.data ); // Adjust incoming level if this is a V_LIGHT variable update [0 == off, 1 == on] requestedLevel *= ( message.type == V_LIGHT ? 100 : 1 ); // Clip incoming level to valid range of 0 to 100 requestedLevel = requestedLevel > 100 ? 100 : requestedLevel; requestedLevel = requestedLevel < 0 ? 0 : requestedLevel; Serial.print( "Changing level to " ); Serial.print( requestedLevel ); Serial.print( ", from " ); Serial.println( currentLevel ); fadeToLevel( requestedLevel ); // Inform the gateway of the current DimmableLED's SwitchPower1 and LoadLevelStatus value... gw.send(lightMsg.set(currentLevel > 0 ? 1 : 0)); // hek comment: Is this really nessesary? gw.send( dimmerMsg.set(currentLevel) ); } } /*** * This method provides a graceful fade up/down effect */ void fadeToLevel( int toLevel ) { int delta = ( toLevel - currentLevel ) < 0 ? -1 : 1; while ( currentLevel != toLevel ) { currentLevel += delta; analogWrite( LED_PIN, (int)(currentLevel / 100. * 255) ); delay( FADE_DELAY ); } } void readTempHum() { delay(dht.getMinimumSamplingPeriod()); float temperature = dht.getTemperature(); if (isnan(temperature)) { Serial.println("Failed reading temperature from DHT"); } else if (temperature != lastTemp) { lastTemp = temperature; if (!metric) { temperature = dht.toFahrenheit(temperature); } gw.send(msgTemp.set(temperature, 1)); Serial.print("T: "); Serial.println(temperature); } float humidity = dht.getHumidity(); if (isnan(humidity)) { Serial.println("Failed reading humidity from DHT"); } else if (humidity != lastHum) { lastHum = humidity; gw.send(msgHum.set(humidity, 1)); Serial.print("H: "); Serial.println(humidity); } } void measureBattery() { // read the value at analog input value = analogRead(analogInput); vout = (value * 5.0) / 1024.0; // see text vin = vout / (R2/(R1+R2)); int batteryPcnt = value / 10; #ifdef DEBUG Serial.print("Battery Voltage: "); Serial.print(vin); Serial.println(" V"); Serial.print("Battery percent: "); Serial.print(batteryPcnt); Serial.println(" %"); #endif if (oldBatteryPcnt != batteryPcnt) { // Power up radio after sleep gw.sendBatteryLevel(batteryPcnt); gw.send(msgVolt.set(vin, 1)); oldBatteryPcnt = batteryPcnt; } }
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