• 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
zapalanie LED
#1
Witam wszystkich,

jestem nowy i mam problem. Od paru dni czytam o zapalaniu LEDów, jednak chciałbym zrobić inaczej niż klasyczne przykłady w necie.
Mam Diody LED połączone w szereg, w taki sposób, że tworzą jakby linię z jednym wspólnym wyjściem.
Chciałbym, aby diody zapalały się w taki sposób:
krok 1: zapala się Dioda nr 1, świeci się przez 2 minuty i gaśnie. W trakcie zapala się Dioda nr 2, świeci się przez 2 minuty. itd.
W późniejszym etapie chcę sterować zapalaniem Diody np poprzez sygnał z czujnika zbliżeniowego. 

Ktoś może mnie naprowadzić? Nie mówię gotowe rozwiązanie, ale jakiś poradnik jak to zrobić.
 
Odpowiedź
#2
W ten sposób się nie da chyba że na WSach. Ale to już inna liga. Pewnie kombinujesz sterownik schodowy?

Wysłane z mojego Redmi Note 4 przy użyciu Tapatalka
 
Odpowiedź
#3
Zacznij od tego: https://forbot.pl/blog/kursy. Jak chcesz sterować LEDami w taki sposób to musza być to led programowalne, jest ich kilka typów. Jak masz zwykłe led to możesz połączyć tylko jeden pin do np. wspólnego GND a drugi liniami do jakiegoś sterownika, jak mniej niż 20 to do pinów Arduino. Oczywiście nie bezpośrednio, to akurat pewnie się dowiesz w kursie elektroniki i arduino.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#4
Dokonałem delikatniej modyfikacji pomysłu.
Czy przypadkiem nie da się tego zrobić wykorzystując:
-arduino Uno R3
- TCST1103
- sterownik do matrycy LED MAX7219 (oraz matrycę LED)?

Idea jest taka: zasłaniam transoptor (zagadnienie czysto mechaniczne- nie istotne w jaki sposób). Następnie sygnał z TCST1103 zapala jedną diodę (z matrycy 8x8) przy użyciu sterownika MAX7219.
Bo z tego co wyczytałem za pomocą MAX7219 mogę zarówno losowo jak i według konkretnej zasady zapalać diody (więc też mogę ustalić czas). Nawet jeśli odsłonię transoptor i zasłonię go ponownie to mogę zasterować inną diodą, w taki sposób, że ta pierwsza nie zgaśnie nim nie upłynie konkretny czas.

Czy dobrze rozumiem?
 
Odpowiedź
#5
To zależy ile masz tych led. Masz już UNO to możesz podłączyć 20 led, jak weźmiesz maxa to 64. Sterować maxem możesz jak tylko chcesz (i umiesz). Na Uno też możesz odpalić 100 led multipleksowaniem, ale wtedy to co dzieje się z ledami bardzo zależy od Twoich umiejętności. Oczywiście ilość led na UNO to jeszcze - piny do komunikacji i wejściowe z tego transoptora, ale zakładając w sumie 4 to i tak zostaje 16 pinów na 16 led lub 8x8 led przy multipleksowaniu.
Co do maxa to cała matryca 8x8led odpowiada 64 bitom czyli 8 byte. Trzymasz układ bitów w pamięci w 8 bytach, to co się zmienia zmieniasz w tych bytach i co np. 10ms wysyłasz całość na led, co się zmieniło w pamięci to się zmienia na ledach, co się nie zmieniło to zostaje. Więc nie jest tak że wysyłasz do maxa "zmien led nr 35 na włączoną", ale z zewnątrz tak to wygląda.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#6
Czesc, to znowu ja. Zmodyfikowałem zadanie na łatwiejsze.
Skomunikowałem juz arduino UNO z układem MAX7219. Mam program który umożliwia świecenie jedną diodą z kolumny.

Pobawiłem się też czujnikiem ruchu HC-SR-501. Umiem na podstawie jego sygnału wyjściowego napalić diodę.

Jednak od paru dni nie umiem połączyć tych 2 kodów razem.
Chciałbym, aby jedna dioda z matrycy zapalała się po wykryciu ruchu. Ma następnie świecić np 1 sekundę. Ale jeśli używam komendy delay() to mrożę cały układ na definiowany czas. Czy jest opcja, żeby czujnik ruchu nadal był aktywny w czasie w którym dioda się świeci?
I tym samym, jeśli używam tego delay() nie mogę sprawić żeby w czasie świecenia się 1 diody (np przez 2 sekundy) zapalić kolejną diodę LED (która też będzie świecić 2 sekundy i zgaśnie) z matrycy po wykryciu ruchu.

Czy może mi ktoś pomóc z napisaniem takiej pętli?


Kod:
#include <LedControl.h>
/* PINologia
pin 12 -> DataIn
pin 11 -> is connected to the CLK
pin 10 -> is connected to LOAD
jeden układ MAX72XX. */
LedControl lc=LedControl(12,11,10,1);

/*oznaczenie wyjscia z sesnora*/
int sensor = 2;

/*wezerowanie sensora*/
int val =0;


/* czas ktory czekamy*/
unsigned long delaytime=500;

void setup() {
 /*   budzimy uklad   */
 lc.shutdown(0,false);
 /* jasnosc na srednim poziomie */
 lc.setIntensity(0,4);
 /* wyczyszczenie wyswietlacza */
 lc.clearDisplay(0);
}

/* zapalanie LEDow w rzedzie. */
void rzad() {
 for(int rzad=0;rzad<8;rzad++) {
   delay(delaytime);
   lc.setRow(0,rzad,B10000000);
   delay(delaytime);
   lc.setRow(0,rzad,(byte)0);
 }
}

void loop() {
 rzad();
}
 
Odpowiedź
#7
(06-12-2018, 00:03)raczzeek napisał(a): Cużywam komendy delay() to mrożę cały układ na definiowany czas. Czy jest opcja, żeby czujnik ruchu nadal był aktywny w czasie w którym dioda się świeci?

Bez dalszej analizy kodu,bo szkoda czasu,zapomnij o delay. Albo zaprzyjaźnij sie z millis (tez jest kiepskie,ale otworzy Ci oczy) albo użyj RTOS (ale raczej nie na AVR tylko ARM) i użyj  sleep.
 
Odpowiedź
#8
Zacznij od zrobienia kursu https://forbot.pl/blog/kursy , ostatnia lekcja to wielozadaniowy projekt z millis. Nie zrozumiesz go zaczynając kurs od końca.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#9
OK. Zmodyfikowałem kod. Mam drobny problem, ponieważ miga mi tylko 1 dioda (1 rzad, 1 kolumna). Kod nie wykonuje sie dalej. Nie wiem dlaczego po modyfikacji (usunieciu delay()) przestało obsługiwać pozostałe LEDy
Kod:
//biblioteka do Maxa
#include <LedControl.h>
LedControl lc=LedControl(12,11,10,1);
//PIN 12 na DataIn, PIN 11 na CLK, PIN 10 na CS oraz 1 bo 1 matryca

//do metrycy czasy//
unsigned long mignij = 500; //jak dlugo ma migac
unsigned long TerazCzas =0;
unsigned long PamietajCzas =0;


void setup() {
//ta petla robi sie raz//
Serial.begin(9600);
lc.shutdown(0,false); /*obudz */
lc.clearDisplay(0); /* wczysc matryce */
lc.setIntensity(0,7); /*jasnosc matrycy*/
}


void matryca() {
 /* zapalanie matrycy */
TerazCzas=millis();
for(int kol=0;kol<4;kol++) { /*8 kolumn*/
for(int rzad=0;rzad<5;rzad++){ /*caly rzad*/
if(TerazCzas - PamietajCzas > mignij){//jesli uplynelo 500 to//
PamietajCzas = TerazCzas;
lc.setLed(0,kol,rzad, true); /*zapal */
if(PamietajCzas = TerazCzas - 300);
mignij=500; }
lc.setLed(0,kol,rzad, false); /*zgas */
}
}
}

void loop() {
 //ta petla robi sie caly czas//
matryca();

}
 
Odpowiedź
#10
W tym kodzie masz taki bajzel, że nawet nie będę tego dotykał. Poukładaj sobie klamrami co do czego należy {}. Np. w tej linijce są trzy błędy: if(PamietajCzas = TerazCzas - 300); pierwszy to "=" nie robi porównania tylko przypisanie, porównanie to ==, poza tym nigdy nie rób == bo może ta chwila była 5ns temu i już nigdy się nie spełni (lepiej => lub =< w zależności od kontekstu), po trzecie kończysz if za nawiasem średnikiem więc on nic nie zrobi.
Nie wiem czy z tego skorzystasz, w tym kodzie ma coś piknąć/mignąć bez blokowania programu (przycisk na 2, led czy buzer na 13):
Kod:
const int buzzer=13;
const int button=2;
boolean stanbuzzera=0;

void setup() {
 // put your setup code here, to run once:
pinMode(buzzer,OUTPUT);
pinMode(button,INPUT_PULLUP);

}

void loop() {
 // put your main code here, to run repeatedly:
 if(!digitalRead(2)||stanbuzzera)  dzwiek(500,10,buzzer);
 
 

}

void dzwiek(uint16_t dlugosc, uint16_t pikniec, uint16_t pin) //(dlugosc piku, ile pikniec, na ktory pin)
{
 static uint16_t aktualnyPik=0;
static boolean stanpoprzedni=0;
static uint32_t lasttime=0;
uint32_t currenttime=millis();
// na razie zakladam 5 pikniec co 1000ms
if(currenttime-lasttime>=(uint32_t)dlugosc)
{
 lasttime=currenttime;
 if( aktualnyPik++ <(pikniec*2))//mnozymy *2 by pikniec bylo 10, nie zmian stanu
 {
   digitalWrite(pin,!digitalRead(pin));
   stanbuzzera=1;
 }
 else
 {
  aktualnyPik=0;
  stanbuzzera=0;
 }

}
 
}

Po tak przygotowanej funkcji możesz sobie wywołać ją podając jaki czas piknięć, ile ich ma być, i na jakim pinie: dzwiek(500,10,buzzer);. I w kodzie możesz sobie robić cokolwiek innego (byle też nie blokować delay).
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości