Meter box with float values! using: keypad + Nokia + Nema 23

hello guys.. i need your help

I am buliding this system that i hope i colud use it controlling the meassure of cut in a machine, its for a project in my university and i will be super gratfull if you help me (dont speak perfectly english)

Components

  • arduino Mega
  • Stepper motor Nema 23
  • TB6560 for control de stepper motor
  • Keypad 4x4
  • Nokia 5110

but my specific question is:
I will work in Cm, what can i do for have a number with decimals: "45.4 Cm (example)", the code that i posted works propertly with int or long value: "45 Cm (Example)" but i really need to work with decimals.

I made a little reseach and i can convert a string to a float value with the function atof(), but i dont know how to use it in those specific parts where i think i have to do the convert f the variable.

The idea is have numbers between 0.0 - 250.0 (Cm)

void checknumber(float x){
  if (firstnumber == 99) { // Check if this is the first number entered
    firstnumber=x;
    String displayvalue = String(firstnumber);  //  Transform int to a string for display
    drawnokiascreen(displayvalue); // Redraw Nokia lcd
    
  } else {
    if (secondnumber == 99) {  // Check if it's the second number entered
      secondnumber=x;
      String displayvalue = (String(firstnumber) + String(secondnumber));
      drawnokiascreen(displayvalue);
 
    } else {  
     if (thirdnumber == 99) {  // Check if it's the third number entered
      thirdnumber=x;
      String displayvalue = (String(firstnumber) + String(secondnumber) + String(thirdnumber));
      drawnokiascreen(displayvalue);

       } else {  // It must be the 4rd number entered
      fourthnumber=x;
      String displayvalue = (String(firstnumber) + String(secondnumber) + String(thirdnumber)+ String(fourthnumber));
      drawnokiascreen(displayvalue);
 
    }
  }
}
        Serial.println(keyfullnumber);
}
 
void deletenumber() {  // Used to backspace entered numbers

   if (fourthnumber !=99) {
      String displayvalue = (String(firstnumber) + String(secondnumber) + String(thirdnumber));
      drawnokiascreen(displayvalue);
 
    fourthnumber=99;
}
else
  if (thirdnumber !=99) {
      String displayvalue = (String(firstnumber) + String(secondnumber));
      drawnokiascreen(displayvalue);
 
    thirdnumber=99;
  } 
  else {
    if (secondnumber !=99) {
      String displayvalue = String(firstnumber);
      drawnokiascreen(displayvalue);
 
      secondnumber=99;
   } 
   else {
     if (firstnumber !=99) {
       String displayvalue = "";
       drawnokiascreen(displayvalue);
 
       firstnumber=99;
      }
    }
  }
}
  
void calculatedistance() {  // Used to create a full number from entered numbers
 
    if (fourthnumber == 99 && thirdnumber == 99 && secondnumber == 99 && firstnumber != 99 ) {
      keyfullnumber=firstnumber;
      movestepper(keyfullnumber);
    }
    
    if (secondnumber != 99 && thirdnumber == 99 && fourthnumber== 99) {
      keyfullnumber=(firstnumber*10)+secondnumber;
      movestepper(keyfullnumber);
    }
    
    if (thirdnumber != 99 && fourthnumber==99) {
      keyfullnumber=(firstnumber*100)+(secondnumber*10)+thirdnumber;
      movestepper(keyfullnumber);
    }
      if (fourthnumber != 99) {
      keyfullnumber=(firstnumber*1000)+(secondnumber*100)+(thirdnumber*10)+fourthnumber;
      movestepper(keyfullnumber);
    }
    
    resetnumbers(); // Reset numbers to get ready for new entry
  } 

 
void movestepper(int z) {  //  Move the stepper
 
  long calculatedmove=((z*1600L)/80);  //  Calculate number of steps needed in mm
  stepper.runToNewPosition(calculatedmove);
  currentposition = String(z);
 
  u8g.firstPage();
  do {
    u8g.drawHLine(0, 15, 84);
    u8g.drawVLine(50, 16, 38);
    u8g.drawHLine(0, 35, 84); 
    u8g.setFont(u8g_font_profont11);
    u8g.drawStr(0, 10, "ENTER DISTANCE");
    u8g.drawStr(62, 29, "Cm");
    u8g.drawStr(4, 46, "cur-pos");
    u8g.setPrintPos(57,47);
    u8g.print(currentposition);       
  }
  while( u8g.nextPage() ); 
}
                
void resetnumbers() {  // Reset numbers for next entry
  firstnumber=99;
  secondnumber=99;
  thirdnumber=99;
  fourthnumber=99;
}

I hope it could be solved i really dont have too much knowledge on systems

Thank you Guys

Here is the complete code

#include <AccelStepper.h> // AccelStepper Library
#include <Keypad.h>  // Keypad Library
#include "U8glib.h"  // U8glib for Nokia LCD

 
// Variables to hold entered number on Keypad
volatile int firstnumber=99;  // used to tell how many numbers were entered on keypad
volatile int secondnumber=99;
volatile int thirdnumber=99;
volatile int fourthnumber=99;
 
// Variables to hold Distance and CurrentPosition
int keyfullnumber=0;  // used to store the final calculated distance value
String currentposition = "";  // Used for display on Nokia LCD
 
 
// Keypad Setup
const byte ROWS = 4; // Four Rows
const byte COLS = 4; // Four Columns
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {22, 24, 26, 28}; // Arduino pins connected to the row pins of the keypad
byte colPins[COLS] = {31, 33, 35, 37}; // Arduino pins connected to the column pins of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );  // Keypad Library definition
 
 
// U8glib Setup for Nokia LCD
#define backlight_pin 11
U8GLIB_PCD8544 u8g(3, 4, 6, 5, 7);  // Arduino pins connected to Nokia pins:
                                    // CLK=3, DIN=4, CE=6, DC=5, RST=7
                                    
                                    
// AccelStepper Setup
AccelStepper stepper(1, A0, A1);  // 1 = Easy Driver interface
                                  // Arduino A0 connected to STEP pin of Easy Driver
                                  // Arduino A1 connected to DIR pin of Easy Driver
                                  
 #define Limit01 2  
 const int ledPin1 =  9;      // <=======  the number of the LED REDpin
const int ledPin2 =  8;       // <=======  the number of the LED GREEN pin
int step_speed = 2;  // Speed of Stepper motor (higher = slower)on Homing mode

 
void setup(void) {

 
 {
pinMode(Limit01, INPUT);

pinMode(A1, OUTPUT);
pinMode(A0, OUTPUT);
//pinMode(pot_pin, INPUT);
 pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
 
  
while (!digitalRead(Limit01)) 
{
digitalWrite(A0, HIGH);
digitalWrite(A1, LOW);//LOW=clocwise/high=anti-clocwise
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin1, HIGH);
delay(step_speed);
digitalWrite(A0, LOW);

digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin1, LOW);
delay(step_speed);
}
}
  //  Light up the LCD backlight LEDS
  analogWrite(backlight_pin, 80);  // Set the Backlight intensity (0=Bright, 255=Dim)
    
  //  AccelStepper speed and acceleration setup
  stepper.setMaxSpeed(1200);  // Not to fast or you will have missed steps
  stepper.setAcceleration(200);  //  Same here
  
  // Draw starting screen on Nokia LCD
  u8g.firstPage();
 do {
  u8g.drawHLine(0, 15, 84);
  u8g.drawVLine(50, 16, 38);
  u8g.drawHLine(0, 35, 84); 
  u8g.setFont(u8g_font_profont11);
  u8g.drawStr(0,10, "ENTER DISTANCE");
  u8g.drawStr(62, 29, "Cm");
  u8g.drawStr(4, 46, "cur-pos");
  u8g.drawStr(57, 47, "Home");     //when hit Home switch 
  }
  while( u8g.nextPage() );
  
 }
 
void loop(){
  
  char keypressed = keypad.getKey();  // Get value of keypad button if pressed
  if (keypressed != NO_KEY){  // If keypad button pressed check which key it was
    switch (keypressed) {
      
      case '1':
        checknumber(1);
      break;
        
      case '2':
        checknumber(2);
      break;
 
      case '3':
        checknumber(3);
      break;
 
      case '4':
        checknumber(4);
      break;
 
      case '5':
        checknumber(5);
      break;
 
      case '6':
        checknumber(6);
      break;
 
      case '7':
        checknumber(7);
      break;
 
      case '8':
        checknumber(8);
      break;
 
      case '9':
        checknumber(9);
      break;
 
      case '0':
        checknumber(0);
      break;
 
      case '*':
        deletenumber();
      break;
 
      case '#':
        calculatedistance();
      break;
    }
  }
 
}
 
void checknumber(float x){
  if (firstnumber == 99) { // Check if this is the first number entered
    firstnumber=x;
    String displayvalue = String(firstnumber);  //  Transform int to a string for display
    drawnokiascreen(displayvalue); // Redraw Nokia lcd
    
  } else {
    if (secondnumber == 99) {  // Check if it's the second number entered
      secondnumber=x;
      String displayvalue = (String(firstnumber) + String(secondnumber));
      drawnokiascreen(displayvalue);
 
    } else {  
     if (thirdnumber == 99) {  // Check if it's the third number entered
      thirdnumber=x;
      String displayvalue = (String(firstnumber) + String(secondnumber) + String(thirdnumber));
      drawnokiascreen(displayvalue);

       } else {  // It must be the 4rd number entered
      fourthnumber=x;
      String displayvalue = (String(firstnumber) + String(secondnumber) + String(thirdnumber)+ String(fourthnumber));
      drawnokiascreen(displayvalue);
 
    }
  }
}
        Serial.println(keyfullnumber);
}
 
void deletenumber() {  // Used to backspace entered numbers

   if (fourthnumber !=99) {
      String displayvalue = (String(firstnumber) + String(secondnumber) + String(thirdnumber));
      drawnokiascreen(displayvalue);
 
    fourthnumber=99;
}
else
  if (thirdnumber !=99) {
      String displayvalue = (String(firstnumber) + String(secondnumber));
      drawnokiascreen(displayvalue);
 
    thirdnumber=99;
  } 
  else {
    if (secondnumber !=99) {
      String displayvalue = String(firstnumber);
      drawnokiascreen(displayvalue);
 
      secondnumber=99;
   } 
   else {
     if (firstnumber !=99) {
       String displayvalue = "";
       drawnokiascreen(displayvalue);
 
       firstnumber=99;
      }
    }
  }
}
  
void calculatedistance() {  // Used to create a full number from entered numbers
 
    if (fourthnumber == 99 && thirdnumber == 99 && secondnumber == 99 && firstnumber != 99 ) {
      keyfullnumber=firstnumber;
      movestepper(keyfullnumber);
    }
    
    if (secondnumber != 99 && thirdnumber == 99 && fourthnumber== 99) {
      keyfullnumber=(firstnumber*10)+secondnumber;
      movestepper(keyfullnumber);
    }
    
    if (thirdnumber != 99 && fourthnumber==99) {
      keyfullnumber=(firstnumber*100)+(secondnumber*10)+thirdnumber;
      movestepper(keyfullnumber);
    }
      if (fourthnumber != 99) {
      keyfullnumber=(firstnumber*1000)+(secondnumber*100)+(thirdnumber*10)+fourthnumber;
      movestepper(keyfullnumber);
    }
    
    resetnumbers(); // Reset numbers to get ready for new entry
  } 

 
void movestepper(int z) {  //  Move the stepper
 
  long calculatedmove=((z*1600L)/80);  //  Calculate number of steps needed in mm
  stepper.runToNewPosition(calculatedmove);
  currentposition = String(z);
 
  u8g.firstPage();
  do {
    u8g.drawHLine(0, 15, 84);
    u8g.drawVLine(50, 16, 38);
    u8g.drawHLine(0, 35, 84); 
    u8g.setFont(u8g_font_profont11);
    u8g.drawStr(0, 10, "ENTER DISTANCE");
    u8g.drawStr(62, 29, "Cm");
    u8g.drawStr(4, 46, "cur-pos");
    u8g.setPrintPos(57,47);
    u8g.print(currentposition);       
  }
  while( u8g.nextPage() ); 
}
                
