Dataoverdracht tussen 2 aduino's uno

Arduino specifieke Software
Berichten: 4
Geregistreerd: 13 Dec 2015, 23:23

Dataoverdracht tussen 2 aduino's uno

Berichtdoor jvb » 15 Feb 2016, 15:31

Met volgende code kan ik een byte versturen van de ene, naar de andere Arduino ( met I2C-bus )

Code: Alles selecteren
#include <Wire.h>

void setup() {
  Wire.begin();
}

byte x = 112; // bijvoorbeeld getal 112

void loop() {
  Wire.beginTransmission(8);
  Wire.write("x = ");       
  Wire.write(x);         
  Wire.endTransmission();


Maar ik wil meer data versturen. Als je bv een temperatuur meting hebt, en je wil die waarde ( bv 26,4 graden ) versturen naar een tweede Arduino, dan kan dat niet met één byte.
Met welke code kan ik meerdere "grotere getallen" versturen naar een tweede Arduino ? Waar kan je een voorbeeld vinden ? Wie kan bovenstaande code aanpassen ? Dank bij voorbaat.

Advertisement

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

Re: Dataoverdracht tussen 2 aduino's uno

Berichtdoor nicoverduin » 15 Feb 2016, 16:02

Je schrijft nu al meer dan 1 byte weg over I2C. Namelijk "x = "+ hexadecimaal 0x90. dus 5 bytes.
Je kan een struct maken met daar aan parallel een soort template als een byte array
bijvoorbeeld:
cpp code
union {
struct {
float x; //is 4 bytes lang
int y; // is 2 bytes lang
uint32_t z; // is 4 bytes lang
}; // totale lengte is 10 bytes
byte msg[10]; // deze array ligt als het ware over de struct heen
} message;


en dan bij het verzenden

cpp code
Wire.beginTransmission(8);
for (uint16_t i = 0; i < sizeof(message.msg); i++){
//
// verstuur alle bytes
//
Wire.write(message.msg[i]);
}
Wire.endTransmission();
Docent HBO Software Engineering, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 4
Geregistreerd: 13 Dec 2015, 23:23

Re: Dataoverdracht tussen 2 aduino's uno

Berichtdoor jvb » 18 Feb 2016, 21:36

Met welke code moet je de data opvangen aan de ontvanger zijde ?

Berichten: 2441
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Dataoverdracht tussen 2 aduino's uno

Berichtdoor shooter » 18 Feb 2016, 22:12

kijk eens naar easytransfer, daar wordt dat goed uitgelegd met die structures.
paul deelen
shooter@home.nl

Berichten: 118
Geregistreerd: 10 Jan 2016, 16:39

Re: Dataoverdracht tussen 2 aduino's uno

Berichtdoor Nightmystic » 06 Apr 2016, 13:53

easy transfer is super handig met 2 arduino's

maar van van arduino naar ESP8266 werkt het niet.

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

Re: Dataoverdracht tussen 2 aduino's uno

Berichtdoor nicoverduin » 06 Apr 2016, 14:23

Zou kunnen. Geen idee of de auteur hem daarvoor al heeft aangepast. Of zit je nog te testen met die ESP's 01. Hebben die de I2C pinnen dan al naar buiten gevoerd?
Docent HBO Software Engineering, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 118
Geregistreerd: 10 Jan 2016, 16:39

Re: Dataoverdracht tussen 2 aduino's uno

Berichtdoor Nightmystic » 06 Apr 2016, 23:18

Ik ben met de ESP01's bezig.

Pete Scargill heeft er wat over geschreven, maar ik krijg dat niet voor mekaar. Zie http://tech.scargill.net/easytransfer-for-esp8266/
Dit compiled al niet:
uart0_tx_buffer(buf,size+4);

Zelfs met de uart.h library erin compiled hij nog niet. Reactie van Pete zelf was dat hij met de SDK werkt, niet met de Arduino IDE.

Zou iemand een voorbeeld kunnen maken hoe ik deze sketches wel werkend kan krijgen? Dan maak ik er een tutorial van en dan heeft iedereen die Arduino <-> ESP communicatie wil er wat aan.

cpp code
#include <EasyTransfer.h>
#include <DHT.h>
#include <Wire.h>

#define DHTPIN2 2
#define DHTTYPE2 DHT22 // DHT 22 (AM2302), AM2321

DHT dht2(DHTPIN2, DHTTYPE2);

//create object
EasyTransfer ET, ETbutton;

struct SEND_DATA_STRUCTURE
{
//put your variable definitions here for the data you want to send
//THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
float h2;
float t2;
boolean fanstatus;
};
struct RECEIVE_DATA_STRUCTURE
{
//put your variable definitions here for the data you want to receive
//THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
boolean buttonOnOff;
};

float h2;
float t2;
float hic;
int Potwaarde1;
boolean fanstatus = 0;
boolean buttonOnOff;

//give a name to the group of data
SEND_DATA_STRUCTURE mydata;
RECEIVE_DATA_STRUCTURE buttondata;

#define Pot1 A0

#define FAN 8

void setup()
{
pinMode(FAN, OUTPUT);
digitalWrite(FAN, LOW);
Serial1.begin(115200);
ET.begin(details(mydata), &Serial1); // start library // choose serial port
Wire.begin();
dht2.begin();
delay(2000);
}

void loop()
{

Potwaarde1 = analogRead(Pot1);
Potwaarde1 = map(Potwaarde1,0,1023,0,255);


h2 = dht2.readHumidity();
t2 = dht2.readTemperature();
hic = dht2.computeHeatIndex(t2, h2, false);

mydata.h2 = h2;
mydata.t2 = t2;
mydata.fanstatus = fanstatus;

delay(100);

ETbutton.receiveData();
ET.sendData();

if (Potwaarde1 > 10)
{
digitalWrite(FAN, HIGH);
fanstatus = 1;
}
if(buttondata.buttonOnOff == 1)
{
digitalWrite(FAN, HIGH);
fanstatus = 1;
}
if (Potwaarde1 < 10 && buttondata.buttonOnOff == 0)
{
digitalWrite(FAN, LOW);
fanstatus = 0;
}
}


Sketch voor de ESP01

cpp code
#include <EasyTransfer.h>
#include <DHT.h>
#define BLYNK_PRINT Serial // Comment this out to disable prints and save space
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
//#include <Wire.h>

#define DHTPIN2 2
#define DHTTYPE2 DHT22 // DHT 22 (AM2302), AM2321

// Temperatuur Sensoren aanzetten
DHT dht2(DHTPIN2, DHTTYPE2);

SimpleTimer timer;

//create object
EasyTransfer ET, ETbutton;

struct RECEIVE_DATA_STRUCTURE
{
//put your variable definitions here for the data you want to receive
//THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
float h2;
float t2;
boolean fanstatus;
};

struct SEND_DATA_STRUCTURE
{
//put your variable definitions here for the data you want to send
//THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
boolean buttonOnOff;
};

//give a name to the group of data
SEND_DATA_STRUCTURE mydata;
RECEIVE_DATA_STRUCTURE buttondata;

int y;
boolean buttonOnOff;

BLYNK_WRITE(V4)
{
y = param.asInt();
if ( y == 1)
{
buttondata.buttonOnOff = 1;
}
else
{
buttondata.buttonOnOff = 0;
}
}

WidgetLCD lcd(3); // LCD Widget (BLYNK) Virtuele PIN 3

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = ""; //insert here your token generated by Blynk

ET.begin(details(mydata), &Serial);
ETbutton.begin(details(buttondata), &Serial);

lcd.clear();
}


void loop()
{
Blynk.run(); // Initiates Blynk
timer.run(); // Initiates SimpleTimer

if (mydata.fanstatus == 1)
{
led8.on();
} else
{
led8.off();
}

lcd.print(0, 0, "TEMP HUMI FAN");

lcd.print(0,1, mydata.t2);
lcd.print(5,1, " ");
lcd.print(7,1, mydata.h2);
lcd.print(12,1, " ");
lcd.print(14,1, mydata.fanstatus);

Blynk.virtualWrite(1, mydata.t2);
Blynk.virtualWrite(2, mydata.h2);
Blynk.virtualWrite(3, mydata.fanstatus);
delay(100);
ET.receiveData();
lcd.print(13,1, "NOW");
ETbutton.sendData();
}

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

Re: Dataoverdracht tussen 2 aduino's uno

Berichtdoor nicoverduin » 07 Apr 2016, 07:11

Jou hoef ik inmiddels niet meer uit te leggen dat als iets niet compilet, het wel nodig is dat je aangeeft wat de foutboodschap is.
Docent HBO Software Engineering, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 118
Geregistreerd: 10 Jan 2016, 16:39

Re: Dataoverdracht tussen 2 aduino's uno

Berichtdoor Nightmystic » 07 Apr 2016, 10:44

cpp code
#include <EasyTransfer.h>
#include <DHT.h>
#define BLYNK_PRINT Serial // Comment this out to disable prints and save space
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
//#include <Wire.h>

#define DHTPIN2 2
#define DHTTYPE2 DHT22 // DHT 22 (AM2302), AM2321

// Temperatuur Sensoren aanzetten
DHT dht2(DHTPIN2, DHTTYPE2);

SimpleTimer timer;

//create object
EasyTransfer ET, ETbutton;

struct RECEIVE_DATA_STRUCTURE
{
//put your variable definitions here for the data you want to receive
//THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
float h2;
float t2;
boolean fanstatus;
} __attribute__((packed));

struct SEND_DATA_STRUCTURE
{
//put your variable definitions here for the data you want to send
//THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
boolean buttonOnOff;
} __attribute__((packed));

//give a name to the group of data
SEND_DATA_STRUCTURE mydata;
RECEIVE_DATA_STRUCTURE buttondata;

//Sends out struct in binary, with header, length info and checksum
void ICACHE_FLASH_ATTR EasyTransfer_sendData( uint8_t *bfr, uint8_t size){
static uint8_t buf[40];
uint8_t CS;
CS = size;
buf[0]=0x06;
buf[1]=0x85;
buf[2]=CS;
for(int i = 0; i<size; i++){
CS^=*(bfr+i);
buf[i+3]=*(bfr+i);
}
buf[size+3]=CS;
uart0_tx_buffer(buf,size+4);
}

int y;
boolean buttonOnOff;

BLYNK_WRITE(V4)
{
y = param.asInt();
if ( y == 1)
{
buttondata.buttonOnOff = 1;
}
else
{
buttondata.buttonOnOff = 0;
}
}

WidgetLCD lcd(3); // LCD Widget (BLYNK) Virtuele PIN 3

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = ""; //insert here your token generated by Blynk

ET.begin(details(mydata), &Serial);
ETbutton.begin(details(buttondata), &Serial);

lcd.clear();
}


void loop()
{
Blynk.run(); // Initiates Blynk
timer.run(); // Initiates SimpleTimer

if (mydata.fanstatus == 1)
{
led8.on();
} else
{
led8.off();
}

lcd.print(0, 0, "TEMP HUMI FAN");

lcd.print(0,1, mydata.t2);
lcd.print(5,1, " ");
lcd.print(7,1, mydata.h2);
lcd.print(12,1, " ");
lcd.print(14,1, mydata.fanstatus);

Blynk.virtualWrite(1, mydata.t2);
Blynk.virtualWrite(2, mydata.h2);
Blynk.virtualWrite(3, mydata.fanstatus);
delay(100);
ET.receiveData();
lcd.print(13,1, "NOW");
ETbutton.sendData();
}

//Sends out struct in binary, with header, length info and checksum
void ICACHE_FLASH_ATTR EasyTransfer_sendData( uint8_t *bfr, uint8_t size){
static uint8_t buf[40];
uint8_t CS;
CS = size;
buf[0]=0x06;
buf[1]=0x85;
buf[2]=CS;
for(int i = 0; i<size; i++){
CS^=*(bfr+i);
buf[i+3]=*(bfr+i);
}
buf[size+3]=CS;
uart0_tx_buffer(buf,size+4);
}


Foutmeldingen:
DHT22toBlynk2AJAXReceiving2.ino: In function 'void EasyTransfer_sendData(uint8_t*, uint8_t)':
DHT22toBlynk2AJAXReceiving2:56: error: 'uart0_tx_buffer' was not declared in this scope
DHT22toBlynk2AJAXReceiving2.ino: In function 'void BlynkWidgetWrite4(BlynkReq&, const BlynkParam&)':
DHT22toBlynk2AJAXReceiving2:70: error: 'struct RECEIVE_DATA_STRUCTURE' has no member named 'buttonOnOff'
DHT22toBlynk2AJAXReceiving2:74: error: 'struct RECEIVE_DATA_STRUCTURE' has no member named 'buttonOnOff'
DHT22toBlynk2AJAXReceiving2.ino: In function 'void loop()':
DHT22toBlynk2AJAXReceiving2:136: error: 'struct SEND_DATA_STRUCTURE' has no member named 't2'
DHT22toBlynk2AJAXReceiving2:138: error: 'struct SEND_DATA_STRUCTURE' has no member named 'h2'
DHT22toBlynk2AJAXReceiving2:140: error: 'struct SEND_DATA_STRUCTURE' has no member named 'fanstatus'
DHT22toBlynk2AJAXReceiving2:142: error: 'struct SEND_DATA_STRUCTURE' has no member named 't2'
DHT22toBlynk2AJAXReceiving2:143: error: 'struct SEND_DATA_STRUCTURE' has no member named 'h2'
DHT22toBlynk2AJAXReceiving2:144: error: 'struct SEND_DATA_STRUCTURE' has no member named 'fanstatus'
'uart0_tx_buffer' was not declared in this scope

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

Re: Dataoverdracht tussen 2 aduino's uno

Berichtdoor nicoverduin » 07 Apr 2016, 10:59

En als je nu eens goed leest wat daar staat.
Doe eens gek:
De eerste boodschap is deze:
cpp code
DHT22toBlynk2AJAXReceiving2.ino: In function 'void EasyTransfer_sendData(uint8_t*, uint8_t)':
DHT22toBlynk2AJAXReceiving2:56: error: 'uart0_tx_buffer' was not declared in this scope

In de functie EasyTransfer_sendData() refereert hij naar uart0_tx_buffer. Waar zie jij dat die gedeclareerd wordt?
Docent HBO Software Engineering, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 1 gast