How to explode integer?

Hello. I want to explode integer. I have one potentiometer connected to analog pin and reading it's value. I want to explode it's value to 4 strings: num1,num2,... I tried to use "charAt()" but it's not working :(.
In PHP I just need to do "$words = explode($string, "");".

When I'm trying my code it sends crazy numbers to serial:

char at 1: 54
char at 2: 48
char at 3: 0
char at 4: 0

potentiometer: 659

this is my code:

void setup() {
  Serial.begin(9600);
}

void loop() {
  int sensorValue = analogRead(A1);
  analogWrite(A0, sensorValue);
  int a = analogRead(A1);
  String aa=(String)a;
  int a1 = aa.charAt(1);
  int a2 = aa.charAt(2);
  int a3 = aa.charAt(3);
  int a4 = aa.charAt(4);
  Serial.print("char at 1: ");  Serial.println(a1);
  Serial.print("char at 2: ");  Serial.println(a2);
  Serial.print("char at 3: ");  Serial.println(a3);
  Serial.print("char at 4: ");  Serial.println(a4);
  Serial.println("");
  Serial.print("potentiometer: ");  Serial.println(sensorValue);
  Serial.println("");
  delay(100);
}

please help me. how to explode integer??

Not sure what's going on with all that String stuff - simple arithmetic does the trick for me; simple division and multiplication by successive powers of ten.

(FYI, 48 is an ASCII '0', so 54 is an ASCII '6')

  int a1 = aa.charAt(1);
  int a2 = aa.charAt(2);
  int a3 = aa.charAt(3);
  int a4 = aa.charAt(4);

String positions start at 0, not 1.
int a1 = aa.charAt(0) - '0'; will give you a 9 when a is 659.

int a1 = aa.charAt(0) - '0'; will give you a 9 when a is 659.

sp. "will give you a 6", surely?

sp. "will give you a 6", surely?

Not if you turn it upside down. Picky, picky.

charAt, when assigned to an "int" variable, returns the ASCII number of the character at that point in the string, not the character itself.

There is no real difference between the two, only the way that the Serial.println handles it.

In order for Serial.println to see it as a character, and not a number, you have to assign the value to a "char" variable:

char a1 = aa.charAt(0);
Serial.println(a1);

AWOL:
Not sure what's going on with all that String stuff - simple arithmetic does the trick for me; simple division and multiplication by successive powers of ten.

(FYI, 48 is an ASCII '0', so 54 is an ASCII '6')

so it's returning me FYI not ASCII?

so it's returning me FYI not ASCII?

No. FYI == For Your Information...

PaulS:

so it's returning me FYI not ASCII?

No. FYI == For Your Information...

:smiley:
didn't know

I tried replace int with char and in serial it printed me right numbers but when I tried my another program display is still black :(.

main code:

void setup()
{
  pinMode(0, OUTPUT);//LED display1 BL
  pinMode(1, OUTPUT);//LED display1 BOT
  pinMode(2, OUTPUT);//LED display1 BR
  pinMode(20, OUTPUT);//LED display1 MID
  pinMode(17, OUTPUT);//LED display1 TR
  pinMode(18, OUTPUT);//LED display1 TOP
  pinMode(19, OUTPUT);//LED display1 TL
  
  pinMode(3, OUTPUT);//LED display2 BL
  pinMode(4, OUTPUT);//LED display2 BOT
  pinMode(5, OUTPUT);//LED display2 BR
  pinMode(13, OUTPUT);//LED display2 TR
  pinMode(14, OUTPUT);//LED display2 TOP
  pinMode(15, OUTPUT);//LED display2 TL
  pinMode(16, OUTPUT);//LED display2 MID
  
  pinMode(6, OUTPUT);//LED display3 BL
  pinMode(7, OUTPUT);//LED display3 BOT
  pinMode(8, OUTPUT);//LED display3 BR
  pinMode(9, OUTPUT);//LED display3 TOP
  pinMode(10, OUTPUT);//LED display3 TR
  pinMode(12, OUTPUT);//LED display3 MID
  pinMode(11, OUTPUT);//LED display3 TL
  clrdspl1();
  clrdspl2();
  clrdspl3();
}

void loop() {
int a = analogRead(A0);
String aa=(String)a;
char a1 = aa.charAt(0);
char a2 = aa.charAt(1);
char a3 = aa.charAt(2);
if (a>999) {d1nine();d2nine();d3nine();}
switch (a1) {case 0: d3zero();break;case 1: d3one();break;case 2: d3two();break;case 3: d3three();break;case 4: d3four();break;case 5: d3five();break;case 6: d3six();break;case 7: d3seven();break;case 8: d3eight();break;case 9: d3nine();break;}
switch (a2) {case 0: d2zero();break;case 1: d2one();break;case 2: d2two();break;case 3: d2three();break;case 4: d2four();break;case 5: d2five();break;case 6: d2six();break;case 7: d2seven();break;case 8: d2eight();break;case 9: d2nine();break;}
switch (a3) {case 0: d1zero();break;case 1: d1one();break;case 2: d1two();break;case 3: d1three();break;case 4: d1four();break;case 5: d1five();break;case 6: d1six();break;case 7: d1seven();break;case 8: d1eight();break;case 9: d1nine();break;}
delay(100);
call();
}

functions code:

void clrdspl1() {digitalWrite(0, HIGH);digitalWrite(1, HIGH);digitalWrite(2, HIGH);digitalWrite(17, HIGH);digitalWrite(18, HIGH);digitalWrite(19, HIGH);digitalWrite(20, HIGH);}
void clrdspl2() {digitalWrite(3, HIGH);digitalWrite(4, HIGH);digitalWrite(5, HIGH);digitalWrite(13, HIGH);digitalWrite(14, HIGH);digitalWrite(15, HIGH);digitalWrite(16, HIGH);}
void clrdspl3() {digitalWrite(6, HIGH);digitalWrite(7, HIGH);digitalWrite(8, HIGH);digitalWrite(9, HIGH);digitalWrite(10, HIGH);digitalWrite(11, HIGH);digitalWrite(12, HIGH);}

void call() {clrdspl1();clrdspl2();clrdspl3();}

void d1zero() {clrdspl1();digitalWrite(0, LOW);digitalWrite(1, LOW);digitalWrite(2, LOW);digitalWrite(19, LOW);digitalWrite(18, LOW);digitalWrite(17, LOW);}
void d1one() {clrdspl1();digitalWrite(2, LOW);digitalWrite(17, LOW);}
void d1two() {clrdspl1();digitalWrite(18, LOW);digitalWrite(17, LOW);digitalWrite(20, LOW);digitalWrite(0, LOW);digitalWrite(1, LOW);}
void d1three() {clrdspl1();digitalWrite(18, LOW);digitalWrite(17, LOW);digitalWrite(20, LOW);digitalWrite(2, LOW);digitalWrite(1, LOW);}
void d1four() {clrdspl1();digitalWrite(19, LOW);digitalWrite(17, LOW);digitalWrite(20, LOW);digitalWrite(2, LOW);}
void d1five() {clrdspl1();digitalWrite(19, LOW);digitalWrite(18, LOW);digitalWrite(20, LOW);digitalWrite(2, LOW);digitalWrite(1, LOW);}
void d1six() {clrdspl1();digitalWrite(19, LOW);digitalWrite(18, LOW);digitalWrite(20, LOW);digitalWrite(0, LOW);digitalWrite(1, LOW);digitalWrite(2, LOW);}
void d1seven() {clrdspl1();digitalWrite(18, LOW);digitalWrite(17, LOW);digitalWrite(2, LOW);}
void d1eight() {clrdspl1();digitalWrite(0, LOW);digitalWrite(1, LOW);digitalWrite(2, LOW);digitalWrite(20, LOW);digitalWrite(19, LOW);digitalWrite(18, LOW);digitalWrite(17, LOW);}
void d1nine() {clrdspl1();digitalWrite(1, LOW);digitalWrite(2, LOW);digitalWrite(20, LOW);digitalWrite(19, LOW);digitalWrite(18, LOW);digitalWrite(17, LOW);}

void d2zero() {clrdspl2();digitalWrite(3, LOW);digitalWrite(4, LOW);digitalWrite(5, LOW);digitalWrite(13, LOW);digitalWrite(14, LOW);digitalWrite(15, LOW);}
void d2one() {clrdspl2();digitalWrite(5, LOW);digitalWrite(13, LOW);}
void d2two() {clrdspl2();digitalWrite(14, LOW);digitalWrite(13, LOW);digitalWrite(16, LOW);digitalWrite(3, LOW);digitalWrite(4, LOW);}
void d2three() {clrdspl2();digitalWrite(5, LOW);digitalWrite(13, LOW);digitalWrite(4, LOW);digitalWrite(14, LOW);digitalWrite(16, LOW);}
void d2four() {clrdspl2();digitalWrite(5, LOW);digitalWrite(13, LOW);digitalWrite(16, LOW);digitalWrite(15, LOW);}
void d2five() {clrdspl2();digitalWrite(4, LOW);digitalWrite(14, LOW);digitalWrite(16, LOW);digitalWrite(15, LOW);digitalWrite(5, LOW);}
void d2six() {clrdspl2();digitalWrite(14, LOW);digitalWrite(15, LOW);digitalWrite(16, LOW);digitalWrite(3, LOW);digitalWrite(4, LOW);digitalWrite(5, LOW);}
void d2seven() {clrdspl2();digitalWrite(5, LOW);digitalWrite(13, LOW);digitalWrite(14, LOW);}
void d2eight() {clrdspl2();digitalWrite(3, LOW);digitalWrite(4, LOW);digitalWrite(5, LOW);digitalWrite(13, LOW);digitalWrite(14, LOW);digitalWrite(15, LOW);digitalWrite(16, LOW);}
void d2nine() {clrdspl2();digitalWrite(4, LOW);digitalWrite(5, LOW);digitalWrite(13, LOW);digitalWrite(14, LOW);digitalWrite(15, LOW);digitalWrite(16, LOW);}

void d3zero() {clrdspl3();digitalWrite(6, LOW);digitalWrite(7, LOW);digitalWrite(8, LOW);digitalWrite(9, LOW);digitalWrite(10, LOW);digitalWrite(11, LOW);}
void d3one() {clrdspl3();digitalWrite(8, LOW);digitalWrite(10, LOW);}
void d3two() {clrdspl3();digitalWrite(7, LOW);digitalWrite(9, LOW);digitalWrite(12, LOW);digitalWrite(10, LOW);digitalWrite(6, LOW);}
void d3three() {clrdspl3();digitalWrite(8, LOW);digitalWrite(10, LOW);digitalWrite(7, LOW);digitalWrite(9, LOW);digitalWrite(12, LOW);}
void d3four() {clrdspl3();digitalWrite(8, LOW);digitalWrite(10, LOW);digitalWrite(12, LOW);digitalWrite(11, LOW);}
void d3five() {clrdspl3();digitalWrite(7, LOW);digitalWrite(9, LOW);digitalWrite(12, LOW);digitalWrite(11, LOW);digitalWrite(8, LOW);}
void d3six() {clrdspl3();digitalWrite(6, LOW);digitalWrite(7, LOW);digitalWrite(8, LOW);digitalWrite(9, LOW);digitalWrite(12, LOW);digitalWrite(11, LOW);}
void d3seven() {clrdspl3();digitalWrite(8, LOW);digitalWrite(10, LOW);digitalWrite(9, LOW);}
void d3eight() {clrdspl3();digitalWrite(6, LOW);digitalWrite(7, LOW);digitalWrite(8, LOW);digitalWrite(9, LOW);digitalWrite(10, LOW);digitalWrite(11, LOW);digitalWrite(12, LOW);}
void d3nine() {clrdspl3();digitalWrite(12, LOW);digitalWrite(7, LOW);digitalWrite(8, LOW);digitalWrite(9, LOW);digitalWrite(10, LOW);digitalWrite(11, LOW);}

I will try again to reply, hope it doesn't get posted twice is all. :stuck_out_tongue:

Here is one way to do it. Hope you don't mind the order the digits are placed in a[]. They are NOT ascii but digits.

int temp = 9, i;
byte a[ 4 ];

void setup(void)
{
  Serial.begin(9600);

  int  sensorValue = 567; // analog value max is 1023 so always fits in 4 digits
  temp = sensorValue;

  i = 0; 
  while ( i < 4 )  a [ i++ ] = 0;
  
  i = 0;
  while (temp)
  {
    a[ i++ ] = temp % 10; // puts least significant digit in a[0] and works up
    temp /= 10;
  }

  i = 0;
  while ( i < 4 )
  {
    Serial.print("digit at ");  
    Serial.print( i );
    Serial.print( ":  " );
    Serial.println( a[ i++ ], DEC );
  }
  Serial.println();
  Serial.print("potentiometer: ");  
  Serial.println(sensorValue);
  Serial.println();
}

void loop(void)
{
}

The problem you have there is that you are comparing the character '0' with the number 0. The two are different.

Character '0' is ASCII number 48 as discussed above.

In your case statements, instead of comparing to numbers, you should compare to characters.

Characters are indicated by surrounding it with single quotes: '0' or '5'.

So, one of your switch statements would be, for example:

switch (a1) 
{
  case '0': 
    d3zero();
    break;
  case '1': 
    d3one();
    break;
  case '2': 
    d3two();
    break;
  case '3': 
    d3three();
    break;
.. etc ..
}

switch (a1) {case 0: d3zero();break;case 1: d3one();break;case 2: d3two();break;case 3: d3three();break;case 4: d3four();break;case 5: d3five();break;case 6: d3six();break;case 7: d3seven();break;case 8: d3eight();break;case 9: d3nine();break;}
a1 will contain values from '0' to '9'. You don't have any cases for those values.

THX guys.....now it's working :slight_smile:

void setup()
{
  pinMode(0, OUTPUT);//LED display1 BL
  pinMode(1, OUTPUT);//LED display1 BOT
  pinMode(2, OUTPUT);//LED display1 BR
  pinMode(20, OUTPUT);//LED display1 MID
  pinMode(17, OUTPUT);//LED display1 TR
  pinMode(18, OUTPUT);//LED display1 TOP
  pinMode(19, OUTPUT);//LED display1 TL
  
  pinMode(3, OUTPUT);//LED display2 BL
  pinMode(4, OUTPUT);//LED display2 BOT
  pinMode(5, OUTPUT);//LED display2 BR
  pinMode(13, OUTPUT);//LED display2 TR
  pinMode(14, OUTPUT);//LED display2 TOP
  pinMode(15, OUTPUT);//LED display2 TL
  pinMode(16, OUTPUT);//LED display2 MID
  
  pinMode(6, OUTPUT);//LED display3 BL
  pinMode(7, OUTPUT);//LED display3 BOT
  pinMode(8, OUTPUT);//LED display3 BR
  pinMode(9, OUTPUT);//LED display3 TOP
  pinMode(10, OUTPUT);//LED display3 TR
  pinMode(12, OUTPUT);//LED display3 MID
  pinMode(11, OUTPUT);//LED display3 TL
  clrdspl1();
  clrdspl2();
  clrdspl3();
}

void loop() {
int a = analogRead(A0);
String aa=(String)a;
char a1 = aa.charAt(0);
char a2 = aa.charAt(1);
char a3 = aa.charAt(2);
switch (a3) {case '0': d3zero();break;case '1': d3one();break;case '2': d3two();break;case '3': d3three();break;case '4': d3four();break;case '5': d3five();break;case '6': d3six();break;case '7': d3seven();break;case '8': d3eight();break;case '9': d3nine();break;}
switch (a2) {case '0': d2zero();break;case '1': d2one();break;case '2': d2two();break;case '3': d2three();break;case '4': d2four();break;case '5': d2five();break;case '6': d2six();break;case '7': d2seven();break;case '8': d2eight();break;case '9': d2nine();break;}
switch (a1) {case '0': d1zero();break;case '1': d1one();break;case '2': d1two();break;case '3': d1three();break;case '4': d1four();break;case '5': d1five();break;case '6': d1six();break;case '7': d1seven();break;case '8': d1eight();break;case '9': d1nine();break;}
if (a>999) {d1nine();d2nine();d3nine();}
delay(10);
call();
}

it's working :slight_smile: thank you majenko :slight_smile: thank you guys :slight_smile:

Analog read can be 1023 and you have 3 digits. Should be an easy fix though.

GoForSmoke:
Analog read can be 1023 and you have 3 digits. Should be an easy fix though.

I know but I have no more pins on my teensyduino(something like arduino but smaller).

I don't know what how many pins you have has to do with it. 1 analog pin can read from 0 to 1023 which is 4 digits output and more than 999. Perhaps the least you should do is map() the analog read to fit in 0 - 999.

I don't need this. When number is higher than 999 I display 999. So it's allright.