• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Modyfikacja kodu kalkulatora
#1
Witam
Zaczynam zabawę z Arduino na start poleci kalkulator oparty o klawiaturę 4x4 i lcd 2*16. Znalazłem w sieci projekt kalkulatora i chciałbym dodać drugą klawiaturę która wykonywała by określone działania bez wpisywania np. wciskam klawisz x i do liczby dodaje mi się odrazu 200, naciskam klawisz y odejmuje się 200. Teraz na początek pierwsze pytanie czu tu mam po prostu dodać klawiaturę 8x8 czy to się robi jakoś oddzielnie?
Kod:
#include <Keypad.h> //Header file for Keypad from https://github.com/Chris--A/Keypad

const byte ROWS = 4; // Four rows
const byte COLS = 4; // Three columns

// Define the Keymap
char keys[ROWS][COLS] = {

 {'7','8','9','D'},

 {'4','5','6','C'},

 {'1','2','3','B'},

 {'*','0','#','A'}

};


Kod:
/*
* Arduino Keypad calculator Program
*/

#include <LiquidCrystal.h> //Header file for LCD from https://www.arduino.cc/en/Reference/LiquidCrystal
#include <Keypad.h> //Header file for Keypad from https://github.com/Chris--A/Keypad

const byte ROWS = 4; // Four rows
const byte COLS = 4; // Three columns

// Define the Keymap
char keys[ROWS][COLS] = {

 {'7','8','9','D'},

 {'4','5','6','C'},

 {'1','2','3','B'},

 {'*','0','#','A'}

};

byte rowPins[ROWS] = { 0, 1, 2, 3 };// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte colPins[COLS] = { 4, 5, 6, 7 }; // Connect keypad COL0, COL1 and COL2 to these Arduino pins.

Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); //  Create the Keypad

const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; //Pins to which LCD is connected
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

long Num1,Num2,Number;
char key,action;
boolean result = false;

void setup() {
 lcd.begin(16, 2); //We are using a 16*2 LCD display
 lcd.print("DIY Calculator"); //Display a intro message
 lcd.setCursor(0, 1);   // set the cursor to column 0, line 1
 lcd.print("-CircuitDigest"); //Display a intro message

  delay(2000); //Wait for display to show info
   lcd.clear(); //Then clean it
}

void loop() {
 
key = kpd.getKey(); //storing pressed key value in a char

if (key!=NO_KEY)
DetectButtons();

if (result==true)
CalculateResult();

DisplayResult();  
}

void DetectButtons()
{
    lcd.clear(); //Then clean it
   if (key=='*') //If cancel Button is pressed
   {Serial.println ("Button Cancel"); Number=Num1=Num2=0; result=false;}
   
    if (key == '1') //If Button 1 is pressed
   {Serial.println ("Button 1");
   if (Number==0)
   Number=1;
   else
   Number = (Number*10) + 1; //Pressed twice
   }
   
    if (key == '4') //If Button 4 is pressed
   {Serial.println ("Button 4");
   if (Number==0)
   Number=4;
   else
   Number = (Number*10) + 4; //Pressed twice
   }
   
    if (key == '7') //If Button 7 is pressed
   {Serial.println ("Button 7");
   if (Number==0)
   Number=7;
   else
   Number = (Number*10) + 7; //Pressed twice
   }
 

   if (key == '0')
   {Serial.println ("Button 0"); //Button 0 is Pressed
   if (Number==0)
   Number=0;
   else
   Number = (Number*10) + 0; //Pressed twice
   }
   
    if (key == '2') //Button 2 is Pressed
   {Serial.println ("Button 2");
    if (Number==0)
   Number=2;
   else
   Number = (Number*10) + 2; //Pressed twice
   }
   
    if (key == '5')
   {Serial.println ("Button 5");
    if (Number==0)
   Number=5;
   else
   Number = (Number*10) + 5; //Pressed twice
   }
   
    if (key == '8')
   {Serial.println ("Button 8");
    if (Number==0)
   Number=8;
   else
   Number = (Number*10) + 8; //Pressed twice
   }  
 

   if (key == '#')
   {Serial.println ("Button Equal");
   Num2=Number;
   result = true;
   }
   
    if (key == '3')
   {Serial.println ("Button 3");
    if (Number==0)
   Number=3;
   else
   Number = (Number*10) + 3; //Pressed twice
   }
   
    if (key == '6')
   {Serial.println ("Button 6");
   if (Number==0)
   Number=6;
   else
   Number = (Number*10) + 6; //Pressed twice
   }
   
    if (key == '9')
   {Serial.println ("Button 9");
   if (Number==0)
   Number=9;
   else
   Number = (Number*10) + 9; //Pressed twice
   }  

     if (key == 'A' || key == 'B' || key == 'C' || key == 'D') //Detecting Buttons on Column 4
 {
   Num1 = Number;    
   Number =0;
   if (key == 'A')
   {Serial.println ("Addition"); action = '+';}
    if (key == 'B')
   {Serial.println ("Subtraction"); action = '-'; }
    if (key == 'C')
   {Serial.println ("Multiplication"); action = '*';}
    if (key == 'D')
   {Serial.println ("Devesion"); action = '/';}  

   delay(100);
 }
 
}

