Dear,
I m writing a program for stair lighting
The problem is that it's not running smooth.. A specially on pin 5 en 6. I think it because of..
Notes and Warnings
The PWM outputs generated on pins 5 and 6 will have higher-than-expected duty cycles. This is because of interactions with the millis() and delay() functions, which share the same internal timer used to generate those PWM outputs. This will be noticed mostly on low duty-cycle settings (e.g. 0 - 10) and may result in a value of 0 not fully turning off the output on pins 5 and 6.
I m working with 3 74HC595D chips and looking for day's to equalize the speed of brighting up the leds for all pins . Does anybody know how to solve this problem with an example please?
#define F_CPU 16000000UL // 4 MHz //1000000UL // 1 MHz
//#define F_CPU 14.7456E6
#include <util/delay.h>
int calibrationTime = 30;
#define SHIFTPWM_NOSPI
const int ShiftPWM_dataPin = 6; // Do not change!!!
const int ShiftPWM_clockPin = 7; // Do not change!!!
const int ShiftPWM_latchPin = 8; // Do not change!!!
const int outputEnablePin = 3;
byte leds = 0; // Variable to hold the pattern of which LEDs are currently turned on or off
#include <ShiftPWM.h>//moet achter de pins staan
const bool ShiftPWM_invertOutputs = false;
const bool ShiftPWM_balanceLoad = false;//true;// false;
unsigned char pwmFrequency = 75;//75; // These values affect the load of ShiftPWM
unsigned int numRegisters = 3; // Number of shift registers Do not change!!!
unsigned int numOutputs = numRegisters * 8;
unsigned int numRGBLeds = numRegisters * 8 / 3;
unsigned char maxBrightness = 81; // Here you set the number of brightness levels. Adjust(0-255)!!
int numberOfstairs = 9; // Setup Number of Your stairs. Adjust up to 24 !!!!
byte faidoutSpeed = 8; // Lichten aan snelheid in miliseconden ..let op gaat in 100stappen aan dus wacht niet te lang :-)
byte faidinSpeed = 12;
boolean sensorUpperActive;
boolean sensorBottomActive;
boolean sensorLightDark;
boolean BlnCheckPirSensor;
#define AnalogePinA0 A0
#define AnalogePinA1 A1//upper
#define AnalogePinA2 A2//Bottom
#define AnalogePinA3 A3
#define AnalogePinA4 A4
#define AnalogePinA5 A5//light
#define AnalogePinA6 A6
#define AnalogePinA7 A7
#define DigitalePinD2 2
#define DigitalePinD3 3
#define DigitalePinD4 4
#define DigitalePinD5 5
#define DigitalePinD6 6
#define DigitalePinD7 7
#define DigitalePinD8 8
#define DigitalePinD9 9
#define DigitalePinD10 10
#define DigitalePinD11 11
#define DigitalePinD12 12
#define DigitalePinD13 13
void setup()
{
//Serial.begin(9600);
////Serial.begin(115200);
////Serial.begin(115200);
////Serial.setTimeout(0);
//while (!Serial);
//Serial.println("Debuging begint");
pinMode(LED_BUILTIN, OUTPUT); //Blinking led on board //voor led on shield te laten blinken als het programma 1keer geladen is
ShiftPWM.SetAmountOfRegisters(numRegisters);
ShiftPWM.Start(pwmFrequency, maxBrightness);
//hier kunnen we kiezen tussen input en output
//dit zijn de analoge pins op de nano chip
//pinMode(AnalogepinA0, INPUT);
pinMode(AnalogePinA1, INPUT);
pinMode(AnalogePinA2, INPUT);
//pinMode(AnalogepinA3, INPUT); // To trigger an interrupt on nano
//pinMode(AnalogepinA4, INPUT);
pinMode(AnalogePinA5, INPUT);
//pinMode(AnalogepinA6, INPUT);
//pinMode(AnalogepinA7, INPUT);
//3, 5, 6, 9, 11 Provides 8 - bit PWM output. for nano These pins provide an 8-bit PWM output by using analogWrite() function.
pinMode(DigitalePinD2, OUTPUT); // To trigger an interrupt on nano
pinMode(DigitalePinD3, OUTPUT); //pwm // To trigger an interrupt on nano
pinMode(DigitalePinD4, OUTPUT);
pinMode(DigitalePinD5, OUTPUT); //pwm
pinMode(DigitalePinD6, OUTPUT); //pwm
pinMode(DigitalePinD7, OUTPUT);
pinMode(DigitalePinD8, OUTPUT);
pinMode(DigitalePinD9, OUTPUT); //pwm
pinMode(DigitalePinD10, OUTPUT);
pinMode(DigitalePinD11, OUTPUT); //pwm
pinMode(DigitalePinD12, OUTPUT);
pinMode(DigitalePinD13, OUTPUT);
}
void loop()
{
MainSub();
}
void MainSub()
{
sensorBottomActive = false;
sensorUpperActive = false;
sensorLightDark = false;
sensorBottomActive = CheckPirSensorActive(AnalogePinA2);
sensorLightDark = CheckPirSensorActive(AnalogePinA5);
sensorUpperActive = CheckPirSensorActive(AnalogePinA1);
if (sensorLightDark == true) //pin is bij donker is hij hoog //pin is bij veel licht laag
{
if (sensorBottomActive == false && sensorUpperActive == false) //noodverlichting
{
EmergencyLights();
}
else
{
if (sensorBottomActive == true && sensorUpperActive == false)
{
LedsOnOffFromDown();
}
}
}
if (sensorLightDark == false)
{
LedsAllOff();
}
}
void EmergencyLights()
{
SingleLedAan(numberOfstairs, maxBrightness);
SingleLedAan(numberOfstairs - 1, maxBrightness);
for (int i = 3; i < (numberOfstairs - 3); i++)//Doof leds ertussen die nog branden
{
SingleLedUit(i);
}
SingleLedAan(1, maxBrightness);
SingleLedAan(2, maxBrightness);
}
void LedsOnOffFromDown()
{
for (int i = 3; i <= numberOfstairs; i++)
{
SingleLedUit(i);
}
LedsFromDownOn();
LedsFromDownOff(); //Stairs on from down to up
}
void LedsFromDownOn()
{
for (int i = 1; i <= numberOfstairs; i++)//Stairs on from down to up
{
SingleLedDimmingOn(i);
}
}
void LedsFromDownOff()
{
for (int i = 1; i <= numberOfstairs - 2; i++)
{
sensorUpperActive = CheckPirSensorActive(AnalogePinA1);
sensorBottomActive = CheckPirSensorActive(AnalogePinA2);
if (sensorBottomActive == true || sensorUpperActive == true)
{
break;
}
SingleLedDimmingOff(i);
}
}
void SingleLedDimmingOn(int LedOnPin)
{
for (int a = 0; a < maxBrightness; a++)
{
ShiftPWM.SetOne(LedOnPin, a); //
delayMicroseconds(faidoutSpeed);
}
}
void SingleLedDimmingOff(int LedOffPin)
{
//Serial.println("Single led OFF onethird");
for (int a = maxBrightness; a >= 0; a--)
{
ShiftPWM.SetOne(LedOffPin, a);
//analogWrite(i + 2, a);
if (a == 0)
{
//Serial.println("led off");//+i);
ShiftPWM.SetOne(LedOffPin, 0);
//analogWrite(i + 2, a);
}
//delay(faidinSpeed);
//waitTime = faidinSpeed;
//wait();
//reset();
//delay(faidinSpeed);
//Fade down
//for (int i = 255; i>0; i--){
// OCR0A = i; //Set new duty cycle value
// _delay_ms(50); //delay a litle bit
//}
//_delay_ms(faidinSpeed);
//my_delay_ms(faidinSpeed);
delayMicroseconds(faidinSpeed);
}
//return true;
}
void SingleLedAan(int LedOnPin, int Brightness)
{
ShiftPWM.SetOne(LedOnPin, Brightness); //
}
void SingleLedUit(int LedOnPin)
{
ShiftPWM.SetOne(LedOnPin, 0);
}
boolean CheckPirSensorActive(uint8_t BlnCheckPirSensorPin)
{
boolean BlnCheckPirSensor = false;
int IntPirValue = analogRead(BlnCheckPirSensorPin);
if (IntPirValue >= 450) {
BlnCheckPirSensor = true;
}
else
{
BlnCheckPirSensor = false;
}
return BlnCheckPirSensor;
}
void LedsAllOff() {
for (int i = numberOfstairs; i >= 1; i--){
ShiftPWM.SetOne(i, 0);
}
}