Здравейте :)
Колега от форума ми изработи един контролер базиран на Arduino UNO R3 .За съжаление няколко момента не са ми ясни :
1)идеята е да се димират част от светодиодите , като по този начин се имитира изгрев/залез. В програмата това се прави от тези редове->
if((hour()==12)&&(minute()>=0)&&(minute()<=29))
{b=b+1;} този ред указва че от 12:00 до 12:29 интензитета се увеличава до 100%
if((hour()==22)&&(minute()>=30)&&(minute()<=59))
{w1=w1-1;} тук аналогично - изгасяне
Не ми е ясно как мога да направя така че при намаляне на интензитета , да се намали до 30% примерно и да остане така цяла нощ (до настъпване на "изгрева"), на 30% интензитет
2) днес направих опит - 4 диода ги свързах последователно т.е. на всеки диод се пада по 12v / 4= 3V (захранването ми е на 12V , константно напрежение) . Трябва ли в този кръг да включа някакъв резистор (как да намеря стойността му) който да ограничава тока през диодите (700 mA в случая)
Благодаря предварително на всеки решил да помогне със съвет :)
Здравей
Да си призная първо не съм се занимавал с Ардуино,но мисля,че на само тези редове определят увеличаването и намалянето на светенето.Мисля,че те определят само времето за това."b" и "w" са променливи някъде трябва да са указани какви стойности да заемат.Педполагам за "b" е указано някъде "255",а"w" - "0".Потърси из програмата.
Какво е захранването ,което ползваш на какъв ток е?Ако дава точно 12V(а не само да го пише),може да минеш и без резистори.Какви са диодите бели,червени,сини?
Mоже да опиташ например с :
if((hour()==22)&&(minute()>=30)&&(minute()<=49))
{w1=w1-1;}
Всъщност има 2 линии които се управляват с контроера .Единия кръг са сини (свързвам ги на 3 кръга по 4 диода всеки):
3W Ultra Violet UV 420nm-425nm LED Emitter (DC Forward Voltage: Typical: 3.6V Max: 3.8V//DC Forward Current: 700//
А другите бели (2 кръга по 5 диода понеже ги дават за 2.8V):
Cree XP-G2 XPG2 Neutra White LED 4000K-4250K (Maximum drive current (A) 1.5//Typical forward voltage @ 0.35 A (V) - 2.8//Maximum power (W)-4.9//Light outputUp to 488 lm @ 4.7 W, 85°CLight output
Ето цялата програма, ако някой може да се ориентира :
#include <Time.h>
#include <LiquidCrystal.h>
#include <math.h>
LiquidCrystal lcd (13, 12, 11, 10, 9, 8);
int b;
int w1;
int w2;
int ch1=3;
int ch2=5;
byte gradus[8] = {B01000, B10100,B01000, B00000,B00000, B00000,B00000, B00000};
byte kapka[8] = {B00000, B00100,B01110, B10111,B11111, B11111,B01110, B00000};
void setup()
{ setTime(11,59,50,22,2,12);
lcd.begin(2,16);
lcd.clear();
pinMode(2,OUTPUT); // изход за звукова сигнализация
pinMode(3,OUTPUT); // изход за осветление кръг 1
pinMode(4,OUTPUT); // изход за реле
pinMode(5,OUTPUT); // изход за осветление кръг 2
b=0;
w1=0;
w2=0;
}
void loop()
{ lcd.clear();
lcd.setCursor(4,0);
printDigits();
lcd.createChar(6,kapka);
lcd.setCursor(4,1);
lcd.write(6);
lcd.createChar(7,gradus);
lcd.setCursor(11,1);
lcd.write(7);
printTemp();
if((hour()==12)&&(minute()>=0)&&(minute()<=29))
{b=b+1;}
if((hour()==12)&&(minute()>=30)&&(minute()<=59))
{w1=w1+1;}
if((hour()==22)&&(minute()>=30)&&(minute()<=59))
{w1=w1-1;}
if((hour()==22)&&(minute()>=0)&&(minute()<=29))
{b=b-1;}
analogWrite(ch1,0.06*b+0.00004537038*b*b);
analogWrite(ch2,0.06*w1+0.00004537038*w1*w1);
if(analogRead(2)==1023)
{setTime(hour(),minute()+1,second(),day(),month(),12);}
if(analogRead(3)==1023)
{setTime(hour()+1,minute(),second(),day(),month(),12);}
if((analogRead(4)==1023)&&(analogRead(0)<=100))
{digitalWrite(4, HIGH);}
else{digitalWrite(4, LOW);}
delay(1000);
}
void printDigits()
{ if (hour() < 10)
{lcd.print("0");}
lcd.print(hour()/1);
lcd.print(":");
if (minute() < 10)
{lcd.print("0");}
lcd.print(minute()/1);
lcd.print(":");
if (second() < 10)
{lcd.print("0");}
lcd.print(second()/1);
}
double Thermister(int RawADC)
{double Temp;
Temp = log(((10240000/RawADC) - 10000));
Temp = 1 / (0.001129148 + (0.000234125 * Temp) + (0.0000000876741 * Temp * Temp * Temp));
Temp = Temp - 273.15;
return Temp;
}
void printTemp(void)
{ double fTemp;
double temp = Thermister(analogRead(1));
lcd.setCursor(6,1);
lcd.print(temp);
}
Edit: "Mоже да опиташ например с :
if((hour()==22)&&(minute()>=30)&&(minute()<=49))
{w1=w1-1;} "
По този начин намалявам периода за който става прехода при загасяне , а целта е да задам до каква стойност да е това димиране т.е. да не падат до нула ,а до някаква стойност .
b=0;
w1=0;
Едното е за единия канал другото за другия.Задай други числа например 60.
П.С.
analogWrite(ch1,0.06*b+0.00004537038*b*b);
analogWrite(ch2,0.06*w1+0.00004537038*w1*w1);
if((hour()==22)&&(minute()>=30)&&(minute()<=59))
{w1=w1-1;}
if((hour()==22)&&(minute()>=0)&&(minute()<=29))
{b=b-1;}
става
if((hour()==22)&&(minute()>=30)&&(minute()<=59)){
if(w1 > 30%){
w1=w1-1;
}
}
if((hour()==22)&&(minute()>=0)&&(minute()<=29)){
if(b > 30%){
b=b-1;
}
}
с 30% съм означил фигуративно, защото не ми се занимава да определя каква е реалната стойност, която отговаря на 30%.
Може да пробваш и с :
void setup()
{ setTime(11,59,50,22,2,12);
lcd.begin(2,16);
lcd.clear();
pinMode(2,OUTPUT); // изход за звукова сигнализация
pinMode(3,OUTPUT); // изход за осветление кръг 1
pinMode(4,OUTPUT); // изход за реле
pinMode(5,OUTPUT); // изход за осветление кръг 2
b=0;
w1=29*60*0.3;
w2=0;
}
Благодаря на всички за идеите :) . В момента изникнаха доста ангажименти и нямам време за проби , но като остане време ще пробвам и ще пиша в темата.