Los LED de alimentación utilizan el transmisor y receptor de RF con Arduino

0

Estoy trabajando en un proyecto en el que tengo dos sensores, dos Arduinos (un YUN y un UNO), dos LED y un transmisor / receptor de RF

Es un procedimiento bastante simple: active un sensor de fuerza, envíelo por RF al receptor e ilumine el LED correspondiente. Así que mi diseño se ve así:

Sensor 1 y Sensor 2 --- > Arduino YUN --- > Transmisor de RF - > Inalámbrico

Receptor de RF --- > Arduino UNO --- > LED 1 y LED 2

Entonces, si el Sensor 1 está activado, el LED 1 se enciende y si el Sensor 2 está activado, el LED 2 se enciende.

Hasta ahora puedo enviar la señal y distinguir entre cada sensor al ver el monitor en serie. Si golpeo el sensor 1, el Uno recibe la señal del sensor 1. Lo mismo ocurre con el sensor 2. Solo estoy atascado en cómo hacer que los LED se activen. Intenté el código Serial.read (), así que cada vez que envío el Sensor 1 o el Sensor 2, se lee el código serial y luego el DigitalWrite el led alto. Pero eso no funcionó. Cualquier consejo sería muy apreciado. Aquí está mi código si desea verlo.

Transmisor:

    // Transmitter Arduino Yun
    #include <VirtualWire.h>
    int pin0 = 0;
    int pin1 = 1;


    void setup()
    {
        vw_set_ptt_inverted(true);  // Required by the RF module
        vw_setup(2000);            // bps connection speed
        Serial.begin (9600);
        vw_set_tx_pin(3);         // Arduino pin to connect the transmitter data pin
    }

    void loop()
    {
       int force = analogRead(pin0); //  analog reading from the Force sense resistor
       int force1 = analogRead(pin1); //  analog reading from the Force1 sense resistor

       const char *msg = "Sensor 1";
       const char *ms = "Sensor 2";


       if (force > 100) {
       vw_send((uint8_t *)msg, strlen(msg));
       digitalWrite(led_pin, HIGH);

       vw_wait_tx();        // We wait to finish sending the message
       delay(200);         // We wait to send the message again                
    }

      if (force1 > 100) {
       vw_send((uint8_t *)ms, strlen(ms));
       digitalWrite(led_pin1, HIGH);


       vw_wait_tx();        // We wait to finish sending the message
       delay(200);         // We wait to send the message again                
    }


    }

Y el Receptor:

    //Reciever

    #include <VirtualWire.h>

    const int led_pin = 3;
    const int led_pin1 = 4;
    char data[20];
    void setup()
    {
        pinMode (3,OUTPUT);
        pinMode (4, OUTPUT);
      Serial.begin(9600);  //Debugging
      vw_set_ptt_inverted(true); //Required
      vw_setup(2000);  //bps
      vw_set_rx_pin(2);
      vw_rx_start();  //Start receiver


    }

    void loop()
    {

      uint8_t buf[VW_MAX_MESSAGE_LEN];
      uint8_t buflen = VW_MAX_MESSAGE_LEN;

      if (vw_get_message(buf, &buflen))  
      {
        int i;


         for (i = 0; i < buflen; i++)
        {
          Serial.write(buf[i]);  // The received data is stored in the buffer
                                // and sent through the serial port to the computer
        }

      }

      if (Serial.available()) {
         char ser = Serial.read();

         if(ser == 'Sensor 1') {
             digitalWrite(led_pin, HIGH);
          }
          else if(ser == 'Sensor 2') {
             digitalWrite(led_pin1, HIGH);
          }
       }
    }

Gracias de nuevo por cualquier información.

    
pregunta user35653

1 respuesta

1

está comparando un solo carácter, que puede ser 'S', que es el primer carácter de la cadena "Sensor 1", con, de nuevo, un literal de cadena que ha declarado como un carácter.

En la programación en C, una comilla simple significa que es un carácter ASCII, como '&' o 's'. Si desea una cadena, use comillas dobles, "Sensor" e incluso las cadenas de un solo carácter funcionan con "S".

Lo que debe hacer es configurar un búfer de caracteres como una "cadena" vacía para los datos recibidos.

char rxbuffer[64]; //64 byte long char buffer!
memset (rxbuffer,0,64); //this clears the bytes to 0. otherwise could be garbage data

64 es arbitrario, pero significa que puede contener una cadena de 63 caracteres y un terminador nulo al final.

entonces deberías usar la función arduino Serial.readBytesUntil (). enlace

Esto se vería así:

//you need to include this at the top!! 
#include <string.h>

if(Serial.available()){
    Serial.readBytesUntil('
char rxbuffer[64]; //64 byte long char buffer!
memset (rxbuffer,0,64); //this clears the bytes to 0. otherwise could be garbage data
', rxbuffer, 64); //use the C++ standard function call strstr to search buffer for matchin //input string //was it sensor 1 command? if( strstr(rxbuffer, "Sensor 1") ){ digitalWrite(LED1, HIGH); }else{ //maybe it was sensor 2? if( strstr(rxbuffer, "Sensor 2") ){ digitalWrite(LED2, HIGH); } } //end if it wasnt first sensor message }//end serial available, processing message after read

Así que ahí tienes, eso debería funcionar. cambiar los números / nombres de los pines del LED aunque

    
respondido por el KyranF

Lea otras preguntas en las etiquetas