Anfänger braucht hilfe char array zu int zu konvertieren

#include <VirtualWire.h> 
#undef int
#define CHAR_ESC "\x1B" // necessary to make sending ESC codes easier
boolean started = false;
void setup()
{
  Serial.begin(57600);    
  //tellymate code
//  showcursor(false);
  //
 
  vw_setup(2000);                   
  vw_set_rx_pin(23);           
  vw_rx_start();  

  pinMode(6, OUTPUT);                   
}

void loop()
{
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
  if (vw_get_message(buf, &buflen)) // check to see if anything has been received


  Serial.print("The distance to the Lamp is: ");

  Serial.write(buf[4]);
  Serial.write(buf[5]);
  Serial.println() ; 
  delay(2000);

  {
char buffer[3];
buffer[0] = buf[4];
buffer[1] = buf[5];
buffer[2] = '\0';

int  n;
n = atoi(buffer);

if (n<= 50);
digitalWrite(6, HIGH); //LED an
if (n>= 50);
digitalWrite(6, LOW); LED aus
  }
 

}

Das Problem ist das die angeschlossene LED immer nur blinkt und nicht an bleibt bis der angegebene Abstand über oder unterschritten wird.
Hat einer eine Ahnung was ich falsch gemacht habe stimmt mit der umwandlung vom char array zum int vielleicht was nicht?
(Ich bin ein Ziemlicher Anfänger im programmieren.)

Der Teil

 {
char buffer[3];
buffer[0] = buf[4];
buffer[1] = buf[5];
buffer[2] = '\0';

int  n;
n = atoi(buffer);

if (n<= 50);
digitalWrite(6, HIGH); //LED an
if (n>= 50);
digitalWrite(6, LOW); LED aus
  }

ist nicht bedingt sondern wird bei jedem Durchlauf ausgeführt.

Ich vermute mal da? buf in der Funktion vw_get_message(buf, &buflen) auch verändert wird wenn die als Bedingung übegebene Anzahl der Werte erreicht ist.

Lösungsversuche:

  • Druck den Inhalt von buf[4] und buf[5] mal auf der seriellen Schnittstelle aus.
  • Versetze die geschwungene Klammer von Zeile 33 auf Zeile 24 sodaß die Ansteuerung der LEd ind er Bedingung erfolgt.
    Grüße Uwe

Ich habe das bei mir so gelöst und es funktioniert.
An der “char to int” liegt es nicht!
Vermutlich die Zusammensätzung des Strings macht den Fehler.

// in der Deklaration
char StringReceived[15];
uint8_t i;


void loop(void) {
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;

  if (vw_get_message(buf, &buflen)) {             // überprüfen ob eine Nachricht eingegangen ist
    for (i = 0; i < buflen; i++) {
      StringReceived[i] = char(buf[i]);
    }
    SetLed();
  }
  memset(StringReceived, 0, sizeof(StringReceived));
}

void SetLed() {
  int  n;
  n = atoi(StringReceived);

  if (n <= 50)
  digitalWrite(6, HIGH);  //  LED an
  if (n >= 50)
  digitalWrite(6, LOW);   //  LED aus
}

Edit: Codefehler berichtigt

Vielen dank für eure schnelle hilfe aber mit der klammer versetzten bringt nichts.
Und wenn ich den code wie im Beispiel verändere passiert garnichts.
Werd morgen mal weiter probieren

Trotzdem danke erst mal für die schnellen Antworten

if (n<= 50);

Das Semikolon beendet das if und macht das ganze also zu Unsinn-Code !

Wenn die Bedingung in der if Abfrage true ist, wird die nächste Anweisung ausgeführt.
“Die nächste Anweisung” kann eine einzelne sein , die -wie hier- gar nichts macht,

  • oder
  if (vw_get_message(buf, &buflen)) // check to see if anything has been received
  Serial.print("The distance to the Lamp is: ");  // wird bei true ausgeführt
  Serial.write(buf[4]); // wird immer ausgeführt !
  • oder kann ein Block von Anweisungen{ ... }sein, wie du es vermutlich eigentlich meinst.

Wenn du die zwei Zeilen korrigierst und die { Klammer -wie Uwe vorschlägt- gleich hinter das

  if (vw_get_message(buf, &buflen))  { // check to see if anything has been received

vorziehst, sollte sich schon was verändern.
Poste am besten deinen veränderten Code nochmal, wenn du weitere Fragen hast.

flippomatik:
Vielen dank für eure schnelle hilfe aber mit der klammer versetzten bringt nichts.
Und wenn ich den code wie im Beispiel verändere passiert garnichts.

Ich habe versehentlich deinen Code ohne weitere Prüfung kopiert und das Semikolon am Ende der “if-Anweisung” belassen. michael_x hat jetzt deutlich darauf hingewiesen.

Wenn du den Codeschnipsel nochmal testest, wird es funktionieren. Ich habe es eben nochmal bei mir getestet und es funktioniert.

#include <VirtualWire.h>

const int DataIn = 23; 
const int LedPin = 6;

char StringReceived[15];
uint8_t i;

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

  vw_setup(2000);
  vw_set_rx_pin(DataIn);
  vw_rx_start();

  pinMode(LedPin, OUTPUT);
}

void loop(void) {
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;

  if (vw_get_message(buf, &buflen)) {             // überprüfen ob eine Nachricht eingegangen ist
    for (i = 0; i < buflen; i++) {
      StringReceived[i] = char(buf[i]);
    }
    SetLed();
  }
  memset(StringReceived, 0, sizeof(StringReceived));
}

void SetLed() {
  int n = atoi(StringReceived);
  Serial.println(StringReceived);
  Serial.println(n);

  if (n <= 50)
    digitalWrite(LedPin, HIGH);  //  LED an
  if (n >= 50)
    digitalWrite(LedPin, LOW);   //  LED aus
}

So jetzt funktioniert es hier ist der code:

#include <VirtualWire.h> 
#undef int
#define CHAR_ESC "\x1B" // necessary to make sending ESC codes easier
boolean started = false;
void setup()
{
  Serial.begin(57600);    
 
  vw_setup(2000);                   
  vw_set_rx_pin(23);           
  vw_rx_start();  

  pinMode(6, OUTPUT);                   
}

void loop()
{
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
  if (vw_get_message(buf, &buflen)) // check to see if anything has been received
{

  Serial.print("The distance to the Lamp is: ");

  Serial.write(buf[4]);
  Serial.write(buf[5]);
  Serial.println() ; 
  delay(2000);

  
char buffer[3];
buffer[0] = buf[4];
buffer[1] = buf[5];
buffer[2] = '\0';

int  n;
n = atoi(buffer);

if (n<= 50)
digitalWrite(6, HIGH);
if (n>= 50)
digitalWrite(6, LOW);
//delay(5000);
  }
 

}

Nochmals vielen dank für eure hilfe ich wüßte nicht was ich ohne dieses Forum machen würde.

ich wüßte nicht was ich ohne dieses Forum machen würde.

Ich weiss aber, was du ohne dieses Forum nicht machen würdest:

Deinen Sketch mit STRG-T sauber formatieren, Unsinn (und möglichst auch Überflüssiges) rausschmeissen vor dem Posten

#include <VirtualWire.h>

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

  vw_setup(2000);
  vw_set_rx_pin(23);
  vw_rx_start();

  pinMode(6, OUTPUT);
}

void loop()
{
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
  if (vw_get_message(buf, &buflen)) // check to see if anything has been received
  {
    Serial.print("The distance to the Lamp is: ");

    Serial.write(buf[4]);
    Serial.write(buf[5]);
    Serial.println() ;
    delay(2000);

    char buffer[3];
    buffer[0] = buf[4];
    buffer[1] = buf[5];
    buffer[2] = '\0';

    int  n;
    n = atoi(buffer);

    if (n <= 50)
      digitalWrite(6, HIGH);
    if (n >= 50)
      digitalWrite(6, LOW);
    //delay(5000);
  }
}

:wink:

Hallo ich bin es noch mal vielleicht könnt Ihr mir ja noch mal helfen bei dem Code für den Sender habe den von jemand anders übernommen gehabt und weiß nicht was ich da eventuelle kürzen könnte.
Bestimmt wisst ihr da besser Bescheid ich bin nur ein blutiger Anfänger :slight_smile:

#include <VirtualWire.h>
#include <NewPing.h>
#undef int
#undef abs
#undef double
#undef float
#undef round
#define TRIGGER_PIN  22
#define ECHO_PIN     23
#define MAX_DISTANCE 80
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
String speedval;
String distval;
int speedvaltemp;
String message;
char sentvalues[27];
double sensorValue;
int sensorValueint;
int sensorValuedist;
int tempholder;
void setup()
{
  Serial.begin(9600);

  vw_setup(2000);
  vw_set_tx_pin(3);
}

void loop()
{
  delay(50);
  //setting up values to send
  long cm;
  unsigned int uS = sonar.ping();
  sensorValue = analogRead(A0);

  // just to get a resonable 2 digit number from the sensor, not a real world solution for a
  //higher number of digits unless I reverse the calculation at the other end and lose accuracy
  sensorValue = sensorValue / 11;
  //

  cm = uS / US_ROUNDTRIP_CM;
  sensorValueint = (int) round(sensorValue);
  sensorValuedist = (int) round(cm);
  if (sensorValueint < 10) {
    speedval = "0";
    speedval += sensorValueint;
  }
  else {
    speedval += sensorValueint;
  }

  if (sensorValuedist < 10) {
    distval = "0";
    distval += sensorValuedist;
    if (sensorValuedist > 0) {
      tempholder = sensorValuedist;
    }

  }
  else {
    distval += sensorValuedist;
    if (sensorValuedist > 0) {
      tempholder = sensorValuedist;
    }
  }

  if (sensorValuedist == 0) {
    sensorValuedist = tempholder;
    distval = "";
    distval += sensorValuedist;
  }

  // stop setting up values

  // construct message
  message = "S" + speedval + "D" + distval;
  //send to array
  message.toCharArray(sentvalues, 27);

  // reset strings to empty
  speedval = "";
  distval = "";

  //Check message going out
  Serial.print(message);

  // send message
  vw_send((uint8_t *)sentvalues, strlen(sentvalues));
  vw_wait_tx();
  delay(20);
}

Ich kann nicht erkennen, warum der Sketch gekürzt werden soll.

Evtl. kannst du nochmal beschreiben, was genau der Sketch machen soll.

Zu erkennen ist, er misst per US-Sensor einen Abstand und sendet diesen.
Aber evtl. kannst du es genauer beschreiben.

Hi habe den Code aus diesem Video Arduino Project: Cheap Wireless 433Mhz Transmitter and Receivers - YouTube
Der Code war eigentlich dafür gedacht an einem Auto den Abstand zum einparken zu messen und dann so weit ich das verstanden habe das Tempo anzupassenn deswegen sind dort noch speedval und tempholder enthalten ich dachte man könnte dieses noch irgendwie heraus kürzen da ich das ja nicht brauche.

Kommt drauf an, ob du an Pin3 was angeschlossen hast, und falls ja, was da ankommen soll...

Wenn darüber weiter diskutiert werden soll, wäre ein neuer Thread mit passenderem Titel als
"char array zu int konvertieren" angebracht.