Hi all, been googling my butt off and tinkering with my code a bunch but I have run into some problems. This devices is based off a project on MySensors and I have posted in that forum. However the more digging I do the more I think the problem is related to something I must not understand about the Mega, so I'm posting here.
My problem is that I can't get the anologWrite method of PWM working on my project.
#define MY_DEBUG
#define MY_RADIO_NRF24
#define MY_NODE_ID 22
#define SN "Dimmable RGBW Led strip"
#define SV "v1.0"
#define MY_RF24_CE_PIN 49 //atmega 2560 code
#define MY_RF24_CS_PIN 53 //atmega 2560 code
#include <MySensors.h>
#include <SPI.h>
// Arduino pin attached to MOSFET Gate pin
#define LED_RED_PIN 6
#define LED_GREEN_PIN 5
#define LED_BLUE_PIN 7
#define LED_WHITE_PIN 8
// CHILD ID's
#define CHILD_ID_RED 1
#define CHILD_ID_GREEN 2
#define CHILD_ID_BLUE 3
#define CHILD_ID_WHITE 4
// Bunch of dimmer values
#define FADE_DELAY 10 // MS delay, IE how long in between each dim step.
int RequestedColor = 0; // Variable for incoming message color
static int16_t currentLevelWhite = 0; // Current dim level...
static int16_t currentLevelRed = 0;
static int16_t currentLevelGreen = 0;
static int16_t currentLevelBlue = 0;
// Define message name and type to send sensor info
MyMessage RedStatus(CHILD_ID_RED, V_DIMMER);
MyMessage GreenStatus(CHILD_ID_GREEN, V_DIMMER);
MyMessage BlueStatus(CHILD_ID_BLUE, V_DIMMER);
MyMessage WhiteStatus(CHILD_ID_WHITE, V_DIMMER);
void setup()
{
pinMode( LED_RED_PIN, OUTPUT );
pinMode( LED_GREEN_PIN, OUTPUT );
pinMode( LED_BLUE_PIN, OUTPUT );
pinMode( LED_WHITE_PIN, OUTPUT );
request( CHILD_ID_RED, V_DIMMER );
request( CHILD_ID_GREEN, V_DIMMER );
request( CHILD_ID_BLUE, V_DIMMER );
request( CHILD_ID_WHITE, V_DIMMER );
}
void presentation()
{
present( CHILD_ID_RED, V_DIMMER );
present( CHILD_ID_GREEN, V_DIMMER );
present( CHILD_ID_BLUE, V_DIMMER );
present( CHILD_ID_WHITE, V_DIMMER );
sendSketchInfo(SN, SV);
}
void loop()
{
}
void receive(const MyMessage &message)
{
if (message.type == V_LIGHT || message.type == V_DIMMER) {
Serial.print("Which sensor did we get a message for? : ");
Serial.println(message.sensor);
RequestedColor = (message.sensor);
// 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;
if(RequestedColor == CHILD_ID_WHITE) {
Serial.print( "Changing White level to " );
Serial.print( requestedLevel );
Serial.print( ", from " );
Serial.println( currentLevelWhite );
fadeToLevelWhite( requestedLevel );
}else if(RequestedColor == CHILD_ID_RED) {
Serial.print( "Changing Red level to " );
Serial.print( requestedLevel );
Serial.print( ", from " );
Serial.println( currentLevelRed );
fadeToLevelRed( requestedLevel );
}else if(RequestedColor == CHILD_ID_GREEN) {
Serial.print( "Changing Green level to " );
Serial.print( requestedLevel );
Serial.print( ", from " );
Serial.println( currentLevelGreen );
fadeToLevelGreen( requestedLevel );
}else if(RequestedColor == CHILD_ID_BLUE) {
Serial.print( "Changing Blue level to " );
Serial.print( requestedLevel );
Serial.print( ", from " );
Serial.println( currentLevelBlue );
fadeToLevelBlue( requestedLevel );
}
// Inform the gateway of the current DimmableLED's SwitchPower1 and LoadLevelStatus value...
// send(lightMsg.set(currentLevel > 0));
// hek comment: Is this really nessesary?
// send( dimmerMsg.set(currentLevel) );
}
}
/***
* This method provides a graceful fade up/down effect
*/
void fadeToLevelRed( int toLevel ) {
int delta = ( toLevel - currentLevelRed ) < 0 ? -1 : 1;
while ( currentLevelRed != toLevel ) {
currentLevelRed += delta;
analogWrite( LED_RED_PIN, (int)(currentLevelRed / 100. * 255) );
Serial.println(currentLevelRed);
delay( FADE_DELAY );
}
}
void fadeToLevelGreen( int toLevel ) {
int delta = ( toLevel - currentLevelGreen ) < 0 ? -1 : 1;
while ( currentLevelGreen != toLevel ) {
currentLevelGreen += delta;
analogWrite( LED_GREEN_PIN, (int)(currentLevelGreen / 100. * 255) );
delay( FADE_DELAY );
}
}
void fadeToLevelBlue( int toLevel ) {
int delta = ( toLevel - currentLevelBlue ) < 0 ? -1 : 1;
while ( currentLevelBlue != toLevel ) {
currentLevelBlue += delta;
analogWrite( LED_BLUE_PIN, (int)(currentLevelBlue / 100. * 255) );
delay( FADE_DELAY );
}
}
void fadeToLevelWhite( int toLevel ) {
int delta = ( toLevel - currentLevelWhite ) < 0 ? -1 : 1;
while ( currentLevelWhite != toLevel ) {
currentLevelWhite += delta;
analogWrite( LED_WHITE_PIN, (int)(currentLevelWhite / 100. * 255) );
delay( FADE_DELAY );
}
}
In the code above everything works as expected (by that I mean that the radio communicates, which I think uses a PWM pin) with the exception that with a meter, and with the led strip attaced, I only get 0v or 5v on the pin and the LEDs are only in an on or off state.
void setup() {
pinMode (8, OUTPUT);
pinMode (7, OUTPUT);
pinMode (6, OUTPUT);
pinMode (5, OUTPUT);
digitalWrite(8, LOW);
digitalWrite(7, LOW);
digitalWrite(6, LOW);
digitalWrite(5, LOW);
}
void loop() {
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
delayMicroseconds(1);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
delayMicroseconds(5000);
}
When I use the code above I can change all 4 LED color dim levels by manipulating the length of the delays.
void loop () {
analogWrite(8, 0);
delay(3000);
analogWrite(8, 127);
delay(3000);
analogWrite(8, 255);
delay(3000);
}
This code gives me 6 seconds of OFF and 3 seconds of ON, I know I am doing something silly, any help out there?
Thanks,
Sean