SOYER Styczeń 24, 2021 Udostępnij Styczeń 24, 2021 (edytowany) Chłopie, program robi dokładnie to co mu napisałeś... patrz, jak się program zaczyna to zmienna przyciskKolor wynosi 1, więc program do czasu aż nie wciśniesz przycisku od zielonej diody sprawdza tylko case 1 bo przyciskKolor=1, a w case 1 nie sprawdzasz przycisku od czerwonej diody tylko od zielonej... dopiero kiedy wciśniesz przycisk od zielonej zmieniasz przyciskKolor na 2 i w case 2 dopiero sprawdzasz czerwoną, ale znów nie zielonej... a w case 3, ustawiasz przyciskKolor=4, więc jak ma wrócić do 1?? Edytowano Styczeń 24, 2021 przez SOYER 1
Norbert7630 Styczeń 24, 2021 Udostępnij Styczeń 24, 2021 Coś mi z tą 4 nie za bardzo pasowało to tak jakby miał być case 4: którego nie ma ech......nie komentuje nawet tego swojego myślenia przepraszam @SOYER
szczepko Luty 10, 2023 Udostępnij Luty 10, 2023 (edytowany) Edit (1h później...): Przeanalizowałem twój kod, @bakardi92, i ogarnąłem o co chodzi. Samo pulsowanie wyświetlacza przypisuję nagminnemu używaniu lcd.clear();, przez brak zrozumienia kodu, z którego korzystałem. (Lenistwo wzięło górę i nie spędziłem czasu z herbatką na analizę kodu.) Nawet jeśli żaden z Was tego wpisu nie przeczytał, to dziękuję za współtworzenie tego forum i życzę dobrego dnia Mam pytanko do @SOYER i @bakardi92: co robi zmienna int lock, która jest najpierw ustawiana a potem zerowana? Akurat piszę program oparty na twoim, @bakardi92, i mam problem przy wpisywaniu danych; będąc w ekranie 1 i chcąc przejść do ekranu 2, gdzie wpisuję dane, program tylko raz mignie ekranem 2 i od razu jestem z powrotem w ekranie 1. (Numeracja tak przyjęta, aby opisać program.) Czyżby jakaś koincydencja mojego przypadku z brakiem funkcji lock? Poza tym borykam się z 'pulsowaniem' ekranu (wyświetlacz lcd 20x4)... Edytowano Luty 10, 2023 przez szczepko Użytkownik sam rozwiązał problem zawarty we wpisie 1
SOYER Luty 12, 2023 Udostępnij Luty 12, 2023 @szczepko wklej tutaj Twój szkic to chętnie pomożemy. Inaczej to tylko zgadywanie.
Adadadi Luty 17, 2023 Udostępnij Luty 17, 2023 (edytowany) Witam. Od kilku dni pracuję nad napisaniem kodu dzięki któremu można byłoby stworzyć prosty "BoardComputer". Jako, że korzystałem z rad zawartych w tym temacie uważam za sprawiedliwe zamieszczenie całości programu, który napisałem do tej pory. Zresztą prędzej czy później będą pewnie potrzebował pomocy przy pisaniu więc lepiej jak bardziej zaawansowani na bieżąco będą śledzić rozwój "tego czegoś". Na zdjęciach zamieszczam ogólny obraz tego co chcę stworzyć. Mam nadzieję, że rozrysowałem to zrozumiale. Ad1. W programie nie ma dziury między Menu7 a Menu8, po prostu zapomniałem o tej opcji i zacząłem rozpisywać opcję "ścieżka" Ad2. Odnośnie części: Ścieżka -( tutaj jeszcze kod nie gotowy, tylko przedstawiam jak to chciałbym aby wyglądało) "Ścieżka" - wyświetlane tylko jeśli w M3 włączona opcja "Ścieżki technologiczne" 1 "|" 4 to jest wartość z M1 i wartość z M4 natomiast II jest wyświetlane jeśli M1=M5 Ad3. Czujniki indukcyjne to LJ18A3-8-Z/BY - po wykryciu impulsu pojawić się + na pin arduino Ad4. Siłownik to będzie coś takiego https://botland.com.pl/silowniki-liniowe/5362-silownik-elektryczny-super-power-jack-2000n-75mms-12v-wysuw-20cm-5904422306892.html?cd=18298825651&ad=&kd=&gclid=Cj0KCQiA6LyfBhC3ARIsAG4gkF-fnE3OBXOnmTWu5K6KpaPbP1dSM5hJ2YWV_5ZCsN-XR_cVLs69cgYaAhR6EALw_wcB #include <EasyButton.h> #include <EasyButtonBase.h> #include <EasyButtonTouch.h> #include <EasyButtonVirtual.h> #include <Sequence.h> #include <Timers.h> #include <LiquidCrystal_I2C.h> #include <Wire.h> #define BTN_BACK 11 #define BTN_NEXT 10 #define BTN_PREV 12 #define BTN_OK 13 EasyButton NEXT(BTN_NEXT); EasyButton PREV(BTN_PREV); EasyButton OK(BTN_OK); EasyButton BACK(BTN_BACK); Timer timer; int AktPrz = 2; // aktualny przejazd float SzerRob = 3; // szer robocza narzędzia bool ScTech = 0; // sciezki czy włączone int SzSc = 4; // szerokosc sciezki int KiedSc = 4; // w ktorym przejazdzie sciezka float ObKo = 5.28; // obwod koła int Imp = 6; //ile impulsow na obrot koła int Op = 100; // opuznienie imp tuz int A = 0; unsigned long czas = millis(); unsigned long time = 0; LiquidCrystal_I2C lcd(0x27, 20, 4); void setup() { Serial.begin(9600); lcd.begin(20, 4); lcd.init(); lcd.backlight(); timer.begin(500); NEXT.begin(); PREV.begin(); pinMode(BTN_BACK, INPUT_PULLUP); pinMode(BTN_OK, INPUT_PULLUP); } void loop() { NEXT.read(); PREV.read(); OK.read(); BACK.read(); switch (A) { case 0: lcd.setCursor(0, 0); lcd.print("Predkosc"); lcd.setCursor(0, 1); lcd.print(10.10); // odczyt z czuj prędkości lcd.setCursor(6, 1); lcd.print("km/h"); lcd.setCursor(0, 2); lcd.print("Wydajnosc"); lcd.setCursor(0, 3); lcd.print(1.2); // odczyt z czuj prędkości * szerokość maszyny lcd.setCursor(6, 3); lcd.print("ha/h"); lcd.setCursor(15, 0); lcd.print("WOM"); lcd.setCursor(13, 1); lcd.print(540); // odczyt czujnik wom lcd.setCursor(17, 1); lcd.print("RPM"); lcd.setCursor(13, 2); if (ScTech = 1) { lcd.print("Sciezka"); lcd.setCursor(12,3); lcd.print(AktPrz); lcd.setCursor(14,3); lcd.print("Z"); lcd.setCursor(15,3); lcd.print(SzSc); } if (OK.wasReleased()) { A++; lcd.clear(); } if (BACK.wasReleased()) { A++; lcd.clear(); } break; case 1: lcd.setCursor(0, 0); lcd.print("BD"); lcd.setCursor(0, 1); lcd.print(00); // odczyt z czuj prędkości lcd.setCursor(6, 1); lcd.print("km/h"); lcd.setCursor(0, 2); lcd.print("BD"); lcd.setCursor(0, 3); lcd.print(00); // odczyt z czuj prędkości * szerokość maszyny lcd.setCursor(6, 3); lcd.print("ha/h"); lcd.setCursor(15, 0); lcd.print("BD"); lcd.setCursor(13, 1); lcd.print(00); // odczyt czujnik wom lcd.setCursor(17, 1); lcd.print("RPM"); lcd.setCursor(13, 2); lcd.print("BD"); lcd.setCursor(15, 3); lcd.print(111); if (OK.wasReleased()) { A++; lcd.clear(); } if (BACK.wasReleased()) { A--; lcd.clear(); } break; case 2: lcd.home(); lcd.setCursor(0, 0); lcd.print("Aktualny przejazd"); lcd.setCursor(0, 1); lcd.print(AktPrz); // z czuj tuz if (NEXT.wasReleased()) { AktPrz = AktPrz + 1; } if (PREV.wasReleased()) { AktPrz = AktPrz - 1; } if (OK.wasReleased()) { A++; lcd.clear(); } if (BACK.wasReleased()) { A--; lcd.clear(); } break; case 3: lcd.home(); lcd.setCursor(0, 0); lcd.print("Szer robocza"); lcd.setCursor(0, 1); lcd.print(SzerRob); // odczyt z czuj prędkości lcd.setCursor(10, 1); lcd.print("m"); if (NEXT.wasReleased()) { SzerRob = SzerRob + 0.05; } if (PREV.wasReleased()) { SzerRob = SzerRob - 0.05; } if (OK.wasReleased()) { A++; lcd.clear(); } if (BACK.wasReleased()) { A--; lcd.clear(); } break; case 4: lcd.home(); lcd.setCursor(0, 0); lcd.print("Czy sciezki aktywne"); lcd.setCursor(0, 1); lcd.print(ScTech); lcd.setCursor(10, 1); if (NEXT.wasReleased()) { ScTech = ScTech = 1; } if (PREV.wasReleased()) { ScTech = ScTech = 0; } if (OK.wasReleased()) { A++; lcd.clear(); } if (BACK.wasReleased()) { A--; lcd.clear(); } break; case 5: lcd.home(); lcd.setCursor(0, 0); lcd.print("Szerokosc sciezki"); lcd.setCursor(0, 1); lcd.print(SzSc); // odczyt z czuj prędkości if (NEXT.wasReleased()) { SzSc = SzSc + 1; } if (PREV.wasReleased()) { SzSc = SzSc - 1; } if (OK.wasReleased()) { A++; lcd.clear(); } if (BACK.wasReleased()) { A--; lcd.clear(); } break; case 6: lcd.home(); lcd.setCursor(0, 0); lcd.print("Przejazd sciezki"); lcd.setCursor(0, 1); lcd.print(KiedSc); // odczyt z czuj prędkości if (NEXT.wasReleased()) { KiedSc = KiedSc + 1; } if (PREV.wasReleased()) { KiedSc = KiedSc - 1; } if (OK.wasReleased()) { A++; lcd.clear(); } if (BACK.wasReleased()) { A--; lcd.clear(); } break; case 7: lcd.home(); lcd.setCursor(0, 0); lcd.print("Obwod kola"); lcd.setCursor(0, 1); lcd.print(ObKo); // odczyt z czuj prędkości lcd.setCursor(10, 1); lcd.print("m"); if (NEXT.wasReleased()) { ObKo = ObKo + 0.05; } if (PREV.wasReleased()) { ObKo = ObKo - 0.05; } if (OK.wasReleased()) { A++; lcd.clear(); } if (BACK.wasReleased()) { A--; lcd.clear(); } break; case 8: lcd.home(); lcd.setCursor(0, 0); lcd.print("Ile IMP na obrot"); lcd.setCursor(0, 1); lcd.print(Imp); // odczyt z czuj prędkości lcd.setCursor(10, 1); lcd.print("m"); if (NEXT.wasReleased()) { Imp = Imp + 1; } if (PREV.wasReleased()) { Imp = Imp - 1; } if (OK.wasReleased()) { A++; lcd.clear(); } if (BACK.wasReleased()) { A--; lcd.clear(); } break; case 9: lcd.home(); lcd.setCursor(0, 0); lcd.print("Opuznienie zliczania"); lcd.setCursor(0, 1); lcd.print(Op); // odczyt z czuj prędkości lcd.setCursor(10, 1); lcd.print("sec"); if (NEXT.wasReleased()) { Op = Op + 1; } if (PREV.wasReleased()) { Op = Op - 1; } if (OK.wasReleased()) { A--; lcd.clear(); } if (BACK.wasReleased()) { A--; lcd.clear(); } break; } } EDIT: Oczywiście narazie mam tylko część Menu i BoardComputer. Jeszcze nie zacząłem pisać kodu części "wykonawczej" i tutaj pytanie. To ma być przed switch czy po? Edytowano Luty 17, 2023 przez Adadadi
SOYER Luty 17, 2023 Udostępnij Luty 17, 2023 (edytowany) 26 minut temu, Adadadi napisał: Jeszcze nie zacząłem pisać kodu części "wykonawczej" i tutaj pytanie. To ma być przed switch czy po? To nie ma najmniejszego znaczenia, ale... Z tego pięknego switcha zrób osobną funkcję, np. menu_glowne() w którym będziesz odpalał te rzeczy które akurat potrzebujesz. Same ekrany, czyli jedną konkretną "klatkę"(obrazu) na lcd, też zrób jako osobne funkcje. Część wykonawczą też podziel na funkcje które będą miały konkretne zadanie. Następnie wywołuj czy to w loop(), czy to w innych miejscach tą funkcję którą akurat potrzebujesz. Inaczej się pogubisz w tym za chwilę. Brawo za rysunki i plany. Grunt to wiedzieć czego się chce. Edytowano Luty 17, 2023 przez SOYER 1
SOYER Luty 17, 2023 Udostępnij Luty 17, 2023 Traktuj konkretne case ze switcha nie jako kolejne obrazy na lcd, ale konkretne etapy pracy twojego komputra, który aktualnie robi jakąś rzecz, owszem może mu się wtedy zmienić obraz na lcd, ale wcale nie musi.
Adadadi Luty 17, 2023 Udostępnij Luty 17, 2023 Z arduino mam styczność chyba niecałe 2 tygodnie i dlatego to tak topornie wygląda. Czyli mówisz aby ostatecznie stworzyć coś takiego definicje określenie zmiennych void setup void (prędkość) void (wydajność) void(ścieżki) void loop { switch }
SOYER Luty 17, 2023 Udostępnij Luty 17, 2023 Tak, mniej więcej tak. Oczywiście te funkcje wcale nie muszą być typu void, ale o tym jeszcze poczytasz. Kierunek słuszny.
Adadadi Luty 17, 2023 Udostępnij Luty 17, 2023 Dobra, powiedzmy, coś mi zaczyna świtać ale będę musiał to rozrysować na kilku kartkach. Jak uda mi się coś zoptymalizować i dopisać kolejne funkcję to będę aktualizował temat.
Adadadi Luty 21, 2023 Udostępnij Luty 21, 2023 Cześć wszystkim. Troszkę dłubałem przy kodzie, nawet udało mi się uruchomić wskazania prędkości, wydajności oraz rpm wom. Dwa pierwsze z uwzględnieniem ustawień z MENU. Jednak nie do końca działa to tak jakbym chciał, wolałbym nie korzystać z opcji Interrupt. #include <EasyButton.h> #include <EasyButtonBase.h> #include <EasyButtonTouch.h> #include <EasyButtonVirtual.h> #include <Sequence.h> #include <Timers.h> #include <LiquidCrystal_I2C.h> #include <Wire.h> #define BTN_OK 13 #define BTN_PREV 12 #define BTN_BACK 11 #define BTN_NEXT 10 #define WOM 3 #define KOLO 2 #define SILOWNIK 6 #define cTUZ 9 EasyButton NEXT(BTN_NEXT); EasyButton PREV(BTN_PREV); EasyButton OK(BTN_OK); EasyButton BACK(BTN_BACK); Timer timer; int TUZ = 0; int AktPrz = 2; // aktualny przejazd float SzerRob = 3; // szer robocza narzędzia bool ScTech = 0; // sciezki czy włączone int SzSc = 4; // szerokosc sciezki int KiedSc = 4; // w ktorym przejazdzie sciezka float ObKo = 5.28; // obwod koła int Imp = 6; //ile impulsow na obrot koła int Op = 100; // opuznienie imp tuz int A = 0; word obrot; byte state; byte state1; int zerowanie = 4000; int zerowanie1 = 4000; int half_revolution_time = 0; unsigned long volatile last_event; int czas_wom = 0; unsigned long volatile last_t_wom; unsigned long lastmillis = 0; LiquidCrystal_I2C lcd(0x27, 20, 4); void setup() { Serial.begin(9600); lcd.begin(20, 4); lcd.init(); lcd.backlight(); timer.begin(500); NEXT.begin(); PREV.begin(); OK.begin(); BACK.begin(); pinMode(cTUZ, INPUT_PULLUP); pinMode(WOM, INPUT_PULLUP); pinMode(SILOWNIK, OUTPUT); pinMode(KOLO, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(KOLO), rpm_fan, FALLING); attachInterrupt(digitalPinToInterrupt(WOM), rpm_wom, FALLING); } void rpm_fan() { if (millis() - last_event < 5) { //debouncing return; } half_revolution_time = (millis() - last_event); last_event = millis(); } void rpm_wom() { if (millis() - last_t_wom < 5) { //debouncing return; } czas_wom = (millis() - last_t_wom); last_t_wom = millis(); } void loop() { if (millis() - lastmillis >= 1000) //Aktualizuj co sekunda, bÄdzie to rĂłwnoznaczne z odczytem czÄstotliwoĹci (Hz) { lastmillis = millis(); // Aktualizacja lastmillis } // PREDKOSC && WYDAJNOSC noInterrupts(); // W trakcie kalkulacji wyłącz obsługę przerwań float predkosc = ((ObKo/Imp)/half_revolution_time)*3600; float wydajnosc = ((predkosc*1000)*SzerRob)/10000; interrupts() ; //Przywraca przerwania if (millis() - last_event >= zerowanie) { predkosc = 0; wydajnosc = 0; } // WOM noInterrupts(); // W trakcie kalkulacji wyłącz obsługę przerwań int RPM = (60000/czas_wom); interrupts() ; //Przywraca przerwania if (millis() - last_t_wom >= zerowanie1) { RPM = 0; } //DEFINICJE KLAWISZY NEXT.read(); PREV.read(); OK.read(); BACK.read(); //BOARDINFORMATOR switch (A) { case 0: //BoardComputer1 lcd.setCursor(0, 0); lcd.print("Predkosc"); lcd.setCursor(0, 1); lcd.print(predkosc); // odczyt z czuj prędkości lcd.setCursor(5, 1); lcd.print("km/h"); lcd.setCursor(0, 2); lcd.print("Wydajnosc"); lcd.setCursor(0, 3); lcd.print(wydajnosc); // odczyt z czuj prędkości * szerokość maszyny lcd.setCursor(5, 3); lcd.print("ha/h"); lcd.setCursor(15, 0); lcd.print("WOM"); lcd.setCursor(13, 1); lcd.print(RPM); // odczyt czujnik wom lcd.setCursor(16, 1); lcd.print("RPM"); lcd.setCursor(13, 2); lcd.print("Sciezka"); lcd.setCursor(12,3); lcd.print(AktPrz); lcd.setCursor(14,3); lcd.print("Z"); lcd.setCursor(15,3); lcd.print(SzSc); if (OK.wasReleased()) { A++; lcd.clear(); } if (BACK.wasReleased()) { A++; lcd.clear(); } break; case 1: //BoardComputer2 lcd.setCursor(0, 0); lcd.print("BD"); lcd.setCursor(0, 1); lcd.print(0000); // odczyt z czuj prędkości lcd.setCursor(5, 1); lcd.print("km/h"); lcd.setCursor(0, 2); lcd.print("BD"); lcd.setCursor(0, 3); lcd.print(0000); // odczyt z czuj prędkości * szerokość maszyny lcd.setCursor(5, 3); lcd.print("ha/h"); lcd.setCursor(15, 0); lcd.print("BD"); lcd.setCursor(13, 1); lcd.print(0000); // odczyt czujnik wom lcd.setCursor(17, 1); lcd.print("RPM"); lcd.setCursor(13, 2); lcd.print("BD"); lcd.setCursor(15, 3); lcd.print(0000); if (OK.wasReleased()) { A++; lcd.clear(); } if (BACK.wasReleased()) { A--; lcd.clear(); } break; case 2: //Menu1 lcd.home(); lcd.setCursor(0, 0); lcd.print("Aktualny przejazd"); lcd.setCursor(0, 1); lcd.print(AktPrz); // z czuj tuz if (NEXT.wasReleased()) { AktPrz = AktPrz + 1; } if (PREV.wasReleased()) { AktPrz = AktPrz - 1; } if (OK.wasReleased()) { A++; lcd.clear(); } if (BACK.wasReleased()) { A--; lcd.clear(); } break; case 3: //Menu2 lcd.home(); lcd.setCursor(0, 0); lcd.print("Szer robocza"); lcd.setCursor(0, 1); lcd.print(SzerRob); // odczyt z czuj prędkości lcd.setCursor(10, 1); lcd.print("m"); if (NEXT.wasReleased()) { SzerRob = SzerRob + 0.05; } if (PREV.wasReleased()) { SzerRob = SzerRob - 0.05; } if (OK.wasReleased()) { A++; lcd.clear(); } if (BACK.wasReleased()) { A--; lcd.clear(); } break; case 4: //Menu3 lcd.home(); lcd.setCursor(0, 0); lcd.print("Czy sciezki aktywne"); lcd.setCursor(0, 1); lcd.print(ScTech); lcd.setCursor(10, 1); if (NEXT.wasReleased()) { ScTech = ScTech = 1; } if (PREV.wasReleased()) { ScTech = ScTech = 0; } if (OK.wasReleased()) { A++; lcd.clear(); } if (BACK.wasReleased()) { A--; lcd.clear(); } break; case 5: //Menu4 lcd.home(); lcd.setCursor(0, 0); lcd.print("Szerokosc sciezki"); lcd.setCursor(0, 1); lcd.print(SzSc); // odczyt z czuj prędkości if (NEXT.wasReleased()) { SzSc = SzSc + 1; } if (PREV.wasReleased()) { SzSc = SzSc - 1; } if (OK.wasReleased()) { A++; lcd.clear(); } if (BACK.wasReleased()) { A--; lcd.clear(); } break; case 6: //Menu5 lcd.home(); lcd.setCursor(0, 0); lcd.print("Przejazd sciezki"); lcd.setCursor(0, 1); lcd.print(KiedSc); // odczyt z czuj prędkości if (NEXT.wasReleased()) { KiedSc = KiedSc + 1; } if (PREV.wasReleased()) { KiedSc = KiedSc - 1; } if (OK.wasReleased()) { A++; lcd.clear(); } if (BACK.wasReleased()) { A--; lcd.clear(); } break; case 7: //Menu6 lcd.home(); lcd.setCursor(0, 0); lcd.print("Obwod kola"); lcd.setCursor(0, 1); lcd.print(ObKo); // odczyt z czuj prędkości lcd.setCursor(10, 1); lcd.print("m"); if (NEXT.wasReleased()) { ObKo = ObKo + 0.05; } if (PREV.wasReleased()) { ObKo = ObKo - 0.05; } if (OK.wasReleased()) { A++; lcd.clear(); } if (BACK.wasReleased()) { A--; lcd.clear(); } break; case 8: //Menu7 lcd.home(); lcd.setCursor(0, 0); lcd.print("Ile IMP na obrot"); lcd.setCursor(0, 1); lcd.print(Imp); // odczyt z czuj prędkości lcd.setCursor(10, 1); lcd.print("m"); if (NEXT.wasReleased()) { Imp = Imp + 1; } if (PREV.wasReleased()) { Imp = Imp - 1; } if (OK.wasReleased()) { A++; lcd.clear(); } if (BACK.wasReleased()) { A--; lcd.clear(); } break; case 9: //Menu8 lcd.home(); lcd.setCursor(0, 0); lcd.print("Opuznienie zliczania"); lcd.setCursor(0, 1); lcd.print(Op); // odczyt z czuj prędkości lcd.setCursor(10, 1); lcd.print("sec"); if (NEXT.wasReleased()) { Op = Op + 1; } if (PREV.wasReleased()) { Op = Op - 1; } if (OK.wasReleased()) { A--; lcd.clear(); } if (BACK.wasReleased()) { A--; lcd.clear(); } break; } } Próbowałem również bazować na kodzie z tego przykłądu http://home.agh.edu.pl/~bartus/index.php?action=efekty&subaction=arduino&item=35 ale nie udało mi się tego połączyć tak aby to działało Trochę nie ogarniam jak to działa, że void loop() {} jest zamknięty a potem jest część licząco wyświetlająca float xxx() {} PS: Dopiero zatrybiłem żeby bezpośrednio do case 0 wstawić "część liczącą" której wyniki powinny być wyświetlane przez ten case. Więc jutro będę eksperymentował dalej.
SOYER Luty 21, 2023 Udostępnij Luty 21, 2023 (edytowany) Cześć, 1 godzinę temu, Adadadi napisał: Jednak nie do końca działa to tak jakbym chciał, 1 godzinę temu, Adadadi napisał: nie udało mi się tego połączyć tak aby to działało To może napisz co działa, co nie działa, a jak byś chciał żeby działało. Bo zgadywać nie będziemy. Dalej masz straszny nieporządek w kodzie, ale na początek zapytam co zależy od tego if: if (millis() - lastmillis >= 1000) //Aktualizuj co sekunda, bÄdzie to rĂłwnoznaczne z odczytem czÄstotliwoĹci (Hz) { lastmillis = millis(); // Aktualizacja lastmillis } To z Twojego szkicu. Co robi ten fragment kodu? Edytowano Luty 21, 2023 przez SOYER
Adadadi Luty 21, 2023 Udostępnij Luty 21, 2023 (edytowany) Miałem nadzieję że dzięki temu będzie możliwa regulacja częstotliwości odświeżania wyników na wyświetlacz. Ogólnie chcę napisać to tak aby czujniki indukcyjne mogły być podłączone do każdego pinu a nie do tych które mogą obsługiwać interrupt. Edytowano Luty 21, 2023 przez Adadadi
Adadadi Luty 23, 2023 Udostępnij Luty 23, 2023 (edytowany) Cześć, Udało mi się dzisiaj popełnić taki kod int impuls = 0; boolean kolo = LOW; unsigned long currentTime = 0; unsigned long startTime = millis(); int obrot = 0; boolean wom = LOW; while (currentTime <= sampleTime) { if (digitalRead(KOLO) == HIGH) { kolo = HIGH; } if (digitalRead(KOLO) == LOW && kolo == HIGH) { impuls++; kolo = LOW; } if (digitalRead(WOM) == HIGH){ wom = HIGH; } if (digitalRead(WOM) == LOW && wom == HIGH){ obrot++; wom = LOW; } currentTime = millis() - startTime; } float kph = ((impuls * (ObKo/Imp)) * 720) / 1000; float hah = ((kph * 1000) * SzerRob) / 10000; int rpm = (60000./ float(sampleTime)) * obrot; Niestety mam problem z dodaniem tego do swojego głównego kodu z pętlą switch case. Plan był taki, że wcisnę to do jednego z case aby obliczana była aktualna prędkość i obroty oraz wyświetlane na lcd. Niestety po wykorzystaniu tego w case, menu stworzone z switch case przestaje działać. Edytowano Luty 23, 2023 przez Adadadi Doprecyzowanie
Adadadi Marzec 5, 2023 Udostępnij Marzec 5, 2023 Hejo ponownie. Trochę dłubałem przy kodzie, na chwilę obecną wygląda tak: /*.................................................. .. projek BOARDINFORMATOR .. .................................................... */ /*.................................................. .. zmienne+przypisanie pin .. .................................................... */ #include <EasyButton.h> #include <EasyButtonBase.h> #include <EasyButtonTouch.h> #include <EasyButtonVirtual.h> #include <Sequence.h> #include <Timers.h> #include <LiquidCrystal_I2C.h> #include <Wire.h> #define BTN_OK 13 #define BTN_PREV 12 #define BTN_BACK 11 #define BTN_NEXT 10 #define WOM 8 #define KOLO 9 #define SILOWNIK 6 #define cTUZ 7 EasyButton NEXT(BTN_NEXT); EasyButton PREV(BTN_PREV); EasyButton OK(BTN_OK); EasyButton BACK(BTN_BACK); Timer timer; int TUZ = 0; int AktPrz = 2; // aktualny przejazd float SzerRob = 3; // szer robocza narzędzia bool ScTech = 0; // sciezki czy włączone int SzSc = 4; // szerokosc sciezki int KiedSc = 4; // w ktorym przejazdzie sciezka float ObKo = 5.28; // obwod koła int Imp = 6; //ile impulsow na obrot koła int Op = 50; // opuznienie imp tuz int volatile A = 0; const unsigned long sampleTime = 5000; float kph = 0; float hah = 0; int rpm = 0; bool lock = 0; LiquidCrystal_I2C lcd(0x27, 20, 4); void setup() { lcd.begin(20, 4); lcd.init(); lcd.backlight(); NEXT.begin(); PREV.begin(); OK.begin(); BACK.begin(); pinMode(cTUZ, INPUT_PULLUP); pinMode(WOM, INPUT_PULLUP); pinMode(SILOWNIK, OUTPUT); pinMode(KOLO, INPUT_PULLUP); } void loop() { //DEFINICJE KLAWISZY NEXT.read(); PREV.read(); OK.read(); BACK.read(); Menu_Glowne(); } /*............................................................................................... .. FUNKCJE .. .. .. ................................................................................................. */ /*......................................................... .. INSTRUKCJA SWITH DZIĘKI KTÓREJ UTWORZONO MENU .. .. .. ........................................................... */ void Menu_Glowne() { switch (A) { case 0: BoardComputer1(); Nastepny_Ekran(); break; case 1: BoardComputer2(); Nastepny_Ekran(); Poprzedni_Ekran(); break; case 2: Menu_1(); Nastepny_Ekran(); Poprzedni_Ekran(); break; case 3: Menu_2(); Nastepny_Ekran(); Poprzedni_Ekran(); break; case 4: Menu_3(); Nastepny_Ekran(); Poprzedni_Ekran(); break; case 5: Menu_4(); Nastepny_Ekran(); Poprzedni_Ekran(); break; case 6: Menu_5(); Nastepny_Ekran(); Poprzedni_Ekran(); break; case 7: Menu_6(); Nastepny_Ekran(); Poprzedni_Ekran(); break; case 8: Menu_7(); Nastepny_Ekran(); Poprzedni_Ekran(); break; case 9: Menu_8(); Poprzedni_Ekran(); break; } } /*.................................................. .. PREDKOSC .. .................................................... */ float getKPH() { int impuls = 0; boolean kolo = LOW; unsigned long currentTime = 0; unsigned long startTime = millis(); while (currentTime <= sampleTime & OK.isReleased()) { if (digitalRead(KOLO) == HIGH) { kolo = HIGH; } if (digitalRead(KOLO) == LOW && kolo == HIGH) { impuls++; kolo = LOW; } currentTime = millis() - startTime; } float kph = ((impuls * (ObKo / Imp)) * 720) / 1000; return kph; } /*.................................................. .. HEKTARY .. .................................................... */ float getHAH() { float hah = ((kph * 1000) * SzerRob) / 10000; return hah; } /*.................................................. .. WOM .. .................................................... */ float getWOM() { unsigned long currentTime1 = 0; unsigned long startTime1 = millis(); int obrot = 0; boolean wom = LOW; while (currentTime1 <= sampleTime & OK.isReleased()) { if (digitalRead(WOM) == HIGH) { wom = HIGH; } if (digitalRead(WOM) == LOW && wom == HIGH) { obrot++; wom = LOW; } currentTime1 = millis() - startTime1; } int rpm = (60000. / float(sampleTime)) * obrot; return rpm; } /*.................................................. .. BoardComputer1 .. .................................................... */ void BoardComputer1() { lcd.setCursor(0, 0); lcd.print("Predkosc"); lcd.setCursor(0, 1); lcd.print(kph); lcd.setCursor(5, 1); lcd.print("km/h"); lcd.setCursor(0, 2); lcd.print("Wydajnosc"); lcd.setCursor(0, 3); lcd.print(hah); lcd.setCursor(5, 3); lcd.print("ha/h"); lcd.setCursor(15, 0); lcd.print("WOM"); lcd.setCursor(13, 1); lcd.print(rpm); lcd.setCursor(17, 1); lcd.print("RPM"); lcd.setCursor(13, 2); lcd.print("Sciezka"); lcd.setCursor(12, 3); lcd.print(AktPrz); lcd.setCursor(14, 3); lcd.print("Z"); lcd.setCursor(15, 3); lcd.print(SzSc); kph = getKPH(); hah = getHAH(); rpm = getWOM(); } /*.................................................. .. BoardComputer2 .. .................................................... */ void BoardComputer2() { lcd.setCursor(0, 0); lcd.print("BD"); lcd.setCursor(0, 1); lcd.print(0); lcd.setCursor(6, 1); lcd.print("km/h"); lcd.setCursor(0, 2); lcd.print("BD"); lcd.setCursor(0, 3); lcd.print(0); lcd.setCursor(6, 3); lcd.print("ha/h"); lcd.setCursor(15, 0); lcd.print("BD"); lcd.setCursor(13, 1); lcd.print(0); // lcd.setCursor(17, 1); lcd.print("RPM"); lcd.setCursor(13, 2); lcd.print("BD"); lcd.setCursor(15, 3); lcd.print(0); } /*.................................................. .. KOLEJNY EKRAN .. .................................................... */ int Nastepny_Ekran() { if (OK.wasPressed()) { A++; lcd.clear(); } return A; } /*.................................................. .. POPRZEDNI EKRAN .. .................................................... */ int Poprzedni_Ekran() { if (BACK.wasPressed()) { A--; lcd.clear(); } return A; } /*.................................................. .. MENU1 .. .................................................... */ int Menu_1() { lcd.home(); lcd.setCursor(0, 0); lcd.print("Aktualny przejazd"); lcd.setCursor(0, 1); lcd.print(AktPrz); // z czuj tuz if (NEXT.wasReleased()) { AktPrz = AktPrz + 1; } if (PREV.wasReleased()) { AktPrz = AktPrz - 1; } return AktPrz; } /*.................................................. .. MENU2 .. .................................................... */ float Menu_2() { lcd.home(); lcd.setCursor(0, 0); lcd.print("Szer robocza"); lcd.setCursor(0, 1); lcd.print(SzerRob); lcd.setCursor(10, 1); lcd.print("m"); if (NEXT.wasReleased()) { SzerRob = SzerRob + 0.05; } if (PREV.wasReleased()) { SzerRob = SzerRob - 0.05; } return SzerRob; } /*.................................................. .. MENU3 .. .................................................... */ int Menu_3() { lcd.home(); lcd.setCursor(0, 0); lcd.print("Czy sciezki aktywne"); lcd.setCursor(0, 1); lcd.print(ScTech); lcd.setCursor(10, 1); if (NEXT.wasReleased()) { ScTech = ScTech = 1; } if (PREV.wasReleased()) { ScTech = ScTech = 0; } return ScTech; } /*.................................................. .. MENU4 .. .................................................... */ int Menu_4() { lcd.home(); lcd.setCursor(0, 0); lcd.print("Szerokosc sciezki"); lcd.setCursor(0, 1); lcd.print(SzSc); if (NEXT.wasReleased()) { SzSc = SzSc + 1; } if (PREV.wasReleased()) { SzSc = SzSc - 1; } return SzSc; } /*.................................................. .. MENU5 .. .................................................... */ int Menu_5() { lcd.home(); lcd.setCursor(0, 0); lcd.print("Przejazd sciezki"); lcd.setCursor(0, 1); lcd.print(KiedSc); if (NEXT.wasReleased()) { KiedSc = KiedSc + 1; } if (PREV.wasReleased()) { KiedSc = KiedSc - 1; } return KiedSc; } /*.................................................. .. MENU6 .. .................................................... */ float Menu_6() { lcd.home(); lcd.setCursor(0, 0); lcd.print("Obwod kola"); lcd.setCursor(0, 1); lcd.print(ObKo); lcd.setCursor(10, 1); lcd.print("m"); if (NEXT.wasReleased()) { ObKo = ObKo + 0.05; } if (PREV.wasReleased()) { ObKo = ObKo - 0.05; } return ObKo; } /*.................................................. .. MENU7 .. .................................................... */ int Menu_7() { lcd.home(); lcd.setCursor(0, 0); lcd.print("Ile IMP na obrot"); lcd.setCursor(0, 1); lcd.print(Imp); lcd.setCursor(10, 1); lcd.print("m"); if (NEXT.wasReleased()) { Imp = Imp + 1; } if (PREV.wasReleased()) { Imp = Imp - 1; } return Imp; } /*.................................................. .. MENU8 .. .................................................... */ int Menu_8() { lcd.home(); lcd.setCursor(0, 0); lcd.print("Opuznienie zliczania"); lcd.setCursor(0, 1); lcd.print(Op); lcd.setCursor(10, 1); lcd.print("sec"); if (NEXT.wasReleased()) { Op = Op + 1; } if (PREV.wasReleased()) { Op = Op - 1; } return Op; } A tak wygląda działanie: https://drive.google.com/file/d/1gw9tgdDeBYwJbPs_vRYWTRShyh3KX9Ci/view?usp=sharing Tak jak widać jeszcze nie ogarnąłem odświeżenia ekranu po poprzednich pomiarach. Czyli np jeśli RPM wyświetli 156 to przy braku impulsów z czujnika ekran nie wróci do wartości "000" tylko wyświetla wartość "056". Ponieważ pomiary są wykonywane w pętli 5 sec to aby przejść z case 0 do case 1 niestety koniecznej jest przytrzymanie klawisza - na chwilę obecną to akceptuję. Aktualnie korzystam z pushbuttonów aby sprawdzić działanie kodu. Gdy napiszę resztę zacznę budować prototyp z czujnikami indukcyjnymi i siłownikiem elektrycznym. PS: Pewnie i tak nikt nie odpisze.
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »