Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Licznik z liczbami dziesiętnymi np. 003,19.
#1
Kod:
// 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;
int txt = 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("Skarbonka:000.00");//Wyświetlenie Suma:   000.00 na LCD    
 lcd.setCursor(0,1);//
 lcd.print("Nauka    Arduino");          
}
void loop() {
 
// Dodawanie +1,+2,+5,+10,+20,+50
// Dodawanie + 1

   if (digitalRead(BUTTON1_PIN) == LOW) {
   while (digitalRead(BUTTON1_PIN) == HIGH) {}
   x++;

  // Ustawienie zakresu od 0 do 9999
   x = constrain (x, 0, 9999);

delay(100);
   
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("+ 1 :Suma:000.00");
   lcd.setCursor(15,0);
   if (x>9)  lcd.setCursor(14,0);
   if (x>99)  lcd.setCursor(14,0);
   if (x>999)  lcd.setCursor(12,0);

 
   
   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(14,0);
   if (x>99)  lcd.setCursor(14,0);
   if (x>999)  lcd.setCursor(12,0);

 
   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(14,0);
   if (x<=9) lcd.setCursor(15,0);
   if (x>9)  lcd.setCursor(14,0);
   if (x>99)  lcd.setCursor(14,0);
   if (x>999)  lcd.setCursor(12,0);

 
   
   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(14,0);
   if (x>99)  lcd.setCursor(14,0);
   if (x>999)  lcd.setCursor(13,0);
   
   char txt[17]; //16 znaków + kod końca 0x00
   sprintf(txt,"%5d,%02d", x/100, x%100);
   
   lcd.print(x);  
       
   lcd.setCursor(0,1);  
   lcd.print("   ");                      
                 
   delay(100);
 }
  }//Koniec
Mam prośbę. Męczę się już z trzy dni z tym. Nie wiem jak napisać aby LCD wyświetlał np. 056,52. Licznik liczy ale przy wyniku 001,00 przesuwa liczby w prawo. Pomocy. I czy można by było skrócić program?
Odpowiedz
#2
Mógłbyś przybliżyć co ten program ma robić, żeby mniej więcej wiedział jak pomóc ? Co do skrócenia programu to można zrobić by metodę do której przekazywałoby się x w zależności od wciśniętego przycisku.
>> Nie pomagam na PW. Od tego jest forum Uśmiech >> Koniecznie sprawdź: Jak dodawać załączniki

1 problem = 1 wątek
Odpowiedz
#3
(18-11-2017, 22:36)feriar napisał(a): Mógłbyś przybliżyć co ten program ma robić, żeby mniej więcej wiedział jak pomóc ? Co do skrócenia programu to można zrobić by metodę do której przekazywałoby się x w zależności od wciśniętego przycisku.

Program ma zliczać złotówki i grosze. Kolejno tak pomału robię bo przy okazji uczę się. Do tego ma być zrobione menu. Na razie mam pomysł ale chce zliczanie skończyć najpierw aby wyświetlało się  np. 014,52 .

Menu mniej więcej tak:
 Wybór: Grosze, Złotówki
Do wyboru: 1,2,5,10,20,50
Odczyt z eeprom zapis eeprom kasuj
OK

 Na to by chyba było potrzebne 5 przycisków? Prawo, lewo, dół, góra i ok. Potem dołączę czujnik szczelinowy. Ustawiając nominał i wrzucając go  żeby dodawał do stanu. Na razie zapis z przecinkiem chce zrobić. Łatwiej by było zrobić mi zapis 000 zł 00 gr. ale uparłem się na przecinek. Duży uśmiech
Jak nie chcesz odpowiedzieć to nie pisz !!!
Odpowiedz
#4
(18-11-2017, 23:22)Ronin napisał(a):
(18-11-2017, 22:36)feriar napisał(a): Mógłbyś przybliżyć co ten program ma robić, żeby mniej więcej wiedział jak pomóc ? Co do skrócenia programu to można zrobić by metodę do której przekazywałoby się x w zależności od wciśniętego przycisku.

Program ma zliczać złotówki i grosze. Kolejno tak pomału robię bo przy okazji uczę się. Do tego ma być zrobione menu. Na razie mam pomysł ale chce zliczanie skończyć najpierw aby wyświetlało się  np. 014,52 .

Menu mniej więcej tak:
 Wybór: Grosze, Złotówki
Do wyboru: 1,2,5,10,20,50
Odczyt z eeprom zapis eeprom kasuj
OK

 Na to by chyba było potrzebne 5 przycisków? Prawo, lewo, dół, góra i ok. Potem dołączę czujnik szczelinowy. Ustawiając nominał i wrzucając go  żeby dodawał do stanu. Na razie zapis z przecinkiem chce zrobić. Łatwiej by było zrobić mi zapis 000 zł 00 gr. ale uparłem się na przecinek. Duży uśmiech
Próbowałem go poprawić i teraz program wygląda tak:
Kod:
// 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;

int snprintf_P(char* _s, size t__n, const char *__fmt);

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
Nie potrzeba tam jakiejś biblioteki? Take błędy mi wyskakują. Arduino:1.8.5 (Windows Store 1.8.10.0) (Windows 10), Płytka:"Arduino Leonardo"
licznik_o1:17: error: 'size' has not been declared
 int snprintf_P(char* _s, size t__n, const char *__fmt);
                          ^
In file included from sketch\licznik_o1.ino.cpp:1:0:
C:\Users\RONIN\Documents\Arduino\licznik_o1\licznik_o1.ino: In function 'void loop()':
C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.10.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\cores\arduino/Arduino.h:95:58: warning: comparison is always false due to limited range of data type [-Wtype-limits]
 #define constrain(amt,low,high) ((amt)<(low)?(low)Smutny(amt)>(high)?(high)Smutnyamt)))
                                                          ^
C:\Users\RONIN\Documents\Arduino\licznik_o1\licznik_o1.ino:46:5: note: in expansion of macro 'constrain'
 x = constrain (x, 0, 99999);
     ^
licznik_o1:136: error: call of overloaded 'snprintf_P(char [17], const char*, int&)' is ambiguous
 snprintf_P( txt, PSTR("+ 1 :Suma: %d09"), x );
                                             ^
C:\Users\RONIN\Documents\Arduino\licznik_o1\licznik_o1.ino:136:45: note: candidates are:
In file included from C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.10.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\cores\arduino/Print.h:24:0,
                 from C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.10.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\cores\arduino/Stream.h:26,
                 from C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.10.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\cores\arduino/HardwareSerial.h:29,
                 from C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.10.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\cores\arduino/Arduino.h:232,
                 from sketch\licznik_o1.ino.cpp:1:
c:\program files\windowsapps\arduinollc.arduinoide_1.8.10.0_x86__mdqgnx93n4wtt\hardware\tools\avr\avr\include\stdio.h:693:12: note: int snprintf_P(char*, size_t, const char*, ...) <near match>
 extern int snprintf_P(char *__s, size_t __n, const char *__fmt, ...);
            ^
c:\program files\windowsapps\arduinollc.arduinoide_1.8.10.0_x86__mdqgnx93n4wtt\hardware\tools\avr\avr\include\stdio.h:693:12: note:   no known conversion for argument 3 from 'int' to 'const char*'
C:\Users\RONIN\Documents\Arduino\licznik_o1\licznik_o1.ino:17:5: note: int snprintf_P(char*, int, const char*) <near match>
 int snprintf_P(char* _s, size t__n, const char *__fmt);
     ^
C:\Users\RONIN\Documents\Arduino\licznik_o1\licznik_o1.ino:17:5: note:   no known conversion for argument 3 from 'int' to 'const char*'
exit status 1
'size' has not been declared
Ten raport powinien zawierać więcej informacji jeśli w
File -> Preferencje zostanie włączona opcja "Pokaż
szczegółowe informacje podczas kompilacji"

Aktualnie mam zajęte Arduino innym projektem i nie sprawdziłem czy działa. Przydał by się program do symulacji z I2C. Jeden próbowałem ale brak tam konwertera I2C. Jedności wyświetla dobrze tylko liczby po przecinku źle. Np.  zamiast 019,56 to po dodaniu 0,44 powinno 020,00 a jest 191,00.
Jak nie chcesz odpowiedzieć to nie pisz !!!
Odpowiedz


Podobne wątki
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  impulsator arduino-licznik energii elektrycznej nobody@all 2 126 22-04-2018, 21:02
Ostatni post: feriar

Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości