Ronin045 Napisano Listopad 13, 2017 Udostępnij Napisano Listopad 13, 2017 Jestem początkujący. Proszę o pomoc. Nigdzie nie ma przykładów po polsku. Jeden program licznika napisałem. Dodawanie 1,2,5,10 przy liczbach całkowitych. Działa. Teraz go przerabiam bo chce uzyskać liczby po przecinku. Do 000,99 dobrze jest a potem nie wiem jak przenieść liczbę przed przecinek np.002,87.... Czy tylko do digital można podpiąć 4 przyciski? Bo chciałem dodać 20,50 i reset. Mam też pytanie o wyświetlacz. Mam dwa-zielony i ten działa i niebieski. Ten niebieski nie wyświetla nic tylko załącza się podświetlenie a żadnych kostek nie wyświetla. Oba 1602A v2.0. Podłączane do I2C. // Bibloteki #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3F,16,2); //Definiowanie pinów Arduino Uno #define BUTTON1_PIN 2 #define BUTTON2_PIN 3 #define BUTTON3_PIN 4 #define BUTTON4_PIN 5 //Definiowanie zmiennej x int x = 0; void setup() { pinMode(BUTTON1_PIN, INPUT_PULLUP); pinMode(BUTTON2_PIN, INPUT_PULLUP); pinMode(BUTTON3_PIN, INPUT_PULLUP); pinMode(BUTTON4_PIN, INPUT_PULLUP); lcd.init(); lcd.clear();// czyszczenie ekranu // Wyś›wietl wiadomość na wyś›wietlaczu LCD. lcd.backlight();//Zapalanie podświetlenia lcd.setCursor(0,0);// Ustawienie kursora na pierwszej lini i lewej stronie ekranu LCD lcd.print("Licznik: 000,00");//Wyświetlenie Licznik: 000,00 na LCD lcd.setCursor(0,1);// lcd.print("Nauka Arduino"); } void loop() { // Dodawanie +1,+2,+5,+10 // Dodawanie + 1 if (digitalRead(BUTTON1_PIN) == LOW) { while (digitalRead(BUTTON1_PIN) == HIGH) {} x++; // Ustawienie zakresu od 0 do 99999 x = constrain (x, 0, 99999); delay(100); lcd.clear(); lcd.setCursor(0,0); lcd.print("+ 1 :Suma:000,00"); lcd.setCursor(15,0); if (x<=9) lcd.setCursor(15,0); if (x>9) lcd.setCursor(14,0); if (x>99) lcd.setCursor(13,0); if (x>999) lcd.setCursor(12,0); if (x>9999) lcd.setCursor(11,0); char txt[17]; //16 znaków + kod końca 0x00 sprintf_P( txt, PSTR("+ 1 :Suma: %d09"), x ); lcd.print(x); lcd.setCursor(0,1); lcd.print(" RONIN "); delay(100); } //Ddawanie + 2 if (digitalRead(BUTTON2_PIN) == LOW) { while (digitalRead(BUTTON2_PIN) == HIGH) {} x+=2; // Ustawienie zakresu od 0 do 9999 x = constrain (x, 0, 9999); lcd.clear(); lcd.setCursor(0,0); lcd.print("+ 2 :Suma:000,00"); lcd.setCursor(15,0); if (x<=9) lcd.setCursor(15,0); if (x>9) lcd.setCursor(14,0); if (x>99) lcd.setCursor(13,0); if (x>999) lcd.setCursor(12,0); if (x>9999) lcd.setCursor(11,0); char txt[17]; //16 znaków + kod końca 0x00 sprintf_P( txt, PSTR("+ 1 :Suma: %d09"), x ); lcd.print(x); lcd.setCursor(0,1); lcd.print(" "); delay(100); } //Dodawanie + 5 if (digitalRead(BUTTON3_PIN) == LOW) { while (digitalRead(BUTTON3_PIN) == HIGH) {} x+=5; // Ustawienie zakresu od 0 do 9999 x = constrain (x, 0, 9999); lcd.clear(); lcd.setCursor(0,0); lcd.print("+ 5 :Suma:000,00"); lcd.setCursor(15,0); if (x<=9) lcd.setCursor(15,0); if (x<=9) lcd.setCursor(15,0); if (x>9) lcd.setCursor(14,0); if (x>99) lcd.setCursor(13,0); if (x>999) lcd.setCursor(12,0); if (x>9999) lcd.setCursor(11,0); char txt[17]; //16 znaków + kod końca 0x00 sprintf_P( txt, PSTR("+ 1 :Suma: %d05"), x ); lcd.print(x); lcd.setCursor(0,1); lcd.print(" RONIN "); delay(100); } //Ddawanie + 10 if (digitalRead(BUTTON4_PIN) == LOW) { while (digitalRead(BUTTON4_PIN) == HIGH) {} x+=10; // Ustawienie zakresu od 0 do 9999 x = constrain (x, 0, 9999); lcd.clear(); lcd.setCursor(0,0); lcd.print("+ 10:Suma:000,00"); lcd.setCursor(15,0); if (x<=9) lcd.setCursor(15,0); if (x>9) lcd.setCursor(14,0); if (x>99) lcd.setCursor(13,0); if (x>999) lcd.setCursor(12,0); if (x>9999) lcd.setCursor(11,0); char txt[17]; //16 znaków + kod końca 0x00 snprintf_P( txt, PSTR("+ 1 :Suma: %d09"), x ); char buf[5]; lcd.print(itoa(random(x)/1, buf, 1)); lcd.print(x); lcd.setCursor(0,1); lcd.print(" "); delay(100); } }//Koniec Cytuj Link do komentarza Share on other sites More sharing options...
marek1707 Listopad 13, 2017 Udostępnij Listopad 13, 2017 1. Typ int jest 16-bitowy, więc reprezentowany przez niego zakres to -32768..+32767. Ograniczanie tego do 99999 jest bez sensu. 2. Najpierw rób sprintf a potem sprawdzaj długość łańcucha - od razu widać ile znaków jest do wyświetlania. Uzupełnij ten string spacjami do pożądanej długości pola na LCD i wtedy zawsze będziesz ustawiał kursor w tym samym miejscu. Nie będziesz też musiał robić tego absurdalnego szacowania długości w kilku if-ach. Nie pisz programów przez ctlr-C/ctrl-V tych samych fragmentów. Jeśli coś się ewidentnie powtarza, używaj funkcji. 3. Jako x użyj typu 32-bitowego uint32_t i traktuj liczbę tam wpisaną jakby była pomnożona przez 100. Tj. żeby dodać 0.5 dodawaj 50, żeby dodać 1.00 dodawaj 100. Żeby dodać 10.57 dodawaj 1057. Podczas wyświetlania po prostu wypisuj przecinek przed dwoma ostatnimi cyframi i z głowy. Na 32 bitach bez znaku masz zakres od 0 do 4294967295 więc w przyjętej notacji będzie to max. 42949672.95. Wystarczy? Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Listopad 13, 2017 Udostępnij Listopad 13, 2017 Komplikujesz. sprintf(bufor,"%5d,%02d", n/100, n%100); I jeśli nie przekroczyłeś zakresu nie musisz sprawdzać co zwraca sprintf. Zawsze będzie 8 znaków. Cytuj Link do komentarza Share on other sites More sharing options...
Ronin045 Listopad 13, 2017 Autor tematu Udostępnij Listopad 13, 2017 Komplikujesz. sprintf(bufor,"%5d,%02d", n/100, n%100); I jeśli nie przekroczyłeś zakresu nie musisz sprawdzać co zwraca sprintf. Zawsze będzie 8 znaków. Wpisałem to i wyskakuje przy kompilacji błąd. Dla mnie to trochę zawiłe. Zielony jestem z tego dlatego na razie piszę jak najprościej aby zrozumieć i nauczyć się., .Arduino:1.9.0-beta (Windows 10), Płytka:"Arduino/Genuino Uno" Znaleziono wiele bibliotek w "LiquidCrystal_I2C.h" C:\UsersRONINDocumentsArduinoKalkulat4Kalkulat8.inoLicznik_zlotowek_2Licznik_zlotowek_2.ino: In function 'void loop()': Wykorzystane: C:\Users\RONIN\Documents\Arduino\libraries\LiquidCrystal_I2C C:\UsersRONINDocumentsArduinoKalkulat4Kalkulat8.inoLicznik_zlotowek_2Licznik_zlotowek_2.ino:267:12: error: 'bufor' was not declared in this scope Niewykorzystane: C:\Users\RONIN\Documents\Arduino\libraries\NewliquidCrystal C:\UsersRONINDocumentsArduinoKalkulat4Kalkulat8.inoLicznik_zlotowek_2Licznik_zlotowek_2.ino:267:30: error: 'n' was not declared in this scope Niewykorzystane: C:\Users\RONIN\Documents\Arduino\libraries\LiquidCrystal_I2C-1.1.2 Niewykorzystane: C:\Users\RONIN\Documents\Arduino\libraries\Arduino-LiquidCrystal-I2C-library-master exit status 1 Błąd kompilacji dla płytki Arduino/Genuino Uno. Ten raport powinien zawierać więcej informacji jeśli w File -> Preferencje zostanie włączona opcja "Pokaż szczegółowe informacje podczas kompilacji" Pierwszy program. // Bibloteki #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3F,16,2); //Definiowanie pinów Arduino Uno #define BUTTON1_PIN 2 #define BUTTON2_PIN 3 #define BUTTON3_PIN 4 #define BUTTON4_PIN 5 //Definiowanie zmiennej x int x = 0; void setup() { pinMode(BUTTON1_PIN, INPUT_PULLUP); pinMode(BUTTON2_PIN, INPUT_PULLUP); pinMode(BUTTON3_PIN, INPUT_PULLUP); pinMode(BUTTON4_PIN, INPUT_PULLUP); Serial.begin(9600); lcd.init(); lcd.clear();// czyszczenie ekranu // Wyświetl wiadomość na wyświetlaczu LCD. lcd.backlight();//Zapalanie podświetlenia lcd.setCursor(0,0);// Ustawienie kursora na pierwszej lini i lewej stronie ekranu LCD lcd.print("Licznik: 0000");//Wyświetlenie Licznik: 0000 na LCD } void loop() { // Dodawanie + 1 if (digitalRead(BUTTON1_PIN) == LOW) { while (digitalRead(BUTTON1_PIN) == HIGH) {} x++; // Ustawienie zakresu od 0 do 9999 x = constrain (x, 0, 9999); // Ustawienie zakresu od 0 do 9999 x = constrain (x, 0, 9999); if ( x < 0 ) x = 0; if ( x < 0 ) x > 9; lcd.setCursor(14,0); if (x<9) x>99; lcd.setCursor(13,0); if (x<99) x>999; lcd.setCursor(12,0); if (x<999) x>9999; lcd.setCursor(11,0); delay(100); Serial.print("Dodawanie: "); Serial.print("Wartość zmiennej: "); Serial.println(x); lcd.clear(); lcd.setCursor(0,0); lcd.print("+ 1 :Suma: 0000"); lcd.setCursor(15,0); lcd.print(x); lcd.setCursor(0,1); lcd.print(" RONIN & "); delay(100); } //Odejmowanie - 1 if (digitalRead(BUTTON2_PIN) == LOW) { while (digitalRead(BUTTON2_PIN) == HIGH) {} x--; if ( x < 0 ) x = 0; if (x<9 && x>0) lcd.setCursor(14,0); if (x<99 && x>9) lcd.setCursor(13,0); // Ustawienie zakresu od 0 do 9999 x = constrain (x, 0, 9999); Serial.print("Odejmowanie: "); Serial.print("Wartość zmiennej: "); Serial.println(x); lcd.clear(); lcd.setCursor(0,0); lcd.print("- 1 :Suma: 0000"); lcd.setCursor(15,0); lcd.print(x); lcd.setCursor(0,1); lcd.print(" ELEKTRODA"); delay(100); } //Dodawanie + 10 if (digitalRead(BUTTON3_PIN) == LOW) { while (digitalRead(BUTTON3_PIN) == HIGH) {} x+=10; Serial.print("Dodawanie: "); Serial.print("Wartość zmiennej: "); Serial.println(x); lcd.clear(); lcd.setCursor(0,0); lcd.print("+ 10:Suma: 0000"); lcd.setCursor(14,0); lcd.print(x); // Ustawienie wySwietlania liczby od 11 do 99 jako 0011,0012....0099 // Ustawienie wySwietlania liczby od 100 do 999 jako 0211,0212....0999 // Ustawienie wySwietlania liczby od 1000 do 9999 jako 1011,1012....9999 lcd.setCursor(0,1); lcd.print(" RONIN & "); delay(100); } //Odejmowanie - 10 if (digitalRead(BUTTON4_PIN) == LOW) { while (digitalRead(BUTTON4_PIN) == HIGH) {} x-=10; if ( x < 0 ) x = 0; x = constrain (x, 0, 9999); Serial.print("Odejmowanie: "); Serial.print("Wartość zmiennej: "); Serial.println(x); lcd.clear(); lcd.setCursor(0,0); lcd.print("- 10:Suma: 0000"); lcd.setCursor(14,0); lcd.print(x); lcd.setCursor(0,1); lcd.print(" ELEKTRODA"); delay(100); } }//Koniec Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
ethanak Listopad 13, 2017 Udostępnij Listopad 13, 2017 To zacznij od migania diodą, potem zrób miganie dwiema diodami... Potem trzema... Co ci mam zrobić, kod podać? Nie rozumiesz o co to chodzi ale... Wybacz, ale chyba coś Ci się pokiełbasiło Cytuj Link do komentarza Share on other sites More sharing options...
Ronin045 Listopad 13, 2017 Autor tematu Udostępnij Listopad 13, 2017 To zacznij od migania diodą, potem zrób miganie dwiema diodami... Potem trzema...Co ci mam zrobić, kod podać? Nie rozumiesz o co to chodzi ale... Wybacz, ale chyba coś Ci się pokiełbasiło Robiłem nawet miganie 6 diodami i 12 z 4 przyciskami. Teraz z lcd a potem z motorami chcę robić. Nikt od razu nie zaczynał od trudnych rzeczy. Szukałem przykładów z liczbami po przecinku po polsku i nie znalazłem. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Listopad 13, 2017 Udostępnij Listopad 13, 2017 Nikt nie zaczynał od trudnych... Ale może najpierw zrozum to chol^Wnieszczęsne miganie, a potem zabieraj się za bardziej skomplikowane rzeczy. Jeśli czegoś nie rozumiesz - to nie powód dla wstydu. Zapytaj - o ile znam życie ktoś odpowie. Jeśli pokazujesz że robisz rakietę na Księżyc, a nie masz pojęcia o działaniu silnika... To co, mamy się pośmiać? Cytuj Link do komentarza Share on other sites More sharing options...
Ronin045 Listopad 15, 2017 Autor tematu Udostępnij Listopad 15, 2017 Nikt nie zaczynał od trudnych... Ale może najpierw zrozum to chol^Wnieszczęsne miganie, a potem zabieraj się za bardziej skomplikowane rzeczy.Jeśli czegoś nie rozumiesz - to nie powód dla wstydu. Zapytaj - o ile znam życie ktoś odpowie. Jeśli pokazujesz że robisz rakietę na Księżyc, a nie masz pojęcia o działaniu silnika... To co, mamy się pośmiać? Właśnie pytałem i nie dostałem odpowiedzi. Szukałem przykładów na necie i nie znalazłem. Miganie przerabiałem. Jak pan nie chce odpowiedzieć to nie ale daj pan szansę innym do odpowiedzi. Nikt nie jest wszechwiedzący. Cytuj Link do komentarza Share on other sites More sharing options...
Elvis Listopad 15, 2017 Udostępnij Listopad 15, 2017 Ronin045, nie obrażaj się od razu tylko pomyśl chwilę, albo lepiej poczytaj jakie błędy wyrzucił kompilator. ethanak, podał Ci bardzo dobre rozwiązanie, proste i właściwie gotowe. Jedyne co trzeba zrobić to zmienić nazwy zmiennych, ale to chyba nie jest trudne. To co napisałeś było dużo bardziej skomplikowane, po prostu printf() posiada już opcje rozbudowanego formatowania napisów, wystarczy z tego skorzystać. Ja tylko dodam od siebie, że takie rozwiązanie powoduje potworne zwiększenie objętości kodu w przypadku gcc, ale ponieważ już wcześniej używałeś sprintf(), więc nie ma co komplikować sobie życia. Takie sztuczki z obliczaniem zakresów i własnymi procedurami formatowania mają sens chyba tylko jeśli chcemy zaoszczędzić pamięć. Ale skoro i tak ją marnujemy to wystarczy doczytać jak działa printf/sprintf i gotowe. Cytuj Link do komentarza Share on other sites More sharing options...
Ronin045 Listopad 15, 2017 Autor tematu Udostępnij Listopad 15, 2017 Ja się nie obrażam. Najlepiej mi idzie nauka na przykładach. Będę więc jutro dalej szukał przykładów. Kod też by się przydało odchudzić tylko nie wiem jak. Chce też zrobić proste menu wyboru i czytałem dzisiaj coś na ten temat. Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!