Vizitator Postat Iunie 24, 2022 Partajează Postat Iunie 24, 2022 (editat) Acum 9 ore, cimitavita a spus: altă soluţie mai simplă ar fi să scriu dintr-o dată toţi biţii din PORT1 Da. La solutia asta m-am gandit si eu cand am pus problema. Eventual citit tot PORT1 si pastrate valorile anterioare pentru ceilalti biti. (in indeea ca sunt folositi deja) Editat Iunie 24, 2022 de Vizitator Link spre comentariu
nico_2010 Postat Iunie 24, 2022 Partajează Postat Iunie 24, 2022 O posibila solutie care, totusi, eludeaza conditia "Prin LED stins se intelege zero curent prin LED" (si astept explicatia initiatorului topicului de ce este eludata conditia), ar putea fi asta: Si sketch-ul incropit la repezeala si fara mari pretentii: const int OUT_PIN1 = 5; const int OUT_PIN2 = 6; void setup() { // put your setup code here, to run once: pinMode(OUT_PIN1, INPUT); pinMode(OUT_PIN2, OUTPUT); } void loop() { // put your main code here, to run repeatedly: pinMode(OUT_PIN1, OUTPUT); digitalWrite(OUT_PIN1, HIGH); delay(1000); digitalWrite(OUT_PIN1, LOW); delay(1000); pinMode(OUT_PIN1, INPUT); digitalWrite(OUT_PIN2, HIGH); delay(1000); digitalWrite(OUT_PIN2, LOW); delay(1000); } Link spre comentariu
Vizitator Postat Iunie 24, 2022 Partajează Postat Iunie 24, 2022 Solutia cu LED-urile in antiparalel nu este valabila pentru leduri albe sau albastre si montaj alimentat sub 6-7 Volti. Avem 2.5V volti in divizorul R5/R6 la 5V alimentare. Nu aprindem leduri cu Vforward peste 2.5V Ce facem la 3v3? Nu se aprinde nici un fel de LED. Nu este o solutie universal valabila. Si plus de asta avem mereu un consum destul de mare dat de cele doua rezistente chiar daca ledurile sunt stinse. Link spre comentariu
nico_2010 Postat Iunie 24, 2022 Partajează Postat Iunie 24, 2022 Acum 13 ore, Liviu.Mihaiu a spus: Se dă: - 1 x placă Arduino la care mai sunt libere două porturi. - 3 x LED-uri. - 3 x resistente. Se cere: Sa se conceapă schema si softul care să permită aprinderea celor trei LED-uri pe rând utilizând cele două porturi libere. Dupa initializare uC, un singur LED va fi alimentat la un moment dat. Fiecare LED se aprinde timp de o secundă, se stinge si după o secundă se aprinde următorul. Astea au fost singurele conditii. Stiu discutia de acum 8 ani si tot ceea ce presupune culoare de led (cu Vf aferent), consum prezent, indiferent de faptul ca ledurile sunt activate sau nu s.a.m.d. Posteaza solutia ta si o discutam dupa aia. Link spre comentariu
Vizitator Postat Iunie 24, 2022 Partajează Postat Iunie 24, 2022 (editat) Nu stiu ce discutia a avut loc acum 8 ani si care a fost rezultatul. Am spus, solutia mea este cea prezentata si de @cimitavita, cu cele 3 LED-uri inseriate. Merge la orice tensiune de alimentare si cu orice fel de LED. In Arduino IDE , in C se poate scrie ceva de genu: PORTx = 0b00000010; Eventual salvata starea anterioara a portului pentru a nu afecta celelalte I/O -uri. PORTx = PORTx | (&) bitmask; pentru a scrie intregul PORTx si a nu mai aparea situatia cu doua LED-uri aprinse simultan. Editat Iunie 24, 2022 de Vizitator Link spre comentariu
nico_2010 Postat Iunie 24, 2022 Partajează Postat Iunie 24, 2022 Acum 50 minute, Liviu.Mihaiu a spus: Nu stiu ce discutia a avut loc acum 8 ani si care a fost rezultatul. Am spus, solutia mea este cea prezentata si de @cimitavita, cu cele 3 LED-uri inseriate. Merge la orice tensiune de alimentare si cu orice fel de LED. In Arduino IDE , in C se poate scrie ceva de genu: PORTx = 0b00000010; Eventual salvata starea anterioara a portului pentru a nu afecta celelalte I/O -uri. PORTx = PORTx | (&) bitmask; pentru a scrie intregul PORTx si a nu mai aparea situatia cu doua LED-uri aprinse simultan. Discutia a fost purtata aici: https://electronics.stackexchange.com/questions/106090/how-to-control-three-leds-with-two-uc-pins-using-just-passive-components acum 8 ani. Aici s-a pus si problema culorii ledurilor, iar initiatorul topicului de atunci a insistat pe leduri rosii. In alta ordine de idei, "solutia" agreata de tine si propusa de userul cimitavita si de yo8tot are o hiba: nu merge cu toate culorile de led si la orice tensiune de alimentare, deci nu este "universala". Spre exemplu: 1 oră în urmă, Liviu.Mihaiu a spus: pentru leduri albe sau albastre si montaj alimentat sub 6-7 Volti adica la 3.3V, LED1 (din schema postata de cimitavita) nu se va aprinde (pentru ca Vf la ledurile albe si albastre este undeva la 3.5V), iar daca alimentarea va fi facuta la 9V atunci s-ar putea ca LED1 si LED2 (sau LED2 si LED3) sa fie aprinse simultan, la un moment dat (e de verificat). Fa un test real si vezi ce se intampla. Link spre comentariu
Marin1960 Postat Iunie 24, 2022 Partajează Postat Iunie 24, 2022 Pentru ca suntem la sectiunea Arduino, am testat varianta propusa de @cimitavita, pe un Arduino Pro Mini. Testul a fost facut cu leduri rosii, verzi, albastre si albe la tensiunea de 5V si 3,3V. Mai jos schetch-ul utilizat: /* 1 x placă Arduino la care mai sunt libere două porturi. * 3 x LED-uri. * 3 x resistente. * Sa se conceapă schema si softul care să permită aprinderea * celor trei LED-uri pe rând utilizând cele două porturi libere. * Fiecare LED se aprinde timp de o secundă, se stinge si după o * secundă se aprinde următorul. */ #define P1 8 #define P2 9 const unsigned long one_second = 1000; unsigned long now_millis, old_millis; byte flag_second, shift; void setup() { pinMode(P1,OUTPUT); pinMode(P2,OUTPUT); shift = 0; flag_second = 0; move_led(); old_millis = millis(); } void loop() { timer(); if(flag_second > 0) { flag_second = 0; shift++; if(shift > 2)shift = 0; move_led(); } } void Led1_ON(){ digitalWrite(P1, LOW); digitalWrite(P2, LOW); } void Led2_ON(){ digitalWrite(P2, LOW); digitalWrite(P1, HIGH); } void Led3_ON(){ digitalWrite(P2, HIGH); } void move_led(){ switch (shift){ case 0: Led1_ON(); break; case 1: Led2_ON(); break; case 2: Led3_ON(); break; default: break; } } void timer(){ if((millis() - old_millis) > one_second) { flag_second = 1; old_millis = millis(); } } Link spre comentariu
nico_2010 Postat Iunie 24, 2022 Partajează Postat Iunie 24, 2022 Am testat acum sketch-ul postat de userul @Marin1960 si functioneaza OK cu toate tipurile de led(rosu,verde, albastru si alb) la tensiuni de alimentare de 5V si 3.3V. Cu toate acestea, alimentand ledurile -indiferent de culoarea lor - cu 9V (asta apropos de "functioneaza la orice tensiune de alimentare") am remarcat faptul ca LED1 (din schema lui cimitavita) isi modifica doar intensitatea luminoasa (dar in niciun caz nu este stins), pe cand LED 2 si LED3 se sting conform sketch-ului. Link spre comentariu
Vizitator Postat Iunie 24, 2022 Partajează Postat Iunie 24, 2022 Daca alimentezi doar ledurile cu 9V si uC ramane la 5V , este normal ca LED 1 sa nu se stinga. Practic LED-ul se va alimenta la 9V-5V = 4V Din cauza diferentei de potential pe intrarea pinului P1 se deschide o dioda ESD din interiorul uC, D1 in imaginea de mai jos. Ai sanse sa arzi si uC. Link spre comentariu
nico_2010 Postat Iunie 24, 2022 Partajează Postat Iunie 24, 2022 Acum 2 ore, Liviu.Mihaiu a spus: Am spus, solutia mea este cea prezentata si de @cimitavita, cu cele 3 LED-uri inseriate. Merge la orice tensiune de alimentare si cu orice fel de LED. Uite ca nu merge "la orice tensiune de alimentare"! Link spre comentariu
Vizitator Postat Iunie 24, 2022 Partajează Postat Iunie 24, 2022 Am explicat mai sus unde ai gresit cand ai alimentat. Link spre comentariu
nico_2010 Postat Iunie 24, 2022 Partajează Postat Iunie 24, 2022 Inteleg ca nu-ti place sa citesti ce posteaza altii, da' te rog fa un efort si reciteste TOATE postarile mele (inclusiv citatele si trimiteri la subiectul original). Dupa ce ai facut lectura trage singur concluziile ce se impun. Oricum, subiectul deschis nu are prea multe aplicatii practice si nici vreo noima, insa ca exercitiu poate fi util, in masura in care tema ar fi fost explicita (culoare leduri, tensiune maxima de alimentare s.a.) nu generica si incompleta. Link spre comentariu
Vizitator Postat Iunie 24, 2022 Partajează Postat Iunie 24, 2022 (editat) Acum 2 ore, Marin1960 a spus: Testul a fost facut cu leduri rosii, verzi, albastre si albe la tensiunea de 5V si 3,3V. Chiar functioneaza, fara sa fie nevoie sa trimiti un octet la tot portul. A simpla logica de schimbare o ordinii Low/High. Mie nu mi-a trecut prin cap. Si-mi place ca ai facut delay fara delay(). (mai trebuia sa pui si un shift/case pentru a face pauza o sec. intre doua aprinderi de led) Editat Iunie 24, 2022 de Vizitator Link spre comentariu
Marin1960 Postat Iunie 24, 2022 Partajează Postat Iunie 24, 2022 Ai dreptate @Liviu.Mihaiu, am uitat de pauza dintre leduri. Am modificat sketch-ul, am inserat si pauza, dar nu l-am testat. /* 1 x placă Arduino la care mai sunt libere două porturi. * 3 x LED-uri. * 3 x resistente. * Sa se conceapă schema si softul care să permită aprinderea * celor trei LED-uri pe rând utilizând cele două porturi libere. * Fiecare LED se aprinde timp de o secundă, se stinge si după o * secundă se aprinde următorul. */ #define P1 8 #define P2 9 const unsigned long one_second = 1000; unsigned long now_millis, old_millis; byte flag_second, shift; void setup() { Ports_output(); shift = 0; flag_second = 0; move_led(); old_millis = millis(); } void loop() { timer(); if(flag_second > 0) { flag_second = 0; shift++; if(shift > 5)shift = 0; move_led(); } } void Led1_ON(){ digitalWrite(P1, LOW); digitalWrite(P2, LOW); } void Led2_ON(){ digitalWrite(P2, LOW); digitalWrite(P1, HIGH); } void Led3_ON(){ digitalWrite(P2, HIGH); } void Led123_OFF(){ pinMode(P1,INPUT); pinMode(P2,INPUT); } void Ports_output(){ pinMode(P1,OUTPUT); pinMode(P2,OUTPUT); } void move_led(){ switch (shift){ case 0: Led1_ON(); Ports_output(); break; case 2: Led2_ON(); Ports_output(); break; case 4: Led3_ON(); Ports_output(); break; default: Led123_OFF(); break; } } void timer(){ if((millis() - old_millis) > one_second) { flag_second = 1; old_millis = millis(); } } Recent, am avut o aplicatie in care avem la dispozitie un singur pin si trebuia sa semnalizez pe doua led-uri. Am utilizat ceva asemanator, doar ca am inserat si o dioda zener in serie cu ledurile , sa nu se aprinda cand pinul era pe input. Link spre comentariu
Marin1960 Postat Iunie 24, 2022 Partajează Postat Iunie 24, 2022 Cand te grabesti, nu iese ceva bun. Rutina "Led3_ON()" trebuie inlocuita cu: void Led3_ON(){ digitalWrite(P1, HIGH); digitalWrite(P2, HIGH); } Am testat pe un Arduino Nano cu leduri rosii. In pauza, ledurile mi se pare ca nu sunt stinse de tot. Mai sap... Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum