VirtualWire versturen van een waarde

Arduino specifieke Software
Berichten: 2
Geregistreerd: 13 Mrt 2016, 12:11

VirtualWire versturen van een waarde

Berichtdoor guusdikker » 13 Mrt 2016, 12:18

Beste,

Ik ben al een tijdje bezig om uit te zoeken hoe je een waarde kan versturen van de transmitter naar de reciever. Het lukt al wel om "Hallo" te versturen en te ontvangen zodanig dat ik het kan lezen.

Dit is de hardware die ik gebruik: RF 434 Mhz Link Kit (http://www.hackerstore.nl/Artikel/99)
Ik gebruik hiervoor de vrijwel standaard sketch van Mohannad Rawashdeh (http://www.genotronex.com/)

Ik denk dat ik iets moet aanpassen aan deze regel van de transmitter:

const char *msg = "hallo guus gaat ie goed 13-3-2016";

Ik wil dat msg niet alleen een tekst bevat maar ook de waarde van de lichtmeting.

Ik heb al iets bij de reciever aangepast om de teksts leesbaar te maken:

Serial.print(buf[i], char()); // ik heb char() toegevoegd (in plaats van HEX, dat leest wat moeilijker).

Ik heb echter geen idee hoe ik dat moet doen. Ik denk dat er een array gemaakt van moet worden maar hoe weet ik niet. Ik ben slechts een knip en plak programeur.

Wie kan me hier mee helpen?

Hieronder de volledige sketches

Transmitter: (Arduino Duemilanova)
cpp code
//simple Tx on pin D12
//Written By : Mohannad Rawashdeh
// 3:00pm , 13/6/2013
//http://www.genotronex.com/
//..................................


#include <VirtualWire.h>

int licht = 0; // analog pin used to connect the lichtsensor
int l;

void setup() {

Serial.begin(9600); // Debugging only
Serial.println("setup");
vw_set_ptt_inverted(true); //
vw_set_tx_pin(12);
vw_setup(2000);// speed of data transfer Kbps
}

void loop(){

l = map(l, 0, 1023, 0, 255);
const char *msg = "hallo guus gaat ie goed 13-3-2016";
digitalWrite(13, true); // Flash a light to show transmitting
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx(); // Wait until the whole message is gone
digitalWrite(13, false);
Serial.println(l);
delay(500);
}

Reciever: (Arduino Yun)
cpp code
//simple Tx on pin D12
//Written By : Mohannad Rawashdeh
// 3:00pm , 13/6/2013
//http://www.genotronex.com/
//..................................
#include <VirtualWire.h>

void setup()
{
Serial.begin(9600); // Debugging only
Serial.println("setup");
vw_set_ptt_inverted(true); // Required for DR3100
vw_set_rx_pin(12);
vw_setup(2000); // Bits per sec
vw_rx_start(); // Start the receiver PLL running
}
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(13, true); // 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], char());
Serial.print("");
}
Serial.println("");
digitalWrite(13, false);
}
}

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: VirtualWire versturen van een waarde

Berichtdoor nicoverduin » 13 Mrt 2016, 16:31

Ik zou de functie sprintf() nader onderzoeken en als je floating points wil gebruiken dan ook nog eens dtostrf().
Voorbeeld van zo'n message string zou kunnen zijn:
cpp code
char msg[100];
sprintf(msg, "Dit is de boodschap die je wilt versturen met hier de waarde : %d\n", 123);

De %d wordt hier vervangen door 123.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 2
Geregistreerd: 13 Mrt 2016, 12:11

Re: VirtualWire versturen van een waarde

Berichtdoor guusdikker » 13 Mrt 2016, 22:30

Ha Nico,

Bedankt voor je antwoord. ik ben hiermee aan de slag gegaan maar helemaal lukken doet het nog niet:

De sprintf functie werkt, maar de waarde veranderd niet, met het veranderen van de lichtintensiteit.

als ik onderstaande skets laat draaien dan krijg ik in de monitor:

637.00
637
Dit is de boodschap: 316

De bovenste twee waardes veranderen, de onderste niet. Hoe kan ik "316"de juiste waarde laten zijn en dat deze mee veranderd?


int lichtpin = 0;
char temp[25];
float licht;

void setup() {

Serial.begin(9600);
}

void loop(){

licht=(analogRead(lichtpin));
dtostrf(licht,3, 0, temp);
char msg[100];
sprintf(msg, "Dit is de boodschap : %d\n", temp);

Serial.println(licht);
Serial.println(temp);
Serial.println(msg);

delay(500);
}

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: VirtualWire versturen van een waarde

Berichtdoor nicoverduin » 14 Mrt 2016, 09:02

temp is een char. Dan moet je die %d veranderen in %s. Ik zou echt ff die documentatie doorlezen over sprintf (zie printf = print formatted)
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: ixhogucuwikep en 92 gasten