Go Down

Topic: Newbie problem: Displaying integer value on Nokia 5110 display (Read 995 times) previous topic - next topic

Deus_Ex_Machina

Hi,

I'm working on my first program ever.
A spot welder to build batteries.
The next thing, I'd like to accomplish, is displaying the value of the duration of the 2 pulses and the pause inbetween on a Nokia 5110

I've managed to copy some code together and adjust it to show things I write in the program in 3 lines.
However, I would like it to be 5 lines and I would like to display the value of 3 different integers in decimal form.

I'ver tried using lcd.print and char, but I just can't wrap my head around this.
Maybe I'm using the wrong libraries for the purpose.
Could you please give me some pointers?

Code: [Select]
#include <HW_ARM_defines.h>
#include <HW_AVR_defines.h>
#include <HW_PIC32_defines.h>
#include <LCD5110_Basic.h>

// for display
int p1 = 555;
int d1 = 556;
int p2 = 557;



// The pins to use on the arduino
#define PIN_SCE   12
#define PIN_RESET 11
#define PIN_DC    10
#define PIN_SDIN  9
#define PIN_SCLK  8

// COnfiguration for the LCD
#define LCD_C     LOW
#define LCD_D     HIGH
#define LCD_CMD   0

// Size of the LCD
#define LCD_X     84
#define LCD_Y     48

int scrollPosition = 0;

static const byte ASCII[][5] =
{
 {
   0x00, 0x00, 0x00, 0x00, 0x00  } // 20
 ,{
   0x00, 0x00, 0x5f, 0x00, 0x00  } // 21 !
 ,{
   0x00, 0x07, 0x00, 0x07, 0x00  } // 22 "
 ,{
   0x14, 0x7f, 0x14, 0x7f, 0x14  } // 23 #
 ,{
   0x24, 0x2a, 0x7f, 0x2a, 0x12  } // 24 $
 ,{
   0x23, 0x13, 0x08, 0x64, 0x62  } // 25 %
 ,{
   0x36, 0x49, 0x55, 0x22, 0x50  } // 26 &
 ,{
   0x00, 0x05, 0x03, 0x00, 0x00  } // 27 '
 ,{
   0x00, 0x1c, 0x22, 0x41, 0x00  } // 28 (
 ,{
   0x00, 0x41, 0x22, 0x1c, 0x00  } // 29 )
 ,{
   0x14, 0x08, 0x3e, 0x08, 0x14  } // 2a *
 ,{
   0x08, 0x08, 0x3e, 0x08, 0x08  } // 2b +
 ,{
   0x00, 0x50, 0x30, 0x00, 0x00  } // 2c ,
 ,{
   0x08, 0x08, 0x08, 0x08, 0x08  } // 2d -
 ,{
   0x00, 0x60, 0x60, 0x00, 0x00  } // 2e .
 ,{
   0x20, 0x10, 0x08, 0x04, 0x02  } // 2f /
 ,{
   0x3e, 0x51, 0x49, 0x45, 0x3e  } // 30 0
 ,{
   0x00, 0x42, 0x7f, 0x40, 0x00  } // 31 1
 ,{
   0x42, 0x61, 0x51, 0x49, 0x46  } // 32 2
 ,{
   0x21, 0x41, 0x45, 0x4b, 0x31  } // 33 3
 ,{
   0x18, 0x14, 0x12, 0x7f, 0x10  } // 34 4
 ,{
   0x27, 0x45, 0x45, 0x45, 0x39  } // 35 5
 ,{
   0x3c, 0x4a, 0x49, 0x49, 0x30  } // 36 6
 ,{
   0x01, 0x71, 0x09, 0x05, 0x03  } // 37 7
 ,{
   0x36, 0x49, 0x49, 0x49, 0x36  } // 38 8
 ,{
   0x06, 0x49, 0x49, 0x29, 0x1e  } // 39 9
 ,{
   0x00, 0x36, 0x36, 0x00, 0x00  } // 3a :
 ,{
   0x00, 0x56, 0x36, 0x00, 0x00  } // 3b ;
 ,{
   0x08, 0x14, 0x22, 0x41, 0x00  } // 3c <
 ,{
   0x14, 0x14, 0x14, 0x14, 0x14  } // 3d =
 ,{
   0x00, 0x41, 0x22, 0x14, 0x08  } // 3e >
 ,{
   0x02, 0x01, 0x51, 0x09, 0x06  } // 3f ?
 ,{
   0x32, 0x49, 0x79, 0x41, 0x3e  } // 40 @
 ,{
   0x7e, 0x11, 0x11, 0x11, 0x7e  } // 41 A
 ,{
   0x7f, 0x49, 0x49, 0x49, 0x36  } // 42 B
 ,{
   0x3e, 0x41, 0x41, 0x41, 0x22  } // 43 C
 ,{
   0x7f, 0x41, 0x41, 0x22, 0x1c  } // 44 D
 ,{
   0x7f, 0x49, 0x49, 0x49, 0x41  } // 45 E
 ,{
   0x7f, 0x09, 0x09, 0x09, 0x01  } // 46 F
 ,{
   0x3e, 0x41, 0x49, 0x49, 0x7a  } // 47 G
 ,{
   0x7f, 0x08, 0x08, 0x08, 0x7f  } // 48 H
 ,{
   0x00, 0x41, 0x7f, 0x41, 0x00  } // 49 I
 ,{
   0x20, 0x40, 0x41, 0x3f, 0x01  } // 4a J
 ,{
   0x7f, 0x08, 0x14, 0x22, 0x41  } // 4b K
 ,{
   0x7f, 0x40, 0x40, 0x40, 0x40  } // 4c L
 ,{
   0x7f, 0x02, 0x0c, 0x02, 0x7f  } // 4d M
 ,{
   0x7f, 0x04, 0x08, 0x10, 0x7f  } // 4e N
 ,{
   0x3e, 0x41, 0x41, 0x41, 0x3e  } // 4f O
 ,{
   0x7f, 0x09, 0x09, 0x09, 0x06  } // 50 P
 ,{
   0x3e, 0x41, 0x51, 0x21, 0x5e  } // 51 Q
 ,{
   0x7f, 0x09, 0x19, 0x29, 0x46  } // 52 R
 ,{
   0x46, 0x49, 0x49, 0x49, 0x31  } // 53 S
 ,{
   0x01, 0x01, 0x7f, 0x01, 0x01  } // 54 T
 ,{
   0x3f, 0x40, 0x40, 0x40, 0x3f  } // 55 U
 ,{
   0x1f, 0x20, 0x40, 0x20, 0x1f  } // 56 V
 ,{
   0x3f, 0x40, 0x38, 0x40, 0x3f  } // 57 W
 ,{
   0x63, 0x14, 0x08, 0x14, 0x63  } // 58 X
 ,{
   0x07, 0x08, 0x70, 0x08, 0x07  } // 59 Y
 ,{
   0x61, 0x51, 0x49, 0x45, 0x43  } // 5a Z
 ,{
   0x00, 0x7f, 0x41, 0x41, 0x00  } // 5b [
 ,{
   0x02, 0x04, 0x08, 0x10, 0x20  } // 5c ¥
 ,{
   0x00, 0x41, 0x41, 0x7f, 0x00  } // 5d ]
 ,{
   0x04, 0x02, 0x01, 0x02, 0x04  } // 5e ^
 ,{
   0x40, 0x40, 0x40, 0x40, 0x40  } // 5f _
 ,{
   0x00, 0x01, 0x02, 0x04, 0x00  } // 60 `
 ,{
   0x20, 0x54, 0x54, 0x54, 0x78  } // 61 a
 ,{
   0x7f, 0x48, 0x44, 0x44, 0x38  } // 62 b
 ,{
   0x38, 0x44, 0x44, 0x44, 0x20  } // 63 c
 ,{
   0x38, 0x44, 0x44, 0x48, 0x7f  } // 64 d
 ,{
   0x38, 0x54, 0x54, 0x54, 0x18  } // 65 e
 ,{
   0x08, 0x7e, 0x09, 0x01, 0x02  } // 66 f
 ,{
   0x0c, 0x52, 0x52, 0x52, 0x3e  } // 67 g
 ,{
   0x7f, 0x08, 0x04, 0x04, 0x78  } // 68 h
 ,{
   0x00, 0x44, 0x7d, 0x40, 0x00  } // 69 i
 ,{
   0x20, 0x40, 0x44, 0x3d, 0x00  } // 6a j
 ,{
   0x7f, 0x10, 0x28, 0x44, 0x00  } // 6b k
 ,{
   0x00, 0x41, 0x7f, 0x40, 0x00  } // 6c l
 ,{
   0x7c, 0x04, 0x18, 0x04, 0x78  } // 6d m
 ,{
   0x7c, 0x08, 0x04, 0x04, 0x78  } // 6e n
 ,{
   0x38, 0x44, 0x44, 0x44, 0x38  } // 6f o
 ,{
   0x7c, 0x14, 0x14, 0x14, 0x08  } // 70 p
 ,{
   0x08, 0x14, 0x14, 0x18, 0x7c  } // 71 q
 ,{
   0x7c, 0x08, 0x04, 0x04, 0x08  } // 72 r
 ,{
   0x48, 0x54, 0x54, 0x54, 0x20  } // 73 s
 ,{
   0x04, 0x3f, 0x44, 0x40, 0x20  } // 74 t
 ,{
   0x3c, 0x40, 0x40, 0x20, 0x7c  } // 75 u
 ,{
   0x1c, 0x20, 0x40, 0x20, 0x1c  } // 76 v
 ,{
   0x3c, 0x40, 0x30, 0x40, 0x3c  } // 77 w
 ,{
   0x44, 0x28, 0x10, 0x28, 0x44  } // 78 x
 ,{
   0x0c, 0x50, 0x50, 0x50, 0x3c  } // 79 y
 ,{
   0x44, 0x64, 0x54, 0x4c, 0x44  } // 7a z
 ,{
   0x00, 0x08, 0x36, 0x41, 0x00  } // 7b {
 ,{
   0x00, 0x00, 0x7f, 0x00, 0x00  } // 7c |
 ,{
   0x00, 0x41, 0x36, 0x08, 0x00  } // 7d }
 ,{
   0x10, 0x08, 0x08, 0x10, 0x08  } // 7e ?
 ,{
   0x00, 0x06, 0x09, 0x09, 0x06  } // 7f ?
};



void LcdCharacter(char character)
{
 LcdWrite(LCD_D, 0x00);
 for (int index = 0; index < 5; index++)
 {
   LcdWrite(LCD_D, ASCII[character - 0x20][index]);
 }
 LcdWrite(LCD_D, 0x00);
}

void LcdClear(void)
{
 for (int index = 0; index < LCD_X * LCD_Y / 8; index++)
 {
   LcdWrite(LCD_D, 0x00);
 }
}

void LcdInitialise(void)
{
 pinMode(PIN_SCE,   OUTPUT);
 pinMode(PIN_RESET, OUTPUT);
 pinMode(PIN_DC,    OUTPUT);
 pinMode(PIN_SDIN,  OUTPUT);
 pinMode(PIN_SCLK,  OUTPUT);

 digitalWrite(PIN_RESET, LOW);
 digitalWrite(PIN_RESET, HIGH);

 LcdWrite(LCD_CMD, 0x21);  // LCD Extended Commands.
 LcdWrite(LCD_CMD, 0xBf);  // Set LCD Vop (Contrast). //B1
 LcdWrite(LCD_CMD, 0x04);  // Set Temp coefficent. //0x04
 LcdWrite(LCD_CMD, 0x14);  // LCD bias mode 1:48. //0x13
 LcdWrite(LCD_CMD, 0x0C);  // LCD in normal mode. 0x0d for inverse
 LcdWrite(LCD_C, 0x20);
 LcdWrite(LCD_C, 0x0C);
}

void LcdString(char *characters)
{
 while (*characters)
 {
   LcdCharacter(*characters++);
 }
}

void LcdWrite(byte dc, byte data)
{
 digitalWrite(PIN_DC, dc);
 digitalWrite(PIN_SCE, LOW);
 shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data);
 digitalWrite(PIN_SCE, HIGH);
}

/**
* gotoXY routine to position cursor
* x - range: 0 to 84
* y - range: 0 to 5
*/
void gotoXY(int x, int y)
{
 LcdWrite( 0, 0x80 | x);  // Column.
 LcdWrite( 0, 0x40 | y);  // Row.
}


void setup() {

 Serial.begin(9600);
 Serial.print(duration1);
 Serial.print(duration2);
 Serial.print(duration3);


 // declaring pins as input and output
 pinMode(fetPin, OUTPUT);
 pinMode(TriggerPin, INPUT);  
 pinMode(increase1Pin, INPUT);
 pinMode(decrease1Pin, INPUT);
 pinMode(increase2Pin, INPUT);
 pinMode(decrease2Pin, INPUT);
 pinMode(increase3Pin, INPUT);
 pinMode(decrease3Pin, INPUT);



 LcdInitialise();
 LcdClear();


}

void loop()
{

// I deleted the rest of the program

   gotoXY(1,1);
   LcdString("P1:");
   gotoXY(30,1);
   char buffer [33];
   itoa (p1,buffer,10);
   printf ("decimal: %s\n",buffer);
   gotoXY(57,1);
   LcdString(" ms");

   gotoXY(1,3);
   LcdString("Dl:");
   gotoXY(30,3);
   LcdString("d1");
   gotoXY(65,3);
   LcdString("ms");

   gotoXY(1,5);
   LcdString("P2:");
   gotoXY(30,5);
   LcdString("p2");
   gotoXY(65,5);
   LcdString("ms");
 }

}



semicolo

Hi there, don't use printf

after the call to itoa (p1,buffer,10);
have:
LcdString("decimal: ");
LcdString(buffer); // buffer now contains a string of the value of p1

Then you need other calls to itoa to convert d1 and p2 to string and call LcdString(buffer) to print these strings.

Be careful you can only have 14 characters on a line, looks like you'll overwrite your strings when doing some gotoXY and some string will overlap on the next line.

You almost got it though, keep trying!

Nick_Pyner

#2
Mar 31, 2013, 08:40 am Last Edit: Mar 31, 2013, 02:28 pm by Nick_Pyner Reason: 1
You might try ditching the LCD library and using the Philips PCD8544.h. I can't be sure it will fix your problem but it will enable you to use the 5110 much like you use any other LCD, and that should help. Note though that your pin settings are done in the library rather than your sketch but you should be able to standardise on this, thereby making this a once-only setting.  Note also that there is a handy on-line glyph facility for this library which you might find useful.

Deus_Ex_Machina

@ semicolon

Thank a lot. That really helped me.
I got it to work now.
I don't understand what the line
LcdString("decimal: ");
was supposed to do.
It seems to work as intended without it though.

Code: [Select]

  {
    gotoXY(1,1);
    LcdString("P1:");
    gotoXY(30,1);
    char buffer [33];
    itoa (p1,buffer,10);
    LcdString(buffer);
    gotoXY(57,1);
    LcdString(" ms");

    gotoXY(1,3);
    LcdString("Dl:");
    gotoXY(30,3);
    char buffer1 [33];
    itoa (d1,buffer1,10);
    LcdString(buffer1);
    gotoXY(65,3);
    LcdString("ms");

    gotoXY(1,5);
    LcdString("P2:");
    gotoXY(30,5);
    char buffer2 [33];
    itoa (p2,buffer2,10);
    LcdString(buffer2);
    gotoXY(65,5);
    LcdString("ms");
  }



@ Nick_Pyner

Thanks Nick,

I'll look into that. From what I can tell, the library, I'm using doesn't use the whole display.
If I could display 4 or 5 lines in the size of what I have now, it would be enough for my device.

However the 20x4 character display would make it a lot easier to work with.

Nick_Pyner



From what I can tell, the library, I'm using doesn't use the whole display.
If I could display 4 or 5 lines in the size of what I have now, it would be enough for my device.

However the 20x4 character display would make it a lot easier to work with.


I have a 20x4 and it is very good but I don't use it. My 5110s are nominally on 12x6 and I find the extra lines are more valuable than the extra width.  That said, I do squeeze things up a little with edited characters and judicious start points.....

Deus_Ex_Machina

If I manage to display 5 lines, that would be excellent.

I could have
- a voltage readout
- readout for each of the pulses
- and implement a saftey locking mechanism: you have to press a button on the keypad, for the saftey to be off and the trigger to be hot. After 1 Minute of not triggering, it is locked again and you have to unlock first. That would make it safer maybe.



Nick_Pyner


If I manage to display 5 lines, that would be excellent.



OK, so with the 12x6 setup you could have a bar graph at the bottom!

Don't ask how to do that, but I'm sure it won't be hard.

semicolo

Notice that for gotoXY:
* x - range: 0 to 84
* y - range: 0 to 5

If you use gotoXY (1,2) and gotoXY (1,4) you should be able to add lines in between the ones you already have.
To add a bargraph on top you just need to
gotoXY(0,0);
Then send 84 bytes describing what you want to display with
LcdWrite(LCD_D, mybyte);
For example
LcdWrite(LCD_D, 0x55);
LcdWrite(LCD_D, 0xAA);
LcdWrite(LCD_D, 0x55);
LcdWrite(LCD_D, 0xAA);
LcdWrite(LCD_D, 0x55);
LcdWrite(LCD_D, 0xAA);
should display a checkers pattern

Go Up