Поддерживаю. Делитесь наработками сразу.Ivan писал(а):Кому интересно, нарисую схему и скетч.
![Smile :)](./images/smilies/icon_e_smile.gif)
Поддерживаю. Делитесь наработками сразу.Ivan писал(а):Кому интересно, нарисую схему и скетч.
Код: Выделить всё
/***
* 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 using PWM and based Henrik Ekblad
* <henrik.ekblad@gmail.com> Vera Arduino Sensor project.
* Developed by Bruce Lacey, inspired by Hek's MySensor's example sketches.
*
* The circuit uses a MOSFET for Pulse-Wave-Modulation to dim the attached LED or LED strip.
* The MOSFET Gate pin is connected to Arduino pin 3 (LED_PIN), the MOSFET Drain pin is connected
* to the LED negative terminal and the MOSFET Source pin is connected to ground.
*
* This sketch is extensible to support more than one MOSFET/PWM dimmer per circuit.
*
* REVISION HISTORY
* Version 1.0 - February 15, 2014 - Bruce Lacey
* Version 1.1 - August 13, 2014 - Converted to 1.4 (hek)
*
***/
#define SN "MultiDimmableLED"
#define SV "1.2"
#include <MySensor.h>
#include <SPI.h>
#define LED_BLUE 5 // Arduino pin attached to MOSFET Gate pin
#define LED_RED 6
#define LED_GREEN 7
#define FADE_DELAY 10 // Delay in ms for each percentage fade up/down (10ms = 1s full-range dim)
MySensor gw(9,10);
static int currentLevel_B = 0;
static int currentLevel_R = 0;
static int currentLevel_G = 0;
// Current dim level...
MyMessage dimmerMsg_B(1, V_DIMMER);
MyMessage lightMsg_B(1, V_LIGHT);
MyMessage dimmerMsg_R(2, V_DIMMER);
MyMessage lightMsg_R(2, V_LIGHT);
MyMessage dimmerMsg_G(3, V_DIMMER);
MyMessage lightMsg_G(3, V_LIGHT);
/***
* Dimmable LED initialization method
*/
void setup()
{
Serial.println( SN );
gw.begin( incomingMessage_B );
gw.begin( incomingMessage_R );
gw.begin( incomingMessage_G );
// Register the LED Dimmable Light with the gateway
gw.present( 1, S_DIMMER );
gw.present( 2, S_DIMMER );
gw.present( 3, S_DIMMER );
gw.sendSketchInfo(SN, SV);
// Pull the gateway's current dim level - restore light level upon sendor node power-up
gw.request( 1, V_DIMMER );
gw.request( 2, V_DIMMER );
gw.request( 3, V_DIMMER );
}
/***
* Dimmable LED main processing loop
*/
void loop()
{
gw.process();
}
void incomingMessage_B(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_B = atoi( message.data );
// Adjust incoming level if this is a V_LIGHT variable update [0 == off, 1 == on]
requestedLevel_B *= ( message.type == V_LIGHT ? 100 : 1 );
// Clip incoming level to valid range of 0 to 100
requestedLevel_B = requestedLevel_B > 100 ? 100 : requestedLevel_B;
requestedLevel_B = requestedLevel_B < 0 ? 0 : requestedLevel_B;
fadeToLevel_B( requestedLevel_B );
// Inform the gateway of the current DimmableLED's SwitchPower1 and LoadLevelStatus value...
gw.send(lightMsg_B.set(currentLevel_B > 0 ? 1 : 0));
// hek comment: Is this really nessesary?
gw.send(dimmerMsg_B.set(currentLevel_B));
}
}
void incomingMessage_R(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_R = atoi( message.data );
// Adjust incoming level if this is a V_LIGHT variable update [0 == off, 1 == on]
requestedLevel_R *= ( message.type == V_LIGHT ? 100 : 1 );
// Clip incoming level to valid range of 0 to 100
requestedLevel_R = requestedLevel_R > 100 ? 100 : requestedLevel_R;
requestedLevel_R = requestedLevel_R < 0 ? 0 : requestedLevel_R;
fadeToLevel_R( requestedLevel_R );
// Inform the gateway of the current DimmableLED's SwitchPower1 and LoadLevelStatus value...
gw.send(lightMsg_R.set(currentLevel_R > 0 ? 1 : 0));
// hek comment: Is this really nessesary?
gw.send(dimmerMsg_R.set(currentLevel_R));
}
}
void incomingMessage_G(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_G = atoi( message.data );
// Adjust incoming level if this is a V_LIGHT variable update [0 == off, 1 == on]
requestedLevel_G *= ( message.type == V_LIGHT ? 100 : 1 );
// Clip incoming level to valid range of 0 to 100
requestedLevel_G = requestedLevel_G > 100 ? 100 : requestedLevel_G;
requestedLevel_G = requestedLevel_G < 0 ? 0 : requestedLevel_G;
fadeToLevel_G( requestedLevel_G );
// Inform the gateway of the current DimmableLED's SwitchPower1 and LoadLevelStatus value...
gw.send(lightMsg_G.set(currentLevel_G > 0 ? 1 : 0));
// hek comment: Is this really nessesary?
gw.send(dimmerMsg_G.set(currentLevel_G));
}
}
/***
* This method provides a graceful fade up/down effect
*/
void fadeToLevel_B( int toLevel_B ) {
int delta = ( toLevel_B - currentLevel_B ) < 0 ? -1 : 1;
while ( currentLevel_B != toLevel_B ) {
currentLevel_B += delta;
analogWrite( LED_BLUE, (int)(currentLevel_B / 100. * 255) );
delay( FADE_DELAY );
}
}
/***
* This method provides a graceful fade up/down effect
*/
void fadeToLevel_R( int toLevel_R ) {
int delta = ( toLevel_R - currentLevel_R ) < 0 ? -1 : 1;
while ( currentLevel_R != toLevel_R ) {
currentLevel_R += delta;
analogWrite( LED_RED, (int) (currentLevel_R / 100. * 255) );
delay( FADE_DELAY );
}
}
void fadeToLevel_G( int toLevel_G ) {
int delta = ( toLevel_G - currentLevel_G ) < 0 ? -1 : 1;
while ( currentLevel_G != toLevel_G ) {
currentLevel_G += delta;
analogWrite( LED_GREEN, (int)(currentLevel_G / 100. * 255) );
delay( FADE_DELAY );
}
}