Envoi d'un message radio

Bonjour à tous,

Voilà après des heures à apprendre la prog sur un arduino, j’avoue, je suis coincé…

Pour faire simple, l’idée est de faire communiquer deux arduino via un récepteur et un émetteur.

Le premier arduino sera connecter sur le contact sec d’un inverseur dans un TGBT. Tant que le contact sera ouvert, celui ci enverra le message “ON”. Lorsque l’inverseur s’actionnera, il enverra le message “OFF” (car le contact sera ouvert). Comme celà, j’aurais l’information comme quoi je suis hors réseau et que je suis basculé sur groupe électrogène.

Le second arduino devra recevoir le message. Si le message est “ON”, tout va bien, aucune action. Si le message est “OFF”, il action un relais (NO) qui donne l’info à un optimiseur de tension. En gros, je souhaite lors d’un passage sur groupe électrogène, faire du délestage !

Voilà le tableau

J’ai donc monté mes arduino mega (2560) sur une platine essai, avec un émetteur et récepteur Aurel, et installé la bibliothèque virtualWire.

J’ai lancé les prog test et la communication est niquel. J’ai un arduino qui envoi le message “HELLO” avec une incrémentation toutes les 2 sec.

J’ai donc fais une modif du programme. Si la pin 2 voit du 5V, elle envoi “ON” si plus de tension, elle envoi “OFF”. Mais voilà où ça pose problème, mon arduino envoi une alternance de “OFF” “ON” “OFF” “ON” etc.

Voilà le programme en question:

#include <VirtualWire.h>

const int led_pin = 11;
const int transmit_pin = 22;
const int transmit_en_pin = 3;
const int inverter_pin = 2;



void setup()
{
    // Initialise the IO and ISR
    vw_set_tx_pin(transmit_pin);
    vw_set_ptt_pin(transmit_en_pin);
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(2000);       // Bits per sec
    pinMode(led_pin, OUTPUT);
    pinMode(2, INPUT);
    
}



void loop()
{
  digitalWrite(2, HIGH);
  digitalRead(2);

if (2, HIGH);
  {
  char msg[7] = {'O','N',};


  digitalWrite(led_pin, HIGH); // Flash a light to show transmitting
  vw_send((uint8_t *)msg, 7);
  vw_wait_tx(); // Wait until the whole message is gone
  digitalWrite(led_pin, LOW);
  delay(5000);

  }


if (2, LOW); 

 { char msg[8] = {'O','F','F',};


  digitalWrite(led_pin, HIGH); // Flash a light to show transmitting
  vw_send((uint8_t *)msg, 8);
  vw_wait_tx(); // Wait until the whole message is gone
  digitalWrite(led_pin, LOW);
  delay(5000);
 
  } 
}

Merci d’avance pour votre aide! :slight_smile: (ps: c’est pas hyper propre, car j’ai modifié mon prog plusieurs fois pour essayé des choses… y aura donc des incohérences :wink: )

Bonjour,

Ce n'est pas

  if (2, HIGH);

mais

  if (digitalRead(2)==HIGH)

que tu veux faire je suppose.

Bonjour,

Merci pour ta réponses ! Effectivement ce que je veux, c'est qu'il lise la tension sur la pin 2.
J'ai modifié comme mais toujours le même problème... :frowning:

Tu as bien fait attention? il n'y a pas de point virgule après le if

Ha !!! Non autant pour moi, j’avais laissé le ;…

ça marche !!! Super un grand merci à toi ! Maintenant j’ai bien un message ON avec le 5v ! Et si je met le cable en l’air, j’ai bien un OFF ! Top !

L’autre partie, c’est l’interprétation du message, je le vois dans le moniteur, mais dans le programme, je sais pas trop comment l’interpréter…

Voilà le code:

#include <VirtualWire.h>

const int led_pin = 11;
const int transmit_pin = 12;
const int receive_pin = 22;
const int transmit_en_pin = 3;
const int relay_pin = 52;

int relayState = 0;

void setup()
{
    delay(1000);
    Serial.begin(9600);	// Debugging only
    Serial.println("setup");

    // Initialise the IO and ISR
    vw_set_tx_pin(transmit_pin);
    vw_set_rx_pin(receive_pin);
    vw_set_ptt_pin(transmit_en_pin);
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(2000);	 // Bits per sec

    vw_rx_start();       // Start the receiver PLL running

    pinMode(led_pin, OUTPUT);
    pinMode(relay_pin, HIGH);
    
}

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

    if (vw_get_message(buf, &buflen)) // Non-blocking
    {
	int i;

        digitalWrite(led_pin, HIGH); // Flash a light to show received good message
	// Message with a good checksum received, dump it.
	Serial.print("Got: ");
	
	for (i = 0; i < buflen; i++)
	{
	    Serial.print(buf[i], HEX);
	    Serial.print(' ');
	}
	Serial.println();
        digitalWrite(led_pin, LOW);
    }
    
}

En gros, lorsqu’un message OFF arrive, il faut mettre le pin 52 à l’état HIGH

Pour commencer tu peux optimiser l'émission pour ne transmettre que le nombre de caractères indispensables

...
   char msg[] = "ON";
   digitalWrite(led_pin, HIGH); // Flash a light to show transmitting
   vw_send((uint8_t *)msg, sizeof msg);
...

idem pour OFF

ensuite en réception il suffit de comparer les chaines reçues avec strcmp par exemple

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

  if (vw_get_message(buf, &buflen)) // Non-blocking
  {
    digitalWrite(led_pin, HIGH); // Flash a light to show received good message
    // Message with a good checksum received, dump it.
    Serial.print("Got: ");
    Serial.println((char *)buf);
    if (strcmp((char *)buf,"ON")==0)
    {
      // faire le traitement ON
    }
    if (strcmp((char *)buf,"OFF")==0)
    {
      // faire le traitement OFF
    }
    digitalWrite(led_pin, LOW);
  }
}

C'est parfait !!! Un grand merci à toi, le projet fonctionne ! Je vais faire un peu de ménage dans les codes et câbler ça proprement et c'est good !!! :slight_smile: