Skocz do zawartości

Licznik z liczbami dziesiętnymi 000,17.


Pomocna odpowiedź

Napisano

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



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?

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.

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


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

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.

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

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.

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.

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.

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ę »
×
×
  • Utwórz nowe...