25-02-2024, 14:20
Cześć, na wstępie jestem nowy zarówno na tym forum jak i w temacie Arduino tak więc witam wszystkich .
Potrzebuje pomocy z małym projektem już mniejsza oco w nim chodzi, ale głowie się w jaki sposób upchać 3 osobne działające programy w jeden tak by po uruchomieniu arduino to użytkownik wybierał jaki ma odpalić.
Dla rozjaśnienia do arduino podłączyłem wyświetlacz lcd 2x16 z wlutowanym I2C, wszystko działa do tego przyciski w pinach 6,5,4 pwm. Pin 6 jako przycisk ma służyć do zatwierdzania a pin 5,4 do wybierania prawo lewo(czy analogicznie więcej mniej). Napisałem z pomocą GPTchatu 3 działające w pełni programy ale z tym już nie jest w stanie mi pomóc. Reasumując potrzebuje z 3 osobnych działających programów zrobić tak aby po uruchomieniu użytkownik sam wybierał jaki program uruchomić, a więc na wyświetlaczu po uruchomieniu powinno sie wyświetlić jaki "Wybierz program np2" i przyciskami 5,4 użytkownik wybiera a 6 zatwierdza i arduino odpala wybrany program. Zaznacze że są to dosyć rozbudowane programy końcowy program może mieć nawet około 500 wierszy. Czy w ogóle jest możliwe zrobić coś takiego? Prosze o pomoc
Oto wspomniane 3 gotowe i działające programy:
Potrzebuje pomocy z małym projektem już mniejsza oco w nim chodzi, ale głowie się w jaki sposób upchać 3 osobne działające programy w jeden tak by po uruchomieniu arduino to użytkownik wybierał jaki ma odpalić.
Dla rozjaśnienia do arduino podłączyłem wyświetlacz lcd 2x16 z wlutowanym I2C, wszystko działa do tego przyciski w pinach 6,5,4 pwm. Pin 6 jako przycisk ma służyć do zatwierdzania a pin 5,4 do wybierania prawo lewo(czy analogicznie więcej mniej). Napisałem z pomocą GPTchatu 3 działające w pełni programy ale z tym już nie jest w stanie mi pomóc. Reasumując potrzebuje z 3 osobnych działających programów zrobić tak aby po uruchomieniu użytkownik sam wybierał jaki program uruchomić, a więc na wyświetlaczu po uruchomieniu powinno sie wyświetlić jaki "Wybierz program np2" i przyciskami 5,4 użytkownik wybiera a 6 zatwierdza i arduino odpala wybrany program. Zaznacze że są to dosyć rozbudowane programy końcowy program może mieć nawet około 500 wierszy. Czy w ogóle jest możliwe zrobić coś takiego? Prosze o pomoc
Oto wspomniane 3 gotowe i działające programy:
Kod:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
const int lcdAdres = 0x27;
const int lcdKolumny = 16;
const int lcdWiersze = 2;
LiquidCrystal_I2C lcd(lcdAdres, lcdKolumny, lcdWiersze);
const int pinPwm = 2;
const int pinPrzycisk = 7;
const int pinRozpoczecie = 6; // Przycisk rozpoczynający sekwencję
unsigned long czasRozpoczecia = 0;
bool rozpoczetoOdliczanie = false;
unsigned long czasPoczatkowyLiczenia = 0; // Zmienna przechowująca czas rozpoczęcia liczenia punktów
const int opoznienieAutomatycznegoStartu = 4000;
int punkty = 0;
bool poprzedniStanPrzycisku = HIGH;
bool pierwszeLiczenieZakonczone = false;
bool drugieLiczenieZakonczone = false;
int czestotliwoscBuzzer1 = 4000;
int czasDzwiekuBuzzer1 = 900;
int czestotliwoscBuzzer2 = 4000;
int czasDzwiekuBuzzer2 = 300;
void setup() {
Wire.begin();
lcd.begin(lcdKolumny, lcdWiersze);
lcd.backlight();
pinMode(pinPwm, OUTPUT);
pinMode(pinPrzycisk, INPUT_PULLUP);
pinMode(pinRozpoczecie, INPUT_PULLUP); // Ustawienie pinu rozpoczynającego sekwencję jako wejście z rezystorem pull-up
}
void loop() {
unsigned long obecnyCzas = millis();
unsigned long uplywCzasu = obecnyCzas - czasRozpoczecia;
// Rozpoczęcie sekwencji po wciśnięciu przycisku na pinie rozpoczynającym sekwencję
if (digitalRead(pinRozpoczecie) == LOW && !rozpoczetoOdliczanie) {
rozpocznijOdliczanie();
}
if (digitalRead(pinPrzycisk) == LOW && !rozpoczetoOdliczanie && poprzedniStanPrzycisku == HIGH && digitalRead(pinRozpoczecie) == LOW) {
rozpocznijOdliczanie();
poprzedniStanPrzycisku = LOW;
} else if (digitalRead(pinPrzycisk) == HIGH) {
poprzedniStanPrzycisku = HIGH;
}
if (rozpoczetoOdliczanie) {
if (uplywCzasu < opoznienieAutomatycznegoStartu) {
wyswietlTekst("Rozpoczynam za:", floatNaTekst((opoznienieAutomatycznegoStartu - uplywCzasu) / 1000.0, 1));
} else if (uplywCzasu < opoznienieAutomatycznegoStartu + 10000) {
wyswietlTekst("Czas 10 sekund:_", floatNaTekst((10 - (uplywCzasu - opoznienieAutomatycznegoStartu) / 1000.0), 1));
// Warunek sprawdzający, czy minęło co najmniej 4 sekundy od rozpoczęcia liczenia punktów
if (!pierwszeLiczenieZakonczone && obecnyCzas - czasPoczatkowyLiczenia >= 4000) {
pierwszeLiczenieZakonczone = true;
uruchomBuzzer(czestotliwoscBuzzer1, czasDzwiekuBuzzer1);
}
if (digitalRead(pinPrzycisk) == LOW) {
punkty++;
if (punkty > 99) {
punkty = 0;
}
delay(245);
}
lcd.setCursor(13, 1);
lcd.print(punkty / 10);
lcd.setCursor(14, 1);
lcd.print(punkty % 10);
} else {
wyswietlTekst("Koniec liczenia:", "");
if (!drugieLiczenieZakonczone) {
drugieLiczenieZakonczone = true;
uruchomBuzzer(czestotliwoscBuzzer2, czasDzwiekuBuzzer2);
}
rozpoczetoOdliczanie = false;
punkty = 0;
}
}
}
void rozpocznijOdliczanie() {
czasRozpoczecia = millis();
rozpoczetoOdliczanie = true;
czasPoczatkowyLiczenia = millis(); // Ustawienie początkowego czasu liczenia punktów
punkty = 0;
pierwszeLiczenieZakonczone = false; // Resetujemy flagę po rozpoczęciu nowej rundy
drugieLiczenieZakonczone = false; // Resetujemy flagę po rozpoczęciu nowej rundy
}
void uruchomBuzzer(int czestotliwosc, int czasDzwieku) {
tone(pinPwm, czestotliwosc, czasDzwieku); // Uruchomienie buzzera na podanej częstotliwości przez podany czas
delay(czasDzwieku); // Oczekaj, aby dźwięk buzzer'a trwał przez określony czas
noTone(pinPwm); // Wyłączenie buzzer'a
}
void wyswietlTekst(String linia1, String linia2) {
lcd.setCursor(0, 0);
lcd.print(linia1);
if (linia2 != "") {
lcd.setCursor(0, 1);
lcd.print(linia2);
}
}
String floatNaTekst(float wartosc, int miejscaPoPrzecinku) {
char bufor[10];
dtostrf(wartosc, 1, miejscaPoPrzecinku, bufor);
return String(bufor);
}
Kod:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
const int lcdAdres = 0x27;
const int lcdKolumny = 16;
const int lcdWiersze = 2;
LiquidCrystal_I2C lcd(lcdAdres, lcdKolumny, lcdWiersze);
const int pinPwm = 2; // Pin dla buzzer
const int pinPrzycisk = 7;
const int pinRozpoczecie = 6; // Przycisk rozpoczynający sekwencję
unsigned long czasRozpoczecia = 0;
bool rozpoczetoOdliczanie = false;
unsigned long czasPoczatkowyLiczenia = 0; // Zmienna przechowująca czas rozpoczęcia liczenia punktów
unsigned long czasPoczatkowyWstepnegoLiczenia = 0; // Zmienna przechowująca czas rozpoczęcia odliczania wstępnego
const int opoznienieAutomatycznegoStartu = 4000;
int punkty = 0;
bool poprzedniStanPrzycisku = HIGH;
void setup() {
Wire.begin();
lcd.begin(lcdKolumny, lcdWiersze);
lcd.backlight();
pinMode(pinPwm, OUTPUT);
pinMode(pinPrzycisk, INPUT_PULLUP);
pinMode(pinRozpoczecie, INPUT_PULLUP); // Ustawienie pinu rozpoczynającego sekwencję jako wejście z rezystorem pull-up
}
void loop() {
unsigned long obecnyCzas = millis();
unsigned long uplywCzasu = obecnyCzas - czasRozpoczecia;
// Rozpoczęcie sekwencji po wciśnięciu przycisku na pinie rozpoczynającym sekwencję
if (digitalRead(pinRozpoczecie) == LOW && !rozpoczetoOdliczanie) {
lcd.clear(); // Wyczyszczenie wyświetlacza przed nową akcją
rozpocznijLiczeniePunktow();
liczenieWstepne();
}
if (digitalRead(pinPrzycisk) == LOW && !rozpoczetoOdliczanie && poprzedniStanPrzycisku == HIGH && digitalRead(pinRozpoczecie) == LOW) {
lcd.clear(); // Wyczyszczenie wyświetlacza przed nową akcją
rozpocznijLiczeniePunktow();
liczenieWstepne();
poprzedniStanPrzycisku = LOW;
} else if (digitalRead(pinPrzycisk) == HIGH) {
poprzedniStanPrzycisku = HIGH;
}
if (rozpoczetoOdliczanie) {
if (punkty < 10) {
// Wyczyszczenie wyświetlacza przed nową akcją
// Liczenie punktów
wyswietlTekst("Czas: " + floatNaTekst((obecnyCzas - czasPoczatkowyLiczenia) / 1000.0, 2) + "s", "Punkty: " + String(punkty) + "P - 10P");
if (digitalRead(pinPrzycisk) == LOW) {
punkty++;
if (punkty > 10) {
punkty = 10; // Maksymalnie do 10 punktów
}
delay(245);
}
} else {
// Wyłączanie buzzer po zakończeniu odliczania punktów
noTone(pinPwm);
// Wyświetlanie komunikatu po osiągnięciu 10 punktów
if (digitalRead(pinPrzycisk) == LOW) {
wyswietlWynikCzasuIPunktow();
while (digitalRead(pinPrzycisk) == LOW) {} // Czekaj, aż przycisk zostanie zwolniony
}
rozpoczetoOdliczanie = false;
punkty = 0;
// Włączanie buzzer po zakończeniu odliczania punktów
tone(pinPwm, 4000); // Częstotliwość 830 Hz
delay(300); // Buzzer działa przez 0.5 sekundy
noTone(pinPwm); // Wyłączanie buzzera
}
}
}
void rozpocznijLiczeniePunktow() {
czasRozpoczecia = millis();
czasPoczatkowyLiczenia = millis(); // Zresetowanie czasu początkowego liczenia
rozpoczetoOdliczanie = true;
punkty = 0;
}
void liczenieWstepne() {
czasPoczatkowyWstepnegoLiczenia = millis();
while (millis() - czasPoczatkowyWstepnegoLiczenia < opoznienieAutomatycznegoStartu) {
wyswietlTekst("START ZA: ", floatNaTekst((opoznienieAutomatycznegoStartu - (millis() - czasPoczatkowyWstepnegoLiczenia)) / 1000.0, 2) + "s");
}
// Włączanie buzzer po zakończeniu odliczania wstępnego
tone(pinPwm, 4000); // Częstotliwość 830 Hz
delay(900); // Buzzer działa przez 0.5 sekundy
noTone(pinPwm); // Wyłączanie buzzera
// Reset czasu początkowego liczenia głównego
czasPoczatkowyLiczenia = millis();
}
void wyswietlTekst(String linia1, String linia2) {
lcd.setCursor(0, 0);
lcd.print(linia1);
if (linia2 != "") {
lcd.setCursor(0, 1);
lcd.print(linia2);
}
}
String floatNaTekst(float wartosc, int miejscaPoPrzecinku) {
char bufor[10];
dtostrf(wartosc, 1, miejscaPoPrzecinku, bufor);
return String(bufor);
}
void wyswietlWynikCzasuIPunktow() {
lcd.setCursor(0, 0);
lcd.print("Koniec :");
lcd.setCursor(0, 1);
lcd.print("Czas: ");
lcd.print(floatNaTekst((millis() - czasPoczatkowyLiczenia) / 1000.0, 2));
lcd.print("s");
delay(3000); // Poczekaj 3 sekundy przed powrotem do normalnego działania
}
Kod:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
const int lcdAdres = 0x27;
const int lcdKolumny = 16;
const int lcdWiersze = 2;
LiquidCrystal_I2C lcd(lcdAdres, lcdKolumny, lcdWiersze);
const int pinPrzycisk = 7;
const int pinRozpoczecie = 6; // Przycisk rozpoczynający sekwencję
const int pinBuzzer = 2; // Pin podłączony do buzzera
unsigned long czasRozpoczecia = 0;
bool rozpoczetoOdliczanie = false;
unsigned long czasPoczatkowyLiczenia = 0; // Zmienna przechowująca czas rozpoczęcia liczenia punktów
const int opoznienieAutomatycznegoStartu = 4000;
int punkty = 0;
bool poprzedniStanPrzycisku = HIGH;
void setup() {
Wire.begin();
lcd.begin(lcdKolumny, lcdWiersze);
lcd.backlight();
pinMode(pinPrzycisk, INPUT_PULLUP);
pinMode(pinRozpoczecie, INPUT_PULLUP); // Ustawienie pinu rozpoczynającego sekwencję jako wejście z rezystorem pull-up
}
void loop() {
unsigned long obecnyCzas = millis();
unsigned long uplywCzasu = obecnyCzas - czasRozpoczecia;
// Rozpoczęcie sekwencji po wciśnięciu przycisku na pinie rozpoczynającym sekwencję
if (digitalRead(pinRozpoczecie) == LOW && !rozpoczetoOdliczanie) {
rozpocznijOdliczanie();
}
if (digitalRead(pinPrzycisk) == LOW && !rozpoczetoOdliczanie && poprzedniStanPrzycisku == HIGH && digitalRead(pinRozpoczecie) == LOW) {
rozpocznijOdliczanie();
poprzedniStanPrzycisku = LOW;
} else if (digitalRead(pinPrzycisk) == HIGH) {
poprzedniStanPrzycisku = HIGH;
}
if (rozpoczetoOdliczanie) {
if (uplywCzasu < opoznienieAutomatycznegoStartu) {
wyswietlTekst("Rozpoczynam za:", floatNaTekst((opoznienieAutomatycznegoStartu - uplywCzasu) / 1000.0, 1));
} else {
// Obliczanie czasu
unsigned long czasTrwania = obecnyCzas - czasRozpoczecia;
int godziny = czasTrwania / 3600000; // 1 godzina = 3600 sekund * 1000 (przekształcone na milisekundy)
int minuty = (czasTrwania % 3600000) / 60000; // Pozostały czas po odjęciu godzin, dzielony przez 60 sekund * 1000
int sekundy = ((czasTrwania % 3600000) % 60000) / 1000; // Pozostały czas po odjęciu godzin i minut, dzielony przez 1000
wyswietlTekst("Czas oraz Punkty:", String(godziny) + "h " + String(minuty) + "m " + String(sekundy) + "s");
// Liczenie punktów
if (digitalRead(pinPrzycisk) == LOW) {
punkty++;
buzz();
delay(165);
}
lcd.setCursor(13, 1);
lcd.print(punkty / 100);
lcd.setCursor(14, 1);
lcd.print((punkty % 100) / 10);
lcd.setCursor(15, 1);
lcd.print(punkty % 10);
}
}
}
void rozpocznijOdliczanie() {
czasRozpoczecia = millis();
rozpoczetoOdliczanie = true;
czasPoczatkowyLiczenia = millis(); // Ustawienie początkowego czasu liczenia punktów
punkty = 0;
}
void wyswietlTekst(String linia1, String linia2) {
lcd.setCursor(0, 0);
lcd.print(linia1);
if (linia2 != "") {
lcd.setCursor(0, 1);
lcd.print(linia2);
}
}
String floatNaTekst(float wartosc, int miejscaPoPrzecinku) {
char bufor[10];
dtostrf(wartosc, 1, miejscaPoPrzecinku, bufor);
return String(bufor);
}
void buzz() {
tone(pinBuzzer, 4000); // Włącz buzzer na częstotliwości 850 Hz
delay(200); // Poczekaj 0.5 sekundy
noTone(pinBuzzer); // Wyłącz buzzer
}