• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Problem z obsługą przycisku
#1
Witam
Na wstępie chciałbym zaznaczyć iż jestem nowym użytkownikiem na tym forum, jednocześnie nie mam dużego doświadczenia w programowaniu (jestem samoukiem z YT elektroprzewodnik i elektromaras) jednak mimo to udało mi się stworzyć kilka projektów. Niestety tym razem walczę ze sterownikiem do oświetlenia led do kuchni sterowanego z pilota od tv. Póki co udało mi się zbudować sterownik włączanie i wyłączanie kanałów z pilota działa, przyciemnianie i rozjaśnianie też działa. Niestety nie daje rady z przyciskiem który ma włączać i wyłączać kanał z ledami pod szafkami (dodatkowe sterowanie jednym kanałem poza pilotem). Problem polega na tym iż fragment kodu obsługi przycisku jest w jakiś sposób pomijany. 
Tutaj wstawiam cały kod.
Kod:
int ir_pin = 2;                        //Sensor pin 1 wired through a 220 ohm resistor                  //"Ready to Recieve" flag, not needed but nice
int debug = 0;                         //Serial connection must be started to debug
int start_bit = 2000;                  //Start bit threshold (Microseconds)
int bin_1 = 1000;                      //Binary 1 threshold (Microseconds)
int bin_0 = 400;                       //Binary 0 threshold (Microseconds)

 
void setup() {

 pinMode(3, OUTPUT);
 pinMode(5,OUTPUT);
 pinMode(6, OUTPUT);
 pinMode(9, OUTPUT);
 pinMode(10, OUTPUT);    
 pinMode(11, OUTPUT);  
 pinMode(12, INPUT);    
 pinMode(ir_pin, INPUT);
}
boolean jeden = 0;
boolean dwa = 0;
boolean trzy = 0;
boolean cztery = 0;
int czas= 200;
int jasnosc=255;
int stare=255;

