Skocz do zawartości

Dwa przyciski i 14 diod led i wyświetlacz


xirtt

Pomocna odpowiedź

Ponieważ w swojej pracy znowu zjadłeś 2 przycisk, a konfiguracja startowa pinów zajmuje w kodzie aż 24 wiersze, a może zdecydowanie mniej właśnie dzięki pętli for. Ważniejszym jednak powodem jest to, że pętla for to podstawowa konstrukcja w każdym języku programowania i służy ona do tego by powtarzać określoną ilość razy tę samą "czynność" - tu ustawienie trybu pracy pinów Arduino. No ale to Ty jesteś głównym konstruktorem.

Link do komentarza
Share on other sites

(edytowany)

zgadza się to odnosiło się do pytania................

A co do zadania , to zrobiłem to tak, działa!!!

 

Pozdrawiam......

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);

 
 void setup() 
{
 
  lcd.init();                      // initialize the lcd 
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("     WITAM         ");
  lcd.setCursor(0,1);
  lcd.print("    Sterownik      ");
   lcd.setCursor(0,2);
  lcd.print("      diod         ");
   lcd.setCursor(0,3);
  lcd.print("      led          ");
  
  for(int x=2; x<=6; x++)
  {
    pinMode(x, OUTPUT);
    digitalWrite(x, LOW);
   }
  pinMode(A0, INPUT_PULLUP);    //1 przycisk pod A0
  pinMode(A1, INPUT_PULLUP);    //2 przycisk pod A1
  
  Serial.begin(9600);
}

 void loop()
{
  
  delay(200);//Zatrzymujemy program przed wejsciem do pętli na 1 sekunde
  while (digitalRead(A0) == HIGH) {} 
   Serial.println("przycisk 1-A0");
  delay(500);
   delay(200);//Zatrzymujemy program przed wejsciem do pętli na 1 sekunde
  while (digitalRead(A1) == HIGH) {} 
   Serial.println("przycisk 2-A1");
  delay(500);
  
}

 

a teraz, druga wersja zadania........kurcze PRZYJACIELU  SUUUPER

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);

 
 void setup() 
{
 
  lcd.init();                      // initialize the lcd 
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("     WITAM         ");
  lcd.setCursor(0,1);
  lcd.print("    Sterownik      ");
   lcd.setCursor(0,2);
  lcd.print("      diod         ");
   lcd.setCursor(0,3);
  lcd.print("      led          ");
  
  for(int x=2; x<=6; x++)
  {
    pinMode(x, OUTPUT);
    digitalWrite(x, LOW);
   }
  pinMode(A0, INPUT_PULLUP);    //1 przycisk pod A0
  pinMode(A1, INPUT_PULLUP);    //2 przycisk pod A1
  
  Serial.begin(9600);
}

 void loop()
{
     
   if(digitalRead(A0) == LOW) {
    digitalWrite(2, HIGH); 
   Serial.println("przycisk 1-A0");}
   else{digitalWrite(2, LOW);}
      delay(100);
   if(digitalRead(A1) == LOW) { 
   Serial.println("przycisk 2-A1");
   digitalWrite(3, HIGH);}
   else{digitalWrite(3, LOW);}
       delay(100);
}

!!!!!!!!!!

Edytowano przez xirtt
Link do komentarza
Share on other sites

Użyj Bounce2, a wtedy będzie super. Polecam metodę (funkcję) tej klasy fell() - wykryje fakt naciśnięcia przycisku i cała ich obsługa (2 przycisków) zajmie w loop 4 wiersze. Zobacz dokumentację tej Biblioteki np. tu: link

Na końcu strony jest przykład

 

Link do komentarza
Share on other sites

No ok. xirtt tu masz przykładowy kod programu wykorzystujący Bounce2 jaki popełniłem dla Ciebie, a tu filmik ilustrujący jak on działa: zobacz film

Pojawiło się tu kilka nowych pewnie dla Ciebie rzeczy np.:

#define BUTTON_1 A0

W taki sposób możesz na wstępie programu zdefiniować swoje stałe by móc się do nich odwoływać za pomocą nazwy w kodzie programu. Fajna sprawa, bo gdy z takich czy innych powodów zmienisz np. podłączenie przycisku to wystarczy tylko odpowiednia zmiana definicji tu BUTTON_1

UWAGA: Na końcu wiersza z #define nie piszemy średnika ;

Przy lcd.init() pytałeś po co te nawiasy. Chodzi o to, że programując często staniesz przed sytuacją gdzie dany fragment programu chciałbyś móc wykonywać w zależności od przebiegu głównego programu w różnych jego momentach. Do tego służą funkcje(), a przykładem takiej funkcji jest np. digitalRead(D0) czy wspomniane lcd.init()

Zauważ, że pojawiają się tu nawiasy, pomiędzy którymi umieszczasz parametry przekazywane do funkcji - tu np. numer portu D0. Takich parametrów (nawet różnego typu) możesz przekazywać wiele np. digitalWrite(D0,LOW); Tu do funkcji o nazwie digitalWrite przekazujesz dwa parametry (D0,LOW). Wywołanie funkcji następuje w programie głównym przez podanie jej nazwy() bez parametrów lub nazwa(parametr1, parametr2, ....) z parametrami. Sposób wywołania funkcji zależy od tego jak została ona skonstruowana - zadeklarowana przez programistę. Błędne wywołanie funkcji zostanie przez kompilator zasygnalizowane błędem.

Jeśli program główny może przekazać do funkcji parametry to nic dziwnego, że i funkcja może zwrócić określony wynik. Do tego służy return. Kiedy piszesz w swoim programie np. if(digitalRead(A1) == LOW) ... to właśnie za pomocą if sprawdzasz tą zwracaną przez digitalRead(A1) wartość.

Takie funkcje możesz także tworzyć samemu np.:

void KomunikatStartowy()                  //Funkcja wyświetli na LCD komunikat powitalny
{
  lcd.setCursor(0,0);
  lcd.print("     WITAM         ");
  lcd.setCursor(0,1);
  lcd.print("    Sterownik      ");
  lcd.setCursor(0,2);
  lcd.print("      diod         ");
  lcd.setCursor(0,3);
  lcd.print("      led          ");
}

Tutaj Twój kod wyświetlający komunikat powitalny ująłem wewnątrz własnej funkcji, której nadałem nazwę KomunikatStartowy. Generalnie przyjęło się by nazwy funkcji rozpoczynać małą literą lecz mam nadzieję, że inni forumowicze nie będą mi mieli tego za złe - stare (złe) przyzwyczajenie (lepiej byłoby komunikatStartowy).

Jak widzisz program funkcji umieszcza się pomiędzy nawiasami klamrowymi {}. Te nawiasy grupują wiele instrukcji w logiczną całość. Takimi funkcjami są również void setup() i void loop()!  Deklarując tę funkcję użyłem konstrukcji void KomunikatStartowy(). Przed nazwą funkcji definiuję co będzie ona zwracała do programu głównego gdy zakończy funkcja pracę. Słowo void oznacza, że ta funkcja niczego nie będzie zwracała. Użycie po nazwie pustych nawiasów () oznacza, że do funkcji nie przekazuje się żadnych parametrów.

W programie jaki Ci pokazuję znajdziesz także funkcję, do której przekazujesz parametry i  która zwraca wynik boolean ZmienProgram(int zmiana). Mam nadzieję, że analiza kodu i komentarze wyjaśnią Ci tę konstrukcję.

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <Bounce2.h>

#define BUTTON_1 A0
#define BUTTON_2 A1
#define PROGRAM_MAX 5     //maksymalna liczba programów sterownika (sekwencji LED)
int program_biezacy=0;    //tu zapamiętamy nr aktualnego programu 0 - brak sterowania LEDami
                          //

LiquidCrystal_I2C lcd(0x27,20,4);

// deklarujemy dwa obiekty klasy Bounce(), które będą obsługiwały nasze przyciski
Bounce przycisk1 = Bounce(); 
Bounce przycisk2 = Bounce(); 

//--------------------------------------------------------------------------------
void setup() 
{
  program_biezacy=0;                  
  // konfiguracja pinów wyjściowych (LED)
  for(int x=2; x<=6; x++)
  {
    pinMode(x, OUTPUT);
    digitalWrite(x, LOW);
   }
  pinMode(BUTTON_1, INPUT_PULLUP);    //1 przycisk pod A0
  pinMode(BUTTON_2, INPUT_PULLUP);    //2 przycisk pod A1

  //----- konfiguracja obsługi obiektów odpowiedzialnych za obsługę przycisków ----
  przycisk1.attach(BUTTON_1);         // przypisanie portu Arduino, na którym jest przycisk
  przycisk1.interval(50);             // czas ew. drgania styków przycisku w ms

  przycisk2.attach(BUTTON_2);
  przycisk2.interval(50); 

  //uruchomienie portu szeregowego dla diagnostyki
  Serial.begin(9600);
  Serial.println("Reset urządzenia ....");
  Serial.println("Aktualny program nr:"+String(program_biezacy)+"\n");
  
  //wyświetlacz LCD
  lcd.init();            
  lcd.backlight();
  KomunikatStartowy();
}

//----------------------------------------------------------------------------
void loop() {
  
  przycisk1.update();
  przycisk2.update();
  boolean zmiana_prog=false;
  
  if(przycisk1.fell())        zmiana_prog=ZmienProgram(1);    //jeśli naciśnięto P1 to następny program (sekwencja LED)
  if(przycisk2.fell())        zmiana_prog=ZmienProgram(-1);   //jesli naciśnięto P2 to poprzedni program (sekwencja LED)

  if(zmiana_prog==true) Serial.println("Program został zmieniony.\n");

}

//----------------- Moje funkcje ------------------
void KomunikatStartowy()                  //Funkcja wyświetli na LCD komunikat powitalny
{
  lcd.setCursor(0,0);
  lcd.print("     WITAM         ");
  lcd.setCursor(0,1);
  lcd.print("    Sterownik      ");
  lcd.setCursor(0,2);
  lcd.print("      diod         ");
  lcd.setCursor(0,3);
  lcd.print("      led          ");
}

boolean ZmienProgram(int zmiana)           //zmiana==1 - następny program   zmiana==-1 - poprzedni program
{
  boolean stat=true;
  switch(zmiana)
  {
    case 1:
      if(program_biezacy<PROGRAM_MAX+1)  program_biezacy++;
      else                               stat=false;
      break;
     case -1:
      if(program_biezacy>0)              program_biezacy--;
      else                               stat=false;
      break;
     defalut:
      stat=false;
      break;
  }
  if(stat)  //jeśli dokonano zmiany programu
    { 
      UstawLedy();
      Serial.println("\nAktualny program nr:"+String(program_biezacy));
    }
  return stat;  //zwracamy stat sygnalizując czy dokonano zmiany (true) czy nie (false)
}

void UstawLedy()                        //funkcja steruje LEDami
{
  
}

Myślę, że masz prawie gotowca i dalej poradzisz sobie sam.

Edytowano przez Belferek
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Witam Cię Przyjacielu .

Przeczytałem to co napisałeś , ale nic z tego nie rozumie, za dużo informacji na raz.

- poco mi komunikat powitalny w -void loop()- , ja w swoim programie wpisywałem 12 różnych nazw do różnych 12 sekwencji,  i to było razem ze sobą powiązane, a tutaj gdzie ja to mogę zrobić?. ( za dużo naraz informacji)

- w moim programie mogłem wybrać jedną sekwencje z 12diod led, kiedy ona się zaświeciła , to dalej mogłem przeglądać nazwy na wyświetlaczu , w tym czasie sekwencja wybrana wcześniej świeciła , dopiero kiedy zatrzymałem się na innej sekwencji na wyświetlaczu ,i w ciągu 3 sekund nacisnąłem drugi raz przycisk i go przytrzymałem dopiero wtedy zmieniała się sekwencja świecenia diod led, a tutaj gdzie to jest?

Ten program fachowy jest tak zagmatwany , skomplikowany i nie czytelny ( oczywiście dla mnie ROBAKA) , a ten mój jest prosty, nawet bym powiedział  prostacki, ALE ON PIĘKNIE MI DZIAŁA TAK JAK CHCIAŁEM, TYLKO CHCIAŁBYM MIEĆ DWA PRZYCISKI i to tyle.

Przyjaciel mój , mam do ciebie prośbę , czy mógłbyś mi napisać jak mam dopisać drugi przycisk do mojego programu, albo żebyś powoli każdy fragment twojego programy mi wytłumaczyć . Chciałbym tą drugą opcje , czyli wytłumacz mi ten program krok po kroku, ale pod kontem mojego programu.

MYŚLĘ PRZYJACIELU ŻE DLA TEGO TAK PĘDZISZ Z BRAKU CZASU.

JA MOGĘ CZEKAĆ SPOKOJNIE NA TWOJE ODPOWIEDZI , WIEM ŻE KAŻDY MA SWOJE SPRAWY, ALE DLA MNIE CZAS NIEMA ŻADNEGO ZNACZENIA MOGĘ CZEKAĆ NA ODPOWIEDZI NAWET KILKA DNI , ŻADEN PROBLEM PRZYJACIELU......

TAK NA MARGINESIE, MOŻE KTOŚ INNY CHCIAŁBY  MI TEŻ POMÓC I MNIE ROBAKA CZEGOŚ NAUCZYĆ

CO Z TEGO ŻE WIEM, JAK NIE ROZUMIE

PROSZĘ NIE PĘDZIMY TAAAAAAAAAAAAAAAAAAAAAAK..............

Pozdrawiam serdecznie i spokojnie czekam na odpowiedzi.............( oczywiście BELFEREK , między czasie będę myślał o twoim programie)

 

 

Link do komentarza
Share on other sites

1 godzinę temu, xirtt napisał:

a tutaj gdzie to jest?

Tu masz pokazany sposób pisania programu, który rozwiązuje Twój jakby się wydawało zasadniczy problem tzn. 2 przyciski i ich obsługa. Reszta należy do Ciebie. Moim zdaniem program jaki Ci pokazałem jest czytelny, a jak czegoś nie rozumiesz pytaj.

Napisałeś: poco mi komunikat powitalny w -void loop()

Gdzie Ty to widzisz? Nie ma czegoś takiego.

Napisałeś:

w moim programie mogłem wybrać jedną sekwencje z 12diod led, kiedy ona się zaświeciła , to dalej mogłem przeglądać nazwy na wyświetlaczu , w tym czasie sekwencja wybrana wcześniej świeciła , dopiero kiedy zatrzymałem się na innej sekwencji na wyświetlaczu ,i w ciągu 3 sekund nacisnąłem drugi raz przycisk i go przytrzymałem dopiero wtedy zmieniała się sekwencja świecenia diod led, a tutaj gdzie to jest?

Tak skomplikowanie piszesz, że jTwoje myśli są dla mnie zupełnie nieczytelne. Obsługą swojego wyświetlacza zajmij się sam. Pokazana propozycja programu niczego nie wyświetla na LCD lecz na porcie szeregowym. Sam sobie dostosuj ten programik by te informacje wyświetlał na LCD. Tylko Ty wiesz jak te przyciski mają działać, czy ma ich być 2, 3, a może 5? Tu masz obsługę dwóch. Jeśli potraktujesz je jako przyciski do obsługi menu czyli <- i -> na LCD to przydałby Ci się np. 3 przycisk zatwierdzający / anulujący wybór. Wystarczy go dodać i oprogramować. Ja Ci pokazałem ewentualny sposób podejścia do tematu i starałem się wytłumaczyć czym są funkcje, do czego służą nawiasy itd. Bez kilkukrotnej lektury "Arduino dla początkujących", a także kursów Forbota, bez wiedzy jak działają podstawowe struktury stosowane w programowaniu (if, while, switch, for itd), do czego można wykorzystać w programie zmienne (tu np. zmienna program_biezacy) będzie Ci ciężko zrobić cokolwiek.

 

Edytowano przez Belferek
Link do komentarza
Share on other sites

Dziękuje Przyjacielu za odpisanie.

Gdy byś Mój Przyjacielu wgrał ten program u siebie, to byś zrozumiał o czym ja bredzę, (w moim programie mogłem wybrać jedną sekwencje z 12diod led, kiedy ona się zaświeciła , to dalej mogłem przeglądać nazwy na wyświetlaczu , w tym czasie sekwencja wybrana wcześniej świeciła , dopiero kiedy zatrzymałem się na innej sekwencji na wyświetlaczu ,i w ciągu 3 sekund nacisnąłem drugi raz przycisk i go przytrzymałem dopiero wtedy zmieniała się sekwencja świecenia diod led, a tutaj gdzie to jest?)

Wiem dlaczego ja tak "zafiksowałem" się na swoim programie. Napisałem coś takiego pierwszy raz w życiu , i tak się ciesze jak dziecko😀.

Mało tego , w moim programie , był jeden  mały mankament( oczywiście oprócz tego dodatkowego przycisku, który by się przydał) .

Gdy wybrałem np. program 2, i dalej przeszukiwałem sobie meni i np. byłem na 5 programie, to powiedzmy zapomniałem  jaki wcześniej wybrałem program.

I EUREKA !!!!! poprawiłem to. Teraz na wyświetlaczu po wybraniu programu w lewym górnym rogu wyświetla się numer programu przez cały czas , i dalej mogę przeszukiwać meni. ZNOWU CIESZE SIĘ JAK DZIECKO.😀

W moim programie dzieje się to wszystko tak dziecinni prosto.

Dziękuje PRZYJACIELU BELFEREK , pytań mam mnóstwo do ciebie, muszę to przemyśleć.......

Dalej proszę o pomoc kogoś, kto by mi pomógł w tym drugim przycisku czekam na każdą pomoc... ja robak, oczywiście dalej walczę, ale proszę o pomoc.

Link do komentarza
Share on other sites

(edytowany)

Witam Cie Przyjacielu BELFEREK.
Mam pytania dotyczące twojego programu.👨‍🔧

Zmieniłem wejścia sterujące . W arduino uno wykorzystałem wyjścia od 0,1,2,3,4,5,6,7,8,9,10,11,12 do 13. Tak miałem w założeniu , chce sterować 14 diodami led. Okazało się, że na wyjściu 0 i 1 , świecą się te dwie diody. Już wiem dlaczego , te dwa wyjścia są też jako 0=RX i 1=TX.
Kiedy jest włączona transmisja portu szeregowego do diagnozy, to diody na wyjściach 0 i 1 świecą , jak usunę z programu tą transmisje, to one nie świecą i jest ok.
- moje pytanie, jak zrobić żebym mógł wykorzystać wyjścia 0 i 1 do sterowania diodami i  była transmisja na porcie, ale by diody nie świeciły się cały czas na wyjściu 0 i 1?

 
Pozdrawiam i czekam na odpowiedź .

Życzę Miłego dnia Przyjacielu.

Przyjacielu zrodziły się kolejne pytania.👨‍🔧

- moje pytanie, proszę sprawdź czy w dobre miejsce wstawiłem pierwszy

program?
- drugie pytanie, jak i gdzie wpisać następne programy

Dołączam program.

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <Bounce2.h>

#define BUTTON_1 A0
#define BUTTON_2 A1
#define PROGRAM_MAX 14     //maksymalna liczba programów sterownika (sekwencji LED)
int program_biezacy=0;    //tu zapamiętamy nr aktualnego programu 0 - brak sterowania LEDami
                          //

LiquidCrystal_I2C lcd(0x27,20,4);

// deklarujemy dwa obiekty klasy Bounce(), które będą obsługiwały nasze przyciski
Bounce przycisk1 = Bounce(); 
Bounce przycisk2 = Bounce(); 

//--------------------------------------------------------------------------------
void setup() 
{
  program_biezacy=0;                  
  // konfiguracja pinów wyjściowych (LED)
  for(int x=0; x<=13; x++)
  {
    pinMode(x, OUTPUT);
    digitalWrite(x, LOW);
   }
  pinMode(BUTTON_1, INPUT_PULLUP);    //1 przycisk pod A0
  pinMode(BUTTON_2, INPUT_PULLUP);    //2 przycisk pod A1

  //----- konfiguracja obsługi obiektów odpowiedzialnych za obsługę przycisków ----
  przycisk1.attach(BUTTON_1);         // przypisanie portu Arduino, na którym jest przycisk
  przycisk1.interval(50);             // czas ew. drgania styków przycisku w ms

  przycisk2.attach(BUTTON_2);
  przycisk2.interval(50); 

  //uruchomienie portu szeregowego dla diagnostyki
  Serial.begin(9600);
  Serial.println("Reset urządzenia ....");
  Serial.println("Aktualny program nr:"+String(program_biezacy)+"\n");
  
  //wyświetlacz LCD
  lcd.init();            
  lcd.backlight();
  KomunikatStartowy();
}

//----------------------------------------------------------------------------
void loop() {
  
  przycisk1.update();
  przycisk2.update();
  boolean zmiana_prog=false;
  
  if(przycisk1.fell())        zmiana_prog=ZmienProgram(1);    //jeśli naciśnięto P1 to następny program (sekwencja LED)
  if(przycisk2.fell())        zmiana_prog=ZmienProgram(-1);   //jesli naciśnięto P2 to poprzedni program (sekwencja LED)

  if(zmiana_prog==true) Serial.println("Program został zmieniony.\n");

}

//----------------- Moje funkcje ------------------
void KomunikatStartowy()                  //Funkcja wyświetli na LCD komunikat powitalny
{
  lcd.setCursor(0,0);
  lcd.print("      WITA         ");
  lcd.setCursor(0,1);
  lcd.print("    Sterownik      ");
  lcd.setCursor(0,2);
  lcd.print("      diod         ");
  lcd.setCursor(0,3);
  lcd.print("      led          ");
}

boolean ZmienProgram(int zmiana)           //zmiana==1 - następny program   zmiana==-1 - poprzedni program
{
  boolean stat=true;
  switch(zmiana)
  {
    case 1:
      if(program_biezacy<PROGRAM_MAX+1)  program_biezacy++;
      else                               stat=false;
      break;
     case -1:
      if(program_biezacy>0)              program_biezacy--;
      else                               stat=false;
      break;
     defalut:
      stat=false;
      break;
  }
  if(stat)  //jeśli dokonano zmiany programu
    { 
      UstawLedy();
      
      Serial.println("\nAktualny program nr:"+String(program_biezacy));

  lcd.backlight();
  lcd.setCursor(3,0);
  lcd.print( "   Program 1      ");
  lcd.setCursor(0,1);
  lcd.print("   Diody aktywne   ");
   lcd.setCursor(0,2);
  lcd.print("123456789 10 11 12 ");
   lcd.setCursor(0,3);
  lcd.print("*       *          ");
    }
  return stat;  //zwracamy stat sygnalizując czy dokonano zmiany (true) czy nie (false)
}

void UstawLedy()                        //funkcja steruje LEDami
 
{
  digitalWrite(0, LOW);
  digitalWrite(1, LOW);
  digitalWrite(2, HIGH);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
  }

 

Edytowano przez xirtt
Link do komentarza
Share on other sites

4 godziny temu, xirtt napisał:

Już wiem dlaczego , te dwa wyjścia są też jako 0=RX i 1=TX.

Z tego morał - albo transmisja szeregowa, albo sterowanie LED. Jeśli transmisja szeregowa z wykorzystaniem D0 i D1 to swoje LED musisz podpiąć gdzie indziej. Za dużego wyboru już nie masz  gdyż pod A0 i A1 masz przyciski, a A4 i A5 w Arduino UNO wykorzystywane są przez i2c (TWI), którego też używasz (wyświetlacz). Pozostaje więc 2 LED podpiąć pod A2 i A3. Zmieni to pętlę for ustawiającą piny, która będzie musiała wyglądać tak: for(int x=2; x<=13; x++) ....., a te dwa LEDy podłączone do A2 i A3 będziesz musiał konfigurować i ustawiać oddzielnie.

Pytasz czy dobrze wstawiłeś pierwszy program. Wyrażaj się precyzyjnie, rozumiem, że mówisz o tym:

void UstawLedy()                        //funkcja steruje LEDami
{
  digitalWrite(0, LOW);
  digitalWrite(1, LOW);
  digitalWrite(2, HIGH);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
  }

Myślę, że tak chociaż widzę, że się nie uczysz (aż się prosi o jakąś pętlę). Funkcja UstawLedy() jest wywoływana po zmianie programu więc miejsce jest dobre, ale metoda nie przemyślana. Zastanów się jak powinien działać program w tej funkcji?

Może według takiego algorytmu:

1. Resetuj wszystkie LED.

2. Ustaw te LED, które są potrzebne.

3. Wyświetl komunikat na wyświetlaczu.

Ja bym poszedł chyba w tym kierunku. Zauważ, że w programie masz zmienną program_biezacy, której wartość jest zmieniana przez ZmienProgram(). Po co? Może po to by wartość tej zmiennej wykorzystać właśnie w funkcji UstawLedy()? Może tak:

void UstawLedy()
{
  //-----------------------
  // Tu resetuję wszystkie LED i teraz
  if(program_biezacy==0) .......................
  if(program_biezacy==1) .......................
  if(program_biezacy==2) .......................  
  etc.
  //a tu wyświetlenie np. komunikatu
  Komunikat();			//tę funkcję musisz sobie stworzyć i napisać
  						//zmienna program_biezacy jest dostępna w całym Twoim programie
}

Zamiast konstrukcji if możesz użyć np. konstrukcji switch jak to już masz pokazane wcześniej.

Link do komentarza
Share on other sites

(edytowany)

Witam wszystkich serdecznie i życzę Miłego dnia.

Odpowiadam.

Przyjacielu mój "es2", próbowałem już u wszystkich świętych, tylko "BELFEREK" mnie robaka chce nauczyć czegoś więcej i tylko on ma mega cierpliwość i czas poświęca mnie robakowi . I pamiętaj przyjacielu , ja już program napisałem który działa , tylko chciałem go ulepszyć. Przeczytaj wszystkie posty powoli , a zobaczysz o co chodzi . Pozdrawiam Cię serdecznie "es2".  Piszcie wszyscy którzy chcecie, każdy post krytyczny i pozytywny jest potrzebny, bo tak POWSTAJĄ WIELKIE RZECZY.

Pozdrawiam

Teraz odpowiadam mojemu Przyjacielowi "BELFERKOWI".

To wszystko co napisałeś , to wiem. Pytałem tylko czy można zrobić tak żeby diody 0 i 1 nie świeciły, kiedy jest użyta w programie funkcja  transmisja.

Rozumie,  prosta odpowiedź jest, NIE DA SIĘ . ( swoją drogą jest już słaby punkt ARDUINO UNO)

Moja decyzja rezygnuje z transmisji . Ponieważ kiedy wykorzystam wszystkie wyjścia od 0 do 13, ładnie układają się przewody połączeniowe do diod led. Dla mnie prostota i estetyka wykonania też jest ważna.

 Dalej będę kombinował i myślał. 👨‍🔧

 

Edytowano przez xirtt
Link do komentarza
Share on other sites

Witam serdecznie, i oczywiście miłego dnia .

Jeszcze nie zajmowałem się twoimi wskazówkami dotyczących twojego programu, to potem , bawię się moim programem 👨‍🔧.

Mam koncepcje aby dodać do mojego programu pilota IR, i oto popełniłem następny programik do odczytu kodów pilota IR.

Kody wyświetla po transmisji szeregowej i jeszcze na moim wyświetlaczu ,BAJKA, BAJKA ,BAJKA😀

Tak na prawdę wyszedł mi gotowy tester pilotów IR.😀

Dołączam gotowca korzystajcie z tego wszyscy, na zdrowie 😀

(Dziękuje BELFEREK, przez tą zabawę robak zaczyna się poruszać, to mnie naprawdę wciąga , dzięki Tobie......Pozdrawiam 😀 )

#include <IRremote.h>
#define irPin A2
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
 
IRrecv irrecv(irPin);
decode_results results;
LiquidCrystal_I2C lcd(0x27,20,4);

void setup() {
   Serial.begin(9600);
   irrecv.enableIRIn();

    lcd.init(); 
    lcd.backlight();
    lcd.setCursor(0,0);
    lcd.print("     Dekoder IR    ");
    lcd.setCursor(0,2);
    lcd.print("     kody pilota   ");
   
}
 
void loop() {
   if (irrecv.decode(&results)) {
      Serial.print("0x");
      Serial.println(results.value, HEX);
      delay(100);
      irrecv.resume();
   
    lcd.init(); 
    lcd.backlight();
    lcd.setCursor(0,0);
    lcd.print("    Kody pilota     ");
    lcd.setCursor(7,2);
    lcd.print(results.value, HEX );
    irrecv.resume();

      }
}

 

Link do komentarza
Share on other sites

Gość es2
4 godziny temu, xirtt napisał:

I pamiętaj przyjacielu , ja już program napisałem który działa , tylko chciałem go ulepszyć.

Tyle, że na Elektrodzie nie widziałem abyś umieścił kod programu. Jak więc chcesz aby tam Ci pomogli?

 

Link do komentarza
Share on other sites

(edytowany)

Witam was przyjaciele, i życzę wszystkim miłego dnia.😀

Odpowiadam Tobie Przyjacielu "es2". 

Nie umieściłem swojego programu na elektrodzie , ponieważ napisałem go na podstawie programu "trzy diody i przycisk". Tak sobie pomyślałem jak bym miał mały programik " cztery diody i dwa przycisk " , to myślę  , że poradził bym sobie z adaptacją tego programiku do swojego "potwora". Dlatego nie chciałem gotowca mojego programu. Okazało się , że nie był to dobry pomysł. Ja  jednak zawsze twierdze, że w każdym człowieku jest dobroć, tylko trzeba cierpliwie czekać.

Pozdrawiam Cię serdecznie Przyjacielu "es2"

Witam Ciebie Przyjacielu  BELFEREK.😀

Czytałem o tych różnych pętlach , powiem Tobie Przyjacielu , czułem się jak by ktoś, owijał moją głowę bandażem , raz po raz jedna pętla , droga itd. i w końcu moja głowa była tak ściśnięta tymi pętlami , pętla , w pętle , do pętli , w pętli z pętlą , i już nic nie rozumiałem. Mam w głowie słowa piosenki " Życie jest małą ściemniarą,  francą, wróblicą, wygą, cwaniarą. Plącze nam nogi i mówi idź!". Odplączmy te węzły. Oczywiście jak to ja robak nie poddaje się, tylko muszę powoli i praktycznie poznać "wroga".👨‍🔧

Przyjaciele moi , czy nie myślał ktoś,  kiedyś żeby  te pętle, pętelki i te ścieżki  wyprostować, aby programowanie uprościć jak tylko się da. Jeżeli nie, to może warto spróbować. 

Ja twierdze , upraszczać , upraszczać i jeszcze raz upraszczać, im prościej tym lepiej. Mniej rzeczy które mogą się  popsuć.

Drugie moje twierdzenie , to jeżeli zrobiłeś już wszystko i sprawdziłeś już wszystko, i dalej nie działa, to wróć do tego co robiłeś i zawsze znajdziesz.

Przyjacielu mój BELFEREK, dalej myślę o twoim programie i kombinuje przy okazji z moim potworem. 👨‍🔧   

Oczywiście czekam na pomoc. 

Pozdrawia wszystkich serdecznie.😀   

 

 

Edytowano przez xirtt
Link do komentarza
Share on other sites

Anonim
Ten temat został zamknięty.
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.