void CalculateResult()
{
 if (action=='+')
   Number = Num1+Num2;

 if (action=='-')
   Number = Num1-Num2;

 if (action=='*')
   Number = Num1*Num2;

 if (action=='/')
   Number = Num1/Num2;
}

void DisplayResult()
{
 lcd.setCursor(0, 0);   // set the cursor to column 0, line 1
 lcd.print(Num1); lcd.print(action); lcd.print(Num2);
 
 if (result==true)
 {lcd.print(" ="); lcd.print(Number);} //Display the result
 
 lcd.setCursor(0, 1);   // set the cursor to column 0, line 1
 lcd.print(Number); //Display the result
}
 
Odpowiedź
#2
Jak potrzebujesz więcej przycisków to prościej byłoby wziąć większa klawiaturę. Możesz też zrobić tak, że zepniesz wiersze (zakładając układ poziomy, klawiatura 1 obok 2) klawiatur i dodasz tylko kolejne kolumny odpowiednio modyfikując obecne definicje klawiatury. Np. dodanie 2 kolumn zwiększy COLS o 2 i w każdej komórce tablicy keys w wierszach trzeba dodać 2 znaki z tych dwóch kolumn.
 
Odpowiedź
#3
Tak to zrozumiałe, czy dobrze?

Kod:
#include <Keypad.h> //Header file for Keypad from https://github.com/Chris--A/Keypad

const byte ROWS = 4; // Four rows
const byte COLS = 8; // Three columns

// Define the Keymap
char keys[ROWS][COLS] = {

{'7','8','9','D','E','F','G','X'},

{'4','5','6','C','H','I','J','Y'},

{'1','2','3','B','K','L','M','Z'},

{'*','0','#','A','N','O','P','O'},

};


Załączone pliki Miniatury
   
 
Odpowiedź
#4
O coś takiego mi chodziło, czy dobrze to nie wiem. Sam nie wpadłem na to by coś takiego zrobić. Skompiluj i wgraj, jak będzie działać źle to najpierw dodaj 1 kolumnę, nie wiem ile każda zjada pamięci i czasu procesora. Sam musisz przetestować.
 
Odpowiedź
#5
Dopiero teraz zauważyłem, że chyba ten kalkulator nie obsługuje działań typu 1+2+3=6, a tylko pojedyncze działanie, więc nie będę go robił bo mi się nie przyda. Dziękuję za pomoc.
 
Odpowiedź
#6
(24-10-2018, 20:28)muczak napisał(a): Dopiero teraz zauważyłem, że chyba ten kalkulator nie obsługuje działań typu 1+2+3=6, a tylko pojedyncze działanie, więc nie będę go robił bo mi się nie przyda. Dziękuję za pomoc.

Użyj ONP.
 
Odpowiedź
#7
Poczytałem co to jest, nie znalazłem żadnego kodu pod arduino, sam nie czuje się na siłach by takie coś napisać. Jakieś tam drobne modyfikacje metodą analizy kodu jeszcze by były do przełknięcia (z pomocą forumowiczów oczywiście hehe). Arduino przyszło będę się bawił w coś prostrzego. Zamówiłem lcd, do niego konwerter i2c, moduły rf 433, elementów analogowych mam kilogramy tak więc coś tam się może poduczę.
 
Odpowiedź
#8
(26-10-2018, 15:40)muczak napisał(a): Zamówiłem lcd, do niego konwerter i2c
Konwerter na PCF8574 (bo na 90% taki zamówiłeś)do LCD to zły pomysł.
 
Odpowiedź
#9
Zgadza się. Dlaczego zły?
 
Odpowiedź
#10
(26-10-2018, 16:20)muczak napisał(a): Zgadza się. Dlaczego zły?
Robiłem już wykłady na ten temat i nie chce mi się ich powtarzać. W skrócie:
- jeśli mają być zachowane zależności czasowe sygnału strobującego będzie to działać jak żółw.
- jak (co robią biblioteki) zrobi się to trochę nie tak jak powinno, nie z każdym sterownikiem LCD zadziała taki konwerter ale działa ze znośną prędkością ale nadal wolno, widać jak jest odrysowywany ekran

Jedyne rozsądne wyjście LCD z wbudowanym sterownikiem I2C, najczęściej sa konfigurowane I2C, SPI, równoległy.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości