How to send 2 bytes of data in wire .h library from master to slave
by reading the library info?
Hope the pre-written examples could help you.
Moved to here because it has nothing to do with getting the IDE to work.
As to the question look at the example in the IDE in the Files -> Examples menu.
Can you send 1-byte data? If yes, post your sketch.
Wire.beginTransmission(SLAVE_ADDRESS);
Wire.write(variable1);
Wire.write(variable2);
Wire.endTransmission();
in my project the master will send a number between 0-1000 to the slave, I can only send numbers between 0-255
code:
//i2c slave
#include <SoftwareSerial.h>
#include <ModbusMaster.h>
#include<Wire.h>
int veriler[3]={};
int bits[5];
int i;
int deg;
size_t k = 2;
SoftwareSerial mySerial(2, 3); // RX, TX
#define MAX485_DE 4
#define MAX485_RE_NEG 5
int result1,result2;
uint8_t gonderilecek_veri;
int nem1,sicaklik1,nem2,sicaklik2;
ModbusMaster node;
void preTransmission()
{
digitalWrite(MAX485_RE_NEG, 1);
digitalWrite(MAX485_DE, 1);
}
void postTransmission()
{
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
}
void setup()
{//--------------------
Wire.begin();
//---------------------------
pinMode(MAX485_RE_NEG, OUTPUT);
pinMode(MAX485_DE, OUTPUT);
// Init in receive mode
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
Serial.println("start init serial 0");
Serial.begin(9600);
while (!Serial) {
Serial.println("loop for init serial 0");
}
Serial.println("start init software serial");
mySerial.begin(9600);
while (!mySerial) {
Serial.println("loop for init software serial");
}
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
}
void loop()
{
node.begin(2, mySerial);
// Read 1 register starting at 0x0001)
result1 = node.readInputRegisters(0x0001, 1);
if (result1 == node.ku8MBSuccess){
float temperature_buf = node.getResponseBuffer(0);
sicaklik1=temperature_buf / 10.0;
Serial.print("sicaklik1 : ");
Serial.print(sicaklik1);
veriler[0]=sicaklik1;
}
// Read 1 register starting at 0x0002)
result1 = node.readInputRegisters(0x0002, 1);
if (result1 == node.ku8MBSuccess){
float humidity_buf = node.getResponseBuffer(0);
nem1=humidity_buf / 10.0;
Serial.print("\ nem1 : ");
Serial.println(nem1);
veriler[1]=nem1;
}
delay(1000);
node.begin(1, mySerial);
result2 = node.readInputRegisters(0x0001, 1);
if (result2 == node.ku8MBSuccess){
float temperature_buf = node.getResponseBuffer(0);
sicaklik2=temperature_buf / 10.0;
Serial.print("sicaklik2 : ");
Serial.print(sicaklik2);
veriler[2]=sicaklik2;
}
// Read 1 register starting at 0x0002)
result2 = node.readInputRegisters(0x0002, 1);
if (result2 == node.ku8MBSuccess){
float humidity_buf = node.getResponseBuffer(0);
nem2=humidity_buf;
Serial.print("\ nem2 : ");
Serial.println(nem2);
veriler[3]=nem2;
delay(1000);
}
/*
for(int x=0;x<=3;x++)
{delay(500);
Wire.beginTransmission(10);
deg=veriler[x];
Wire.write(deg);
Serial.println(deg);
Wire.endTransmission();
delay(500);
}
*/
//Wire.requestFrom(10,4);
Wire.beginTransmission(10);
Wire.write(900);
Wire.endTransmission();
}
in my project the master will send a number between 0-1000 to the slave, I can only send numbers between 0-255
code:
//i2c slave
#include <SoftwareSerial.h>
#include <ModbusMaster.h>
#include<Wire.h>
int veriler[3]={};
int bits[5];
int i;
int deg;
size_t k = 2;
SoftwareSerial mySerial(2, 3); // RX, TX
#define MAX485_DE 4
#define MAX485_RE_NEG 5
int result1,result2;
uint8_t gonderilecek_veri;
int nem1,sicaklik1,nem2,sicaklik2;
ModbusMaster node;
void preTransmission()
{
digitalWrite(MAX485_RE_NEG, 1);
digitalWrite(MAX485_DE, 1);
}
void postTransmission()
{
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
}
void setup()
{//--------------------
Wire.begin();
//---------------------------
pinMode(MAX485_RE_NEG, OUTPUT);
pinMode(MAX485_DE, OUTPUT);
// Init in receive mode
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
Serial.println("start init serial 0");
Serial.begin(9600);
while (!Serial) {
Serial.println("loop for init serial 0");
}
Serial.println("start init software serial");
mySerial.begin(9600);
while (!mySerial) {
Serial.println("loop for init software serial");
}
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
}
void loop()
{
node.begin(2, mySerial);
// Read 1 register starting at 0x0001)
result1 = node.readInputRegisters(0x0001, 1);
if (result1 == node.ku8MBSuccess){
float temperature_buf = node.getResponseBuffer(0);
sicaklik1=temperature_buf / 10.0;
Serial.print("sicaklik1 : ");
Serial.print(sicaklik1);
veriler[0]=sicaklik1;
}
// Read 1 register starting at 0x0002)
result1 = node.readInputRegisters(0x0002, 1);
if (result1 == node.ku8MBSuccess){
float humidity_buf = node.getResponseBuffer(0);
nem1=humidity_buf / 10.0;
Serial.print("\ nem1 : ");
Serial.println(nem1);
veriler[1]=nem1;
}
delay(1000);
node.begin(1, mySerial);
result2 = node.readInputRegisters(0x0001, 1);
if (result2 == node.ku8MBSuccess){
float temperature_buf = node.getResponseBuffer(0);
sicaklik2=temperature_buf / 10.0;
Serial.print("sicaklik2 : ");
Serial.print(sicaklik2);
veriler[2]=sicaklik2;
}
// Read 1 register starting at 0x0002)
result2 = node.readInputRegisters(0x0002, 1);
if (result2 == node.ku8MBSuccess){
float humidity_buf = node.getResponseBuffer(0);
nem2=humidity_buf;
Serial.print("\ nem2 : ");
Serial.println(nem2);
veriler[3]=nem2;
delay(1000);
}
/*
for(int x=0;x<=3;x++)
{delay(500);
Wire.beginTransmission(10);
deg=veriler[x];
Wire.write(deg);
Serial.println(deg);
Wire.endTransmission();
delay(500);
}
*/
//Wire.requestFrom(10,4);
Wire.beginTransmission(10);
Wire.write(900);
Wire.endTransmission();
}
Show your sketches (with minimum codes) for both Master and Slave; where, Master sends a number <=255 to Slave. Please, use code tags (</>) when posting sketches.
// delay(1000);
i++;
//Wire.requestFrom(10,1);
while(Wire.available())
{gelen_veri=Wire.read();}
File dataFile = SD.open("DATALOG.txt", FILE_WRITE);
Serial.print("gelen veri: ");
Serial.print(gelen_veri);
if (dataFile) {
if(i==1){
Serial.print("SD kayit sicaklik1:");
Serial.println(gelen_veri);
dataFile.print("sicaklik1:");
dataFile.println(gelen_veri);
dataFile.close();
}
else if (i==2){
Serial.print("SD kayit nem1:");
Serial.println(gelen_veri);
dataFile.print("nem1:");
dataFile.println(gelen_veri);
dataFile.close();
}
else if(i==3)
{
Serial.print("SD kayit sicaklik2:");
Serial.println(gelen_veri);
dataFile.print("sicaklik2:");
dataFile.println(gelen_veri);
dataFile.close();
}
else if(i==4)
{
Serial.print("SD kayit nem2:");
Serial.println(gelen_veri);
dataFile.print("nem2:");
dataFile.println(gelen_veri);
dataFile.close();
i=0;
}
}
else {
Serial.println(" DATALOG.txt acilmadi");
}
slave
void veri_geldi(int data ){
// delay(1000);
i++;
//Wire.requestFrom(10,4);
while(Wire.available())
{gelen_veri=Wire.read();}
File dataFile = SD.open("DATALOG.txt", FILE_WRITE);
Serial.print("gelen veri: ");
Serial.print(gelen_veri);
if (dataFile) {
if(i==1){
Serial.print("SD kayit sicaklik1:");
Serial.println(gelen_veri);
dataFile.print("sicaklik1:");
dataFile.println(gelen_veri);
dataFile.close();
}
else if (i==2){
Serial.print("SD kayit nem1:");
Serial.println(gelen_veri);
dataFile.print("nem1:");
dataFile.println(gelen_veri);
dataFile.close();
}
else if(i==3)
{
Serial.print("SD kayit sicaklik2:");
Serial.println(gelen_veri);
dataFile.print("sicaklik2:");
dataFile.println(gelen_veri);
dataFile.close();
}
else if(i==4)
{
Serial.print("SD kayit nem2:");
Serial.println(gelen_veri);
dataFile.print("nem2:");
dataFile.println(gelen_veri);
dataFile.close();
i=0;
}
}
else {
Serial.println(" DATALOG.txt acilmadi");
}
}
master
node.begin(2, mySerial);
// Read 1 register starting at 0x0001)
result1 = node.readInputRegisters(0x0001, 1);
if (result1 == node.ku8MBSuccess){
float temperature_buf = node.getResponseBuffer(0);
sicaklik1=temperature_buf / 10.0;
Serial.print("sicaklik1 : ");
Serial.print(sicaklik1);
veriler[0]=sicaklik1;
}
// Read 1 register starting at 0x0002)
result1 = node.readInputRegisters(0x0002, 1);
if (result1 == node.ku8MBSuccess){
float humidity_buf = node.getResponseBuffer(0);
nem1=humidity_buf / 10.0;
Serial.print("\ nem1 : ");
Serial.println(nem1);
veriler[1]=nem1;
}
delay(1000);
node.begin(1, mySerial);
result2 = node.readInputRegisters(0x0001, 1);
if (result2 == node.ku8MBSuccess){
float temperature_buf = node.getResponseBuffer(0);
sicaklik2=temperature_buf / 10.0;
Serial.print("sicaklik2 : ");
Serial.print(sicaklik2);
veriler[2]=sicaklik2;
}
// Read 1 register starting at 0x0002)
result2 = node.readInputRegisters(0x0002, 1);
if (result2 == node.ku8MBSuccess){
float humidity_buf = node.getResponseBuffer(0);
nem2=humidity_buf;
Serial.print("\ nem2 : ");
Serial.println(nem2);
veriler[3]=nem2;
delay(1000);
}
/*
for(int x=0;x<=3;x++)
{delay(500);
Wire.beginTransmission(10);
deg=veriler[x];
Wire.write(deg);
Serial.println(deg);
Wire.endTransmission();
delay(500);
}
*/
//Wire.requestFrom(10,4);
Wire.beginTransmission(10);
Wire.write(900,2);
Wire.endTransmission();
}
you can easily send a 2-byte 'int' variable using this library: GitHub - nickgammon/I2C_Anything: Arduino library to simplify reading/writing to I2C
Is Arduino UNO your I2C Master device? What is your Slave device -- is it another Arduino? If so, what type it is?
master : uno
slave :uno
This untested modification of I2Canything example for sending one 16 bit integer between 2 Uno's.
master
// Written by Nick Gammon
// May 2012
#include <Wire.h>
#include <I2C_Anything.h>
const byte SLAVE_ADDRESS = 42;
void setup()
{
Wire.begin ();
} // end of setup
void loop()
{
int foo = 42;
Wire.beginTransmission (SLAVE_ADDRESS);
I2C_writeAnything (foo);
Wire.endTransmission ();
delay (1000);
} // end of loop
slave
// Written by Nick Gammon
// May 2012
#include <Wire.h>
#include <I2C_Anything.h>
const byte MY_ADDRESS = 42;
void setup()
{
Wire.begin (MY_ADDRESS);
Serial.begin (115200);
Wire.onReceive (receiveEvent);
} // end of setup
volatile boolean haveData = false;
volatile int foo;
void loop()
{
if (haveData)
{
Serial.print ("Received foo = ");
Serial.println (foo);
haveData = false;
} // end if haveData
} // end of loop
// called by interrupt service routine when incoming data arrives
void receiveEvent (int howMany)
{
if (howMany >= (sizeof foo))
{
I2C_readAnything (foo);
haveData = true;
} // end if have enough data
} // end of receiveEvent
If sending data between different microcontrollers (e.g. UNO and teensy), then you may need to use fixed width integer types: Fixed width integer types (since C++11) - cppreference.com
Don't forget to use pull-up resistors.
1. Be sure that you have connected Master and Slave as per Fig-1 using I2C Bus.
Figuure-1:
2. Note down the following facts:
(1) I2C is a byte (8-bit) oriented protocol/network. It always sends 8-bit packet which means that a Wire.write() instruction always sends 8-bit data under the coverage of I2C Frame Structure.
(2) Wire.beginTransmission(7BitSlaveAddress) is a write-mode instruction which means that data will be transferred from Master to Slave.
(3) In write-mode operation, the Master append 0 at the right-most position of 7-bitSlaveAddress to make it 8-bit (called I2C Bus Address) in order to comply with the requirement of Step-2(1).
(4) Wire.equestFrom(7BitSlaveAddress, n) is read-mode instruction which means that data will be travelling from Slave to Master.
(5) In read-mode operation, the Master append 1 at the right-most position of 7-bitSlaveAddress to make it 8-bit in order to comply with the requirement of Step-2(1).
3. Upload the following sketches (un-compiled and un-tested) in Master and Slave; where, Master will send data byte 0x23 to Slave at 1-sec interval. Slave will receive the data item and will show on SM2.
I2c-Master Sketch:
#include<Wire.h>
#define slaveAddress 0x13
void setup()
{
Serial.begin(9600);
Wire.begin();
}
void loop()
{
Wire.beginTransmission(slaveAddress);
Wire.write(0x23);
byte busStatus = Wire.endTransmission();
if(busStatus != 0)
{
Serial.print("Bus Error: Either Slave is absent or wiring problem!");
while(1); //wait for ever
}
delay(1000); //test interval
}
I2c-Slave Sketch:
#include<Wire.h>
#define slaveAddress 0x13
volatile byte y;
volatile bool flag = false;
void setup()
{
Serial.begin(9600);
Wire.begin(slaveAddress);
Wire.onReceive(receiveEvent); //declaration of ISR() context
}
void loop()
{
if(flag == true)
{
Serial.println(y, HEX);
flag = false;
}
}
void receiveEvent(int howMany) //howMany = number of data bytes received
{
y = Wire.read(); //get the data in y
}
thanks for the help
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.