void resetnumbers() {  // Reset numbers for next entry
  firstnumber=99;
  secondnumber=99;
  thirdnumber=99;
  fourthnumber=99;
} 
  
 
void drawnokiascreen(String y) {
 
    u8g.firstPage();
    do {
      u8g.drawHLine(0, 15, 84);
      u8g.drawVLine(50, 16, 38);
      u8g.drawHLine(0, 35, 84); 
      u8g.setFont(u8g_font_profont11);
      u8g.drawStr(0, 10, "ENTER DISTANCE");
      u8g.setPrintPos(0,29);
      u8g.print(y);  // Put entered number on Nokia lcd    
      u8g.drawStr(62, 29, "Cm");
      u8g.drawStr(4, 46, "cur-pos");
      u8g.setPrintPos(57,47); 
      u8g.print(currentposition);  //  Display current position of stepper
    }
      while( u8g.nextPage() );

      
 
}

Don't use floating point, use integers, but work in units of 1mm (or tenths of a mm if you need to work to two decimals of a cm)

TolpuddleSartre:
Don't use floating point, use integers, but work in units of 1mm (or tenths of a mm if you need to work to two decimals of a cm)

You are talking about this?

void checknumber(float x){
  if (firstnumber == 99) { // Check if this is the first number entered
    firstnumber=x;
    String displayvalue = String(firstnumber);  //  Transform int to a string for display
    drawnokiascreen(displayvalue); // Redraw Nokia lcd

Because is the only place where i think i am defining as a float , the variable.

sorry if i am wrong but, you are talking about that i have to write it like this ?

void checknumber(int x){
  if (firstnumber == 99) { // Check if this is the first number entered
    firstnumber=x;
    String displayvalue = String(firstnumber);  //  Transform int to a string for display
    drawnokiascreen(displayvalue); // Redraw Nokia lcd

It is a bad idea to use Strings on Arduino. They cause memory problems and program crashes.

Use C-strings (character arrays) instead.

Hello everyone i need this, maybe is easy for you, but i dont have a lot of knowledge with code. (i dont speek english)

The thing that i want to do is:
Read from a Keypad, some numbers and i will show them into a LCD. i want to create a numer like this:

23.4 cm

I know my code is working, but just creating a number like this: 2345 cm.

The question is.... how can I change my code for take that number with a dot, because i will work between thee range: 0,0 - 250,0 (cm) ......i really dont know what to do

The code:

void checknumber(float x){
  if (firstnumber == 99) { // Check if this is the first number entered
    firstnumber=x;
    String displayvalue = String(firstnumber);  //  Transform int to a string for display
    drawnokiascreen(displayvalue); // Redraw Nokia lcd
    
  } else {
    if (secondnumber == 99) {  // Check if it's the second number entered
      secondnumber=x;
      String displayvalue = (String(firstnumber) + String(secondnumber));
      drawnokiascreen(displayvalue);
 
    } else {  
     if (thirdnumber == 99) {  // Check if it's the third number entered
      thirdnumber=x;
      String displayvalue = (String(firstnumber) + String(secondnumber) + String(thirdnumber));
      drawnokiascreen(displayvalue);

       } else {  // It must be the 4rd number entered
      fourthnumber=x;
      String displayvalue = (String(firstnumber) + String(secondnumber) + String(thirdnumber)+ String(fourthnumber));
      drawnokiascreen(displayvalue);
 
    }
  }
}
        Serial.println(keyfullnumber);
}

Google "arduino keypad enter float" for many posts on the subject.

jremington:
It is a bad idea to use Strings on Arduino. They cause memory problems and program crashes.

Use C-strings (character arrays) instead.

ok, Thank you, i was thinking in made a char null- termined with inside all the numbers that i will ask from the kaypad and then convert number it with atof() function into a float point value. do youi think its a good idea ?

Good idea. The function atof() expects a zero terminated character array, not a String object.