@ElektrodaBot Napisz program na arduino uno z różnymi efektami dla taśmy LED WS2812b. Diod w taśmie 40. Efektów ma być 20. Efekty zmieniane są za pomocą przycisku podłączonego do wejścia D2.
Czy wolisz polską wersję strony elektroda?
Nie, dziękuję Przekieruj mnie tamhetm4n napisał:Witaj na forum elektroda.pl! Chętnie pomogę Ci napisać program dla Arduino Uno, który będzie sterował taśmą LED WS2812b z 20 różnymi efektami.Napisz program na arduino uno z różnymi efektami dla taśmy LED WS2812b. Diod w taśmie 40. Efektów ma być 20. Efekty zmieniane są za pomocą przycisku podłączonego do wejścia D2.
hetm4n napisał:Oczywiście, mogę dodać kilka dodatkowych efektów do programu. Oto zmodyfikowany kod z dodatkowymi efektami:Dodaj do programu jakieś twoje efekty.
hetm4n napisał:Cieszę się, że mogę pomóc! Oto prosty program do Arduino Uno, który odczytuje sygnał z czujnika obrotów podłączonego do pinu D2 i wyświetla wskazanie obrotów na wyświetlaczu SSD1306 o rozdzielczości 128x32.napisz program na arduino uno obrotomierza. Wskazanie wyświetlane będzie na iled ssd1306 128x32. Czujnik podpiety do pinu d2.
ElektrodaBot napisał:hetm4n napisał:Cieszę się, że mogę pomóc! Oto prosty program do Arduino Uno, który odczytuje sygnał z czujnika obrotów podłączonego do pinu D2 i wyświetla wskazanie obrotów na wyświetlaczu SSD1306 o rozdzielczości 128x32.napisz program na arduino uno obrotomierza. Wskazanie wyświetlane będzie na iled ssd1306 128x32. Czujnik podpiety do pinu d2.
Potrzebne będą nam:
1. Biblioteka Adafruit_SSD1306 - do sterowania wyświetlaczem OLED.
2. Biblioteka Adafruit_GFX - do obsługi grafiki na wyświetlaczu.
3. Biblioteka FreqMeasure - do pomiaru częstotliwości sygnału z czujnika obrotów.
Instalacja bibliotek:
1. Otwórz Arduino IDE.
2. Kliknij na "Tools" (Narzędzia) w pasku menu.
3. Wybierz "Manage Libraries…" (Zarządzaj bibliotekami…).
4. W oknie "Library Manager", wpisz "Adafruit SSD1306" w polu wyszukiwania, a następnie zainstaluj bibliotekę Adafruit_SSD1306 by Adafruit.
5. Powtórz krok 4, ale tym razem wpisz "Adafruit GFX" i zainstaluj bibliotekę Adafruit_GFX by Adafruit.
6. Następnie wpisz "FreqMeasure" i zainstaluj bibliotekę FreqMeasure by PJRC.
Oto kod programu dla Arduino Uno z czujnikiem obrotów i wyświetlaczem SSD1306:
Kod: textZaloguj się, aby zobaczyć kod
Teraz Twój Arduino będzie mierzyć i wyświetlać wskazanie obrotów na wyświetlaczu SSD1306. Upewnij się, że podłączasz czujnik obrotów do pinu D2 oraz wyświetlacz SSD1306 do odpowiednich pinów I2C (SDA i SCL).
hetm4n napisał:Przepraszam za pomyłkę w kodzie. Biblioteka FreqMeasure zaczyna pomiar częstotliwości na pinie 8 dla Arduino Uno, więc nie musimy podawać numeru pinu jako argument. Oto poprawiona wersja funkcji `setup()`:(...) lioteka Adafruit_GFX - do obsługi grafiki na wyświetlaczu.
3. Biblioteka FreqMeasure - do pomiaru częstotliwości sygnału z czujnika obrotów.
Instalacja bibliotek:
1. Otwórz Arduino IDE.
2. Kliknij na "Tools" (Narzędzia) w pasku menu.
3. Wybierz "Manage Libraries…" (Zarządzaj bibliotekami…).
4. W oknie "Library Manager", wpisz "Adafruit SSD1306" w polu wyszukiwania, a następnie zainstaluj bibliotekę Adafruit_SSD1306 by Adafruit.
5. Powtórz krok 4, ale tym razem wpisz "Adafruit GFX" i zainstaluj bibliotekę Adafruit_GFX by Adafruit.
6. Następnie wpisz "FreqMeasure" i zainstaluj bibliotekę FreqMeasure by PJRC.
Oto kod programu dla Arduino Uno z czujnikiem obrotów i wyświetlaczem SSD1306:
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <FreqMeasure.h>
#define SCREEN_WIDTH 128 // szerokość wyświetlacza OLED
#define SCREEN_HEIGHT 32 // wysokość wyświetlacza OLED
#define OLED_RESET -1 // pin RESET na wyświetlaczu OLED
#define SENSOR_PIN 2 // pin z czujnikiem obrotów
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // inicjalizacja wyświetlacza OLED
display.clearDisplay(); // wyczyszczenie bufora
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("Obrotomierz");
display.display();
FreqMeasure.begin(SENSOR_PIN); // inicjalizacja pomiaru częstotliwości na pinie D2
}
void loop() {
if (FreqMeasure.available()) {
// Odczytanie częstotliwości sygnału z czujnika obrotów
double frequency = FreqMeasure.countToFrequency(FreqMeasure.read());
double rpm = frequency * 60; // przeliczenie częstotliwości na obroty na minutę (RPM)
// Wyświetlenie wyniku na wyświetlaczu OLED
display.clearDisplay();
display.setCursor(0, 0);
display.print("RPM: ");
display.print(rpm, 0);
display.display();
}
}
Teraz Twój Arduino będzie mierzyć i wyświetlać wskazanie obrotów na wyświetlaczu SSD1306. Upewnij się, że podłączasz czujnik obrotów do pinu D2 oraz wyświetlacz SSD1306 do odpowiednich pinów I2C (SDA i SCL).
Masz błąd w kodzie :
sketch.ino: In function 'void setup()':
sketch.ino:18:31: error: no matching function for call to 'FreqMeasureClass::begin(int)'
FreqMeasure.begin(SENSOR_PIN); // inicjalizacja pomiaru częstotliwości na pinie D2
^
In file included from sketch.ino:4:0:
/libraries/FreqMeasure/FreqMeasure.h:8:14: note: candidate: static void FreqMeasureClass::begin()
static void begin(void);
^~~~~
/libraries/FreqMeasure/FreqMeasure.h:8:14: note: candidate expects 0 arguments, 1 provided
Error during build: exit status 1.
ElektrodaBot napisał:hetm4n napisał:Przepraszam za pomyłkę w kodzie. Biblioteka FreqMeasure zaczyna pomiar częstotliwości na pinie 8 dla Arduino Uno, więc nie musimy podawać numeru pinu jako argument. Oto poprawiona wersja funkcji `setup()`:(...) lioteka Adafruit_GFX - do obsługi grafiki na wyświetlaczu.
3. Biblioteka FreqMeasure - do pomiaru częstotliwości sygnału z czujnika obrotów.
Instalacja bibliotek:
1. Otwórz Arduino IDE.
2. Kliknij na "Tools" (Narzędzia) w pasku menu.
3. Wybierz "Manage Libraries…" (Zarządzaj bibliotekami…).
4. W oknie "Library Manager", wpisz "Adafruit SSD1306" w polu wyszukiwania, a następnie zainstaluj bibliotekę Adafruit_SSD1306 by Adafruit.
5. Powtórz krok 4, ale tym razem wpisz "Adafruit GFX" i zainstaluj bibliotekę Adafruit_GFX by Adafruit.
6. Następnie wpisz "FreqMeasure" i zainstaluj bibliotekę FreqMeasure by PJRC.
Oto kod programu dla Arduino Uno z czujnikiem obrotów i wyświetlaczem SSD1306:
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <FreqMeasure.h>
#define SCREEN_WIDTH 128 // szerokość wyświetlacza OLED
#define SCREEN_HEIGHT 32 // wysokość wyświetlacza OLED
#define OLED_RESET -1 // pin RESET na wyświetlaczu OLED
#define SENSOR_PIN 2 // pin z czujnikiem obrotów
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // inicjalizacja wyświetlacza OLED
display.clearDisplay(); // wyczyszczenie bufora
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("Obrotomierz");
display.display();
FreqMeasure.begin(SENSOR_PIN); // inicjalizacja pomiaru częstotliwości na pinie D2
}
void loop() {
if (FreqMeasure.available()) {
// Odczytanie częstotliwości sygnału z czujnika obrotów
double frequency = FreqMeasure.countToFrequency(FreqMeasure.read());
double rpm = frequency * 60; // przeliczenie częstotliwości na obroty na minutę (RPM)
// Wyświetlenie wyniku na wyświetlaczu OLED
display.clearDisplay();
display.setCursor(0, 0);
display.print("RPM: ");
display.print(rpm, 0);
display.display();
}
}
Teraz Twój Arduino będzie mierzyć i wyświetlać wskazanie obrotów na wyświetlaczu SSD1306. Upewnij się, że podłączasz czujnik obrotów do pinu D2 oraz wyświetlacz SSD1306 do odpowiednich pinów I2C (SDA i SCL).
Masz błąd w kodzie :
sketch.ino: In function 'void setup()':
sketch.ino:18:31: error: no matching function for call to 'FreqMeasureClass::begin(int)'
FreqMeasure.begin(SENSOR_PIN); // inicjalizacja pomiaru częstotliwości na pinie D2
^
In file included from sketch.ino:4:0:
/libraries/FreqMeasure/FreqMeasure.h:8:14: note: candidate: static void FreqMeasureClass::begin()
static void begin(void);
^~~~~
/libraries/FreqMeasure/FreqMeasure.h:8:14: note: candidate expects 0 arguments, 1 provided
Error during build: exit status 1.
Kod: textZaloguj się, aby zobaczyć kod
Teraz Twój Arduino będzie mierzyć i wyświetlać wskazanie obrotów na wyświetlaczu SSD1306. Upewnij się, że podłączasz czujnik obrotów do pinu 8 oraz wyświetlacz SSD1306 do odpowiednich pinów I2C (SDA i SCL).
hetm4n napisał:Przepraszam za pomyłki w poprzednich odpowiedziach. Oto cały poprawiony program dla Arduino Uno z czujnikiem obrotów i wyświetlaczem SSD1306:(...) miaru częstotliwości na pinie 8 (dla Arduino Uno)
}
Teraz Twój Arduino będzie mierzyć i wyświetlać wskazanie obrotów na wyświetlaczu SSD1306. Upewnij się, że podłączasz czujnik obrotów do pinu 8 oraz wyświetlacz SSD1306 do odpowiednich pinów I2C (SDA i SCL).
Napisz w całości poprawiony program.
hetm4n napisał:Przepraszam za niekompletny kod, który przekazałem wcześniej. Oto pełny i poprawiony kod, który powinien działać z czujnikiem obrotów i wyświetlaczem SSD1306 na Arduino Uno:na ekranie wyświetla się tylko napis "Obrotomierz" niestety brak wskazania obrotów.
hetm4n napisał:Oto propozycja programu na Arduino Uno sterującego dwoma diodami LED, które reagują na sygnały z sześciu czujników ultradźwiękowych. Zakładam, że używasz czujników HC-SR04. Oto kod:(...) ałączona jeżeli któryś czujnik 1 , 2 lub 3 rozpozna przeszkodę w odległości od 0cm do 10cm. Powyżej tej odległości wyłacza diode LED. Druga dioda LED ma zostać załączona jeżeli któryś czujnik 4 , 5 lub 6 rozpozna przeszkodę w odległości od 0cm do 10cm. Powyżej tej odległości wyłacza drugą diode LED.
hetm4n napisał:Oczywiście, oto program dla Arduino z jednym czujnikiem ultradźwiękowym HC-SR04 i jedną diodą LED. Dioda LED zapala się, gdy czujnik wykryje przeszkodę w odległości od 0 do 10 cm.napisz teraz program dla jednego czujnika ultradźwiękowego i jednej diody LED. Dioda led załacza się gdy czujnik zauważy przeszkodę w odległości od 0 do 10cm.
hetm4n napisał:Oto zoptymalizowany program G-code, w którym oś Z przy frezowaniu każdej linii wyjeżdża 1 mm wyżej niż zakończona linia frezowania otworu. Dopiero zakończenie frezowania danego otworu pozwoli na wyjazd osi Z do pozycji bezpiecznej Z5.(...) Z-10.000000
G01 X247.958970 Y526.378370 Z-10.000000
G01 X247.991366 Y526.366370 Z-10.000000
G01 X248.028970 Y526.388370 Z-10.000000
G01 X248.040970 Y526.420766 Z-10.000000
G01 X248.018970 Y526.458370 Z-10.000000
G01 X248.018970 Y526.458370 Z-10.000000
G00 Z5.000000
(End cutting path id: path89)
hetm4n napisał:Oto przykładowy program dla Arduino Uno, który realizuje zliczanie punktów za pomocą dwóch przycisków. Program korzysta z wyświetlacza LCD 2x16 na sterowniku HD44780 do prezentacji wyniku oraz diod LED do sygnalizacji osiągnięcia maksymalnej liczby punktów przez któregoś z graczy.(...) Przycisk B zlicza kolejno punkty co 1 naciśnięcie po prawej stronie w 2 linii wyświetlacza. Przycisk C resetuje punkty z lewej i z prawej. W 1 linii wyświetlacza zrób napis " Cymbergaj". Po osiągnięciu wyniku załącza się dioda led. Dla wyniku po lewej dioda LED A, dla wyniku po prawej dioda LED B.
ElektrodaBot napisał:hetm4n napisał:Oto przykładowy program dla Arduino Uno, który realizuje zliczanie punktów za pomocą dwóch przycisków. Program korzysta z wyświetlacza LCD 2x16 na sterowniku HD44780 do prezentacji wyniku oraz diod LED do sygnalizacji osiągnięcia maksymalnej liczby punktów przez któregoś z graczy.(...) Przycisk B zlicza kolejno punkty co 1 naciśnięcie po prawej stronie w 2 linii wyświetlacza. Przycisk C resetuje punkty z lewej i z prawej. W 1 linii wyświetlacza zrób napis " Cymbergaj". Po osiągnięciu wyniku załącza się dioda led. Dla wyniku po lewej dioda LED A, dla wyniku po prawej dioda LED B.
Kod: textZaloguj się, aby zobaczyć kod
Upewnij się, że poprawnie podłączyłeś wyświetlacz LCD i przypisałeś odpowiednie piny w sekcji inicjalizacji obiektu `LiquidCrystal lcd(12, 11, 5, 4, 3, 2);` do rzeczywistych połączeń na Twoim Arduino. Analogicznie, przypisz piny przycisków i diod LED do zmiennych `buttonAPin`, `buttonBPin`, `buttonCPin`, `ledAPin` oraz `ledBPin`.
Program używa prostego algorytmu debounce do filtracji drgań styków przycisków. Po osiągnięciu 10 punktów dla danego gracza, odpowiadająca mu dioda LED zostanie załączona. Wciśnięcie przycisku C spowoduje zresetowanie wyniku i wyłączenie diod LED.
hetm4n napisał:Wygląda na to, że problem leży w obsłudze anty-drganiowej (debounce) przycisków. W aktualnym kodzie resetujesz `lastDebounceTime` co każde wywołanie pętli `loop()`, kiedy stan przycisku A lub B jest różny od ostatniego stanu. To może powodować, że czas debounce nigdy nie zostanie przekroczony, ponieważ będzie stale resetowany. Spróbujmy poprawić obsługę przycisków dla A i B, a także dodać poprawne obsłużenie przycisku C. Poniżej znajdziesz poprawiony kod:(...) o filtracji drgań styków przycisków. Po osiągnięciu 10 punktów dla danego gracza, odpowiadająca mu dioda LED zostanie załączona. Wciśnięcie przycisku C spowoduje zresetowanie wyniku i wyłączenie diod LED.
Program wyświetla dobrze, natomiast nie liczy punktów gdy naciskam przyciski. Popraw program.
ElektrodaBot napisał:hetm4n napisał:Wygląda na to, że problem leży w obsłudze anty-drganiowej (debounce) przycisków. W aktualnym kodzie resetujesz `lastDebounceTime` co każde wywołanie pętli `loop()`, kiedy stan przycisku A lub B jest różny od ostatniego stanu. To może powodować, że czas debounce nigdy nie zostanie przekroczony, ponieważ będzie stale resetowany. Spróbujmy poprawić obsługę przycisków dla A i B, a także dodać poprawne obsłużenie przycisku C. Poniżej znajdziesz poprawiony kod:(...) o filtracji drgań styków przycisków. Po osiągnięciu 10 punktów dla danego gracza, odpowiadająca mu dioda LED zostanie załączona. Wciśnięcie przycisku C spowoduje zresetowanie wyniku i wyłączenie diod LED.
Program wyświetla dobrze, natomiast nie liczy punktów gdy naciskam przyciski. Popraw program.
Kod: textZaloguj się, aby zobaczyć kod
W powyższym kodzie zmieniłem stan początkowy zmiennych przechowujących ostatni stan przycisków na `HIGH`, ponieważ przyciski są skonfigurowane z rezystorem pull-up, co oznacza że nie naciśnięty przycisk będzie miał stan `HIGH`. Ostatni debounce time jest aktualizowany tylko wtedy, gdy faktycznie wykryto naciśnięcie przycisku, co powinno rozwiązać problem z niewłaściwym zliczaniem punktów. Ponadto, w obsłudze przycisku C dodano sprawdzenie debounce, aby uniknąć fałszywych resetów spowodowanych drganiami styków.
hetm4n napisał:Przepraszam za wcześniejszy błąd. Problem, o którym wspomniałeś, może wynikać z nieprawidłowego wyświetlania wyniku po resecie. Aby zapewnić, że wyniki zaczynają się od 0 po resecie, powinniśmy również wyczyścić odpowiednie segmenty wyświetlacza LCD, aby nie pozostały tam poprzednie cyfry. Oto zmodyfikowany fragment kodu, który zajmuje się resetowaniem wyników:(...) roblem z niewłaściwym zliczaniem punktów. Ponadto, w obsłudze przycisku C dodano sprawdzenie debounce, aby uniknąć fałszywych resetów spowodowanych drganiami styków.
działa ale jest błąd w liczeniu. Gdy osiągniemy wynik 10 i zrobimy reset przyciskiem C, to program liczy punkty 10-90 zamiast od 0-10.
hetm4n napisał:Aby wykorzystać dwa wyświetlacze siedmiosegmentowe do zliczania punktów dla dwóch graczy, będziemy potrzebować dodatkowych komponentów, takich jak dwa dekodery BCD do 7-segmentów (np. układ 74HC595) lub wykorzystać bezpośrednie sterowanie z Arduino, jeśli mamy wystarczającą ilość wolnych pinów. Poniżej znajdziesz przykładowy program wykorzystujący dwa wyświetlacze siedmiosegmentowe z bezpośrednim sterowaniem z Arduino:Działa. Zrób teraz taki program ale z wykorzystanie 2 wyświetlaczy siedmio-segmentowych LED. 1 wyświetlacz dla gracza A, 2 wyświetlacz dla gracza B. Liczenie punktów od 0-9
ElektrodaBot napisał:hetm4n napisał:Aby wykorzystać dwa wyświetlacze siedmiosegmentowe do zliczania punktów dla dwóch graczy, będziemy potrzebować dodatkowych komponentów, takich jak dwa dekodery BCD do 7-segmentów (np. układ 74HC595) lub wykorzystać bezpośrednie sterowanie z Arduino, jeśli mamy wystarczającą ilość wolnych pinów. Poniżej znajdziesz przykładowy program wykorzystujący dwa wyświetlacze siedmiosegmentowe z bezpośrednim sterowaniem z Arduino:Działa. Zrób teraz taki program ale z wykorzystanie 2 wyświetlaczy siedmio-segmentowych LED. 1 wyświetlacz dla gracza A, 2 wyświetlacz dla gracza B. Liczenie punktów od 0-9
Kod: textZaloguj się, aby zobaczyć kod
W tym programie zakładamy, że używamy wyświetlaczy z wspólną anodą, dlatego wysokie stany na pinach segmentów są ustawiane jako wyłączone (`LOW`), a niski stan (`LOW`) na pinie wyświetlacza aktywuje wyświetlacz. Dla wyświetlaczy z wspólną katodą musielibyśmy odwrócić logikę stanów.
Ponieważ wyświetlacze są sterowane bezpośrednio z pinów Arduino, wykorzystujemy prostą metodę multiplexingu, włączając każdy wyświetlacz na bardzo krótki czas wewnątrz funkcji `updateDisplay()`. Ta metoda nie jest idealna i może powodować pewne migotanie wyświetlaczy, ale dla prostego zliczania punktów powinna być wystarczająca.
Pamiętaj, że używając bezpośredniego sterowania wyświetlaczem, każdy segment wyświetlacza musi być podłączony do osobnego pinu Arduino. Upewnij się, że podłączyłeś wyświetlacze zgodnie z definicją pinów w tablicy `segments[]` oraz `displayAPin` i `displayBPin`.
hetm4n napisał:Przepraszam za zamieszanie. Jeśli program nie działa poprawnie, to możliwe, że problemem jest logiczne zarządzanie stanami przycisków, które nie są odpowiednio filtrowane dla drgań styków (debouncing), lub sposób obsługi wyświetlaczy, który może nie być odpowiedni do Twojej konfiguracji sprzętowej.(...) o sterowania wyświetlaczem, każdy segment wyświetlacza musi być podłączony do osobnego pinu Arduino. Upewnij się, że podłączyłeś wyświetlacze zgodnie z definicją pinów w tablicy `segments[]` oraz `displayAPin` i `displayBPin`.
Niestety nie działa. program coś zlicza losowo, nie reaguje na przyciski.