void loop() {

int key = getIRKey();
int guzik = guzik2();
if (key == 146 & jasnosc <= 255)
{
 jasnosc=jasnosc+50;
 delay(czas);
}
if (key == 146 & jasnosc >= 255)
{
 jasnosc=255;
  delay(czas);
    }
if (key == 147 & jasnosc >= 5)
{
 jasnosc=jasnosc-50;
  delay(czas);
}
if (key == 147 & jasnosc <=5)
{
 jasnosc=5;
  delay(czas);
 }
if (stare == jasnosc)
{  
if (key == 128)
{
 jeden=!jeden;
key = 0;
delay(czas);
}  
if (jeden == 0)
{
analogWrite(3,0);
analogWrite(5,0);
}
if (jeden == 1)
{
analogWrite(3,stare);
analogWrite(5,stare);
}
if (key == 129)
{
 dwa=!dwa;
key = 0;
delay(czas);
}  
if (dwa == 0)
{
analogWrite(6,0);
analogWrite(9,0);
}
if (dwa == 1)
{
analogWrite(6,stare);
analogWrite(9,stare);
}
if (key == 130)
{
 trzy=!trzy;
key = 0;
delay(czas);
}  
if (trzy == 0)
{
analogWrite(10,0);
}
if (trzy == 1)
{
analogWrite(10,stare);
}
if (key == 131)
{
cztery=!cztery;
key = 0;
delay(czas);
}  
if (cztery == 0)
{
analogWrite(11,0);
}
if (cztery == 1)
{
analogWrite(11,stare);
}
}
if (stare != jasnosc)
{  
if (key == 128)
{
jeden=!jeden;
key = 0;
delay(czas);
}  
if (jeden == 0)
{
analogWrite(3,0);
analogWrite(5,0);
}
if (jeden == 1)
{
analogWrite(3,jasnosc);
analogWrite(5,jasnosc);
}
if (key == 129)
{
dwa=!dwa;
key = 0;
delay(czas);
}  
if (dwa == 0)
{
analogWrite(6,0);
analogWrite(9,0);
}
if (dwa == 1)
{
analogWrite(6,jasnosc);
analogWrite(9,jasnosc);
}
if (key == 130)
{
trzy=!trzy;
key = 0;
delay(czas);
}  
if (trzy == 0)
{
analogWrite(10,0);
}
if (trzy == 1)
{
analogWrite(10,jasnosc);
}
if (key == 131)
{
cztery=!cztery;
key = 0;
delay(czas);
}  
if (cztery == 0)
{
analogWrite(11,0);
}
if (cztery == 1)
{
analogWrite(11,jasnosc);
}
}
if (key == 149)
{
 jeden=0;
 dwa=0;
 trzy=0;
cztery=0;
 }
if (key == 165)
{
 jeden=1;
 dwa=1;
 trzy=1;
 cztery=1;
}

}
 
}
int getIRKey() {
 int data[12];
 while(pulseIn(ir_pin, LOW) < 2200) { //Wait for a start bit
 }
 data[0] = pulseIn(ir_pin, LOW);      //Start measuring bits, I only want low pulses
 data[1] = pulseIn(ir_pin, LOW);
 data[2] = pulseIn(ir_pin, LOW);
 data[3] = pulseIn(ir_pin, LOW);
 data[4] = pulseIn(ir_pin, LOW);
 data[5] = pulseIn(ir_pin, LOW);
 data[6] = pulseIn(ir_pin, LOW);
 data[7] = pulseIn(ir_pin, LOW);
 data[8] = pulseIn(ir_pin, LOW);
 data[9] = pulseIn(ir_pin, LOW);
 data[10] = pulseIn(ir_pin, LOW);
 data[11] = pulseIn(ir_pin, LOW);
 for(int i=0;i<11;i++) {              //Parse them      
   if(data[i] > bin_1) {              //is it a 1?
     data[i] = 1;
   }  else {
     if(data[i] > bin_0) {            //is it a 0?
       data[i] = 0;
     }
   }
 }  
 int result = 0;  
 int seed = 1;                                      
 for(int i=0;i<11;i++) {              //Convert bits to integer
   if(data[i] == 1) {
     result += seed;
   }
   seed = seed * 2;
 }
 return result;                       //Return key number
}
Dodam jeszcze to iż fragmen kodu:
int getIRKey() .....
jest to gotowiec z internetu pilota czyta i przypisuje przyciskom wartości niestety przez niego nie działa przcisk
jak wprowadze przróbkę typu 
void loop() {

int key = 0;
//int key = getIRKey();
zamiast
void loop() {


int key = getIRKey();
wtedy przycisk działa niestety nie reaguje we właściwym kodzie 
proszę o pomoc już kilka dni z tym walczę sam i doszedłem do etapu gdzie dalej sam nie dam rady
pozdrawiam 
z góry dzięki za pomoc
 
Odpowiedź
#2
Albo przestań używać delay, zamień to na obsługę czasu z millis(), albo przycisk zrób na przerwaniach zewnętrznych. Sam przycisk zwykle się robi definiując wejście jako INPUT_PULLUP by wymusić stan wysoki bez wciśnięcia i reagować na niski gdy przycisk wciśnięty. Można też na odwrót, można bez pullup, ale wtedy ma być coś dorzucone do pinu - podciąganie sprzętowe do VCC lub GND.
Funkcja while() czeka aż użyjesz pilota w tym miejscu, blokując cały program. Użyj po prostu biblioteki do IR z przerwaniami.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
            witam 
udało mi się uporać z przyciskiem teraz niestety mam inny problem.
W chwili obecnej męcze się z tym, że po zmontowaniu układu wszystko smiga włączanie i wyłączanie kanałów działą
niestety wszystko się wiesza jak zaczynam przyciemniać i rozjaśniać ledy. Ta sama atmega przepięta z układu na plytke śmiga bez problemu niestety w sterowniku pada. połączenia są ok bo włącz wyłącz kanałyjest ok zawiesza się dopiero po zmianie pwm. Niżej wrzucam fotki układu
 
Odpowiedź
#4
Poczytaj trochę i się zastanów czy na pewno połączenia są ok.
http://mikrokontrolery.blogspot.com/2011...pinow.html
http://mikrokontrolery.blogspot.com/2011...olera.html
http://mikrokontrolery.blogspot.com/2011...lerow.html
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#5
(02-06-2019, 20:24)Robson Kerman napisał(a): Poczytaj trochę i się zastanów czy na pewno połączenia są ok.
http://mikrokontrolery.blogspot.com/2011...pinow.html
http://mikrokontrolery.blogspot.com/2011...olera.html
http://mikrokontrolery.blogspot.com/2011...lerow.html

wszystko jest ok. 
na plytce stykowej dziala bez problemu polaczenia w sterowniku sa takie same pozatym przelaczanie kanalow jest ok wiesza sie przy zmianie wartosci pwm poza tym zauwazylem ze dwa kanaly wyraznie mrugaja kiedy pozostale 3 mimo tej samej wartosci pwm nie mrugaja ledy sa z tej samej szpulki
 
Odpowiedź
#6
Nie wszystko jest OK, na płytce nie widać pół kondensatora. Lepiej poczytaj to co wrzucił Ci Robson Kerman.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#7
(02-06-2019, 23:48)kaczakat napisał(a): Nie wszystko jest OK, na płytce nie widać pół kondensatora. Lepiej poczytaj to co wrzucił Ci Robson Kerman.
Faktycznie na zdjęciach tego nie widać. kondensatory sa dwa po 100 nf oba są na zasilaniu atmegi jeśli chodzi o AREF i GND to faktycznie tam nic nie dałem
 
Odpowiedź
#8
100nF może być wystarczające jak sobie chcesz pomigać ledem lub wyświetlić coś na LCD. Płytka wygląda jak generator zakłóceń, pod procesorem leżą kable, z grubości i mosfetów sugerujące prądy liczone w amperach. To raczej nie jest dobra konstrukcja. Nawet jeśli mosfety są logic level to nie gwarantuje to prawidłowej pracy. Przy dużych częstotliwościach wymagane są drivery mosfetów o dużej wydajności prądowej (pomimo sterowania napięciem), driver musi szybko "napełniać" i "opróżniać" gate. Zerknij na pierwszy z brzegu driver:
Kod:
TypIGBT driver
WykonanieSingle channel driver, voltage limiter
TechnologiaCMOS
ObudowaDIP-8
Wartosci elektryczne
Prad wyjsciowy1000 ... 2000 mA
Napiecie wyjsciowe12 ... 18 VDC
td (off)150 ns
td (off)150 ns
Dane producenta
ProducentINTERNATIONAL RECTIFIER
Nr artykułu producentaIR2125PBF
Ciężar opakowania0.001 kg
RoHSzgodne
EAN / GTIN9900000415754
Wydajność prądowa ponad 1000mA, Atmega da Ci 20mA w porywach do 40mA. Oczywiście nie ma to znaczenia gdy MOSFET jest tylko włącznikiem, wtedy wystarczy nawet kilka mA. Ale i tak powinno być to jakoś sensownie rozmieszczone, np. po lewej uC ze swoim zasilaniem, po prawej mosfety z przyłączami elektrycznymi WE/WY dużej mocy.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#9
Dzięki wsztkim za uwage problem rozwiązany dzięki wszystkim za pomoc 
Temat do zamknięcia
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości