Inmatningsproblem

Hej matar in tex värdet "80" via serial monitorn till variabeln x. läser jag sedan av x är inte värdet 80 utan decimalvärdet utav detta.
Hur går jag runt det? Har hittat följande lösning för 0-9.
int x = Serial.read() - '0';

slatten

Hej!

Den seriella monitorn skickar tecken i ASCII format. Skickar du talet 100 kommer det som 3 separata tecken.

Testa att använda Serial.parseInt()
int iTal = Serial.parseInt();

parseInt bryter vid det första icke numeriska tecknet.

Finns flera alternativ. Du kan läsa tecken för tecken och lagra det i en char array och sedan konvertera strängen till ett heltal.
Man kan använda atoi() funktionen för att konvertera en sträng till integer.

Alternativ 3 är att du skickar talet som 1 byte. DVS om du endast använder tal som är mindre än 255 kan du skicka det som ett tecken.

Men det enklaste är nog att du testar Serial.parseInt().

Mvh

Olof

Tack Olof, har just läst på lite med just det du nämner. Men är alldeles för oerfaren att fatta allt.
Gjorde just en code som verkar fungera, den kompilerar fint och verkar göra det den ska. Blir test live
i morgon med stegmotorn inkopplad. Det ska lite kosmetika in i coden men synpunkter och tipps tas
tacksamt emot.

#include "math.h"               // include the Math Library
#include <AFMotor.h>

// Connect a stepper motor with 48 steps per revolution (7.5 degree)to motor port #2 (M3 and M4)
AF_Stepper motor(48, 2);
float a;
int c;
int d ;
void setup() {
  Serial.begin(9600);           // set up Serial library at 9600 bps
    motor.setSpeed(100);  // 100 Varv/min 
   Serial.println("Steg?");
   while (Serial.available() == 0);
   
    a = Serial.parseFloat();        // new command in 1.0 forward
    Serial.print("a = "); 
    Serial.println(a, DEC);

    }

void loop() 
{
    while (Serial.available() == 0);
     int val = Serial.read() - '0';// minskar decimalvärdet
      if (val == 1) 
    {                                   
   Serial.println(a); 
        motor.step(a, FORWARD, SINGLE); 
        d = d + 1;
        c = a * d;
        
  } 
    else if (val == 0)
  { 
    Serial.print( c  );  
      Serial.println( " steg backwards"  );
       motor.step(c, BACKWARD, SINGLE);              
  } 
else
  {
    Serial.println("Fel input");
  }
    Serial.flush();
}

Hoppas att det fungerar bra imorgon!

parseFloat verkar fungera likadant som parseInt bara det att du får ett flyttal istället för heltal.

/Olof

ahhh är det skillnaden jag undrade just hur jag skulle få bort alla nollor, tack för det tippset

Slatten

Olaf coden fungerar utmärkt, dock ett litet problem som du eller någon annan kanske lösa.
följande händer.
1: jag anger steg som stegmotorn ska utföra tex 100st
2: jag matar in en 1 och stegmotorn går 100 steg, jag gör det ett par gånger tex 5 ggr och har då förflyttat mig 500steg framåt
3: Matar in 0 och stegmotorn rör sig antal steg bakåt som jag sparat i "int = c" i det här fallet 500steg så långt allt väl. men kör jag om cyckeln har jag redan från start 500steg i "c"
Jag måste hitta ett set att nolla c innan jag startar om?

Hej!

Du kan väl tömma variabeln när 0 matas in?
Skulle det fungera?

Eller så lägga du till en extra "else if". Skickar du in 2 töms variabeln.

else if (val == 2)
{
c=0;
}

Men att tömma variabeln vid "0" verkar bättre.

Hej olof.

Jo skrev precis som du sa under "0" men fick fel i kompileringen men det var säkert mitt fel.
Försöker i morn igen. tack för hjälpen så länge.

Ny dag och testkört, både code och hårdvara fungerade som tänkt. Mitt projekt ska vara till fotostacking.
Har tagit lite bilder på en blomma under dagen, lite mycket manuellt jobb bara. Flytta 10steg (0.5mm)
ta kort flytta osv. Så funderade på att driva hela processen från Arduinon.

1: Ställa in skärpa ljus osv.
2: Ta kortet
3: Känna av om blixten löst ut
4: Om blixt ok flytta xxx steg osv.
Btw. Tack olaf för hjälpen så här långt

Kul att det fungerade.

Låter som ett intressant projekt, kul när man kan ha nytta av sina Arduino projekt.