Skocz do zawartości

Licznik z liczbami dziesiętnymi 000,17.


Ronin045

Pomocna odpowiedź

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



Link do komentarza
Share on other sites

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?

Link do komentarza
Share on other sites

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


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

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.

Link do komentarza
Share on other sites

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ć?

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.