Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save gileri/5a9285d6a1cfde142260 to your computer and use it in GitHub Desktop.
Save gileri/5a9285d6a1cfde142260 to your computer and use it in GitHub Desktop.
Sending float from arduino to raspberry pi using Wire (arduino) and smbus (python) libraries
http://bradsrpi.blogspot.fr/2013/03/sending-data-from-arduino-to-raspberry.html
#include <Wire.h>
#define SLAVE_ADDRESS 0x04
#define FLOATS_SENT 2
float temperature = 10.5;
float luminosity = 5.2;
float data[FLOATS_SENT];
void setup() {
pinMode(13, OUTPUT);
Serial.begin(9600);
data[0] = temperature;
data[1] = luminosity;
// initialize i2c as slave
Wire.begin(SLAVE_ADDRESS);
// define callbacks for i2c communication
Wire.onRequest(sendData);
}
void loop() {
delay(100);
}
void sendData(){
Wire.write((byte*) &temperature, FLOATS_SENT*sizeof(float));
}
import time
import struct
import smbus
# for RPI version 1, use "bus = smbus.SMBus(0)"
bus = smbus.SMBus(1)
# This is the address we setup in the Arduino Program
address = 0x04
def get_data():
return bus.read_i2c_block_data(address, 0, 8)
def get_float(data, index):
bytes = data[4*index:(index+1)*4]
return struct.unpack('f', "".join(map(chr, bytes)))[0]
while True:
try:
data = get_data()
print(get_float(data, 0))
print(get_float(data, 1))
except Exception as e:
print(e)
continue
finally:
time.sleep(1)
@cozmobotics
Copy link

cozmobotics commented Nov 27, 2023

I am also late to the party ;-) hopefully there is still somebody around.

Basically, it does exactly what I want. The modification
read_i2c_block_data(address, 0, 8);
is essential (and python would not complain about the semicolon???).
Otherwise, without the third parameter, the Arduino runs wild and keeps sending 255 and would not stop.

But I have a problem:
The parameter "cmd", which is 0 in this case, is not understood by the Arduino.
When reading from the raspi, the Arduino confuses this 0 with other incoming data.
So this solution works one-way only.

@cozmobotics
Copy link

I found another solution here:
https://stackoverflow.com/questions/14420372/how-to-read-data-from-arduino-with-raspberry-pi-with-i2c?rq=2

i2c_msg can be used to request the amount of data needed.

@gileri
Copy link
Author

gileri commented Nov 27, 2023

Wow, thanks for the interest in the script !

I cleaned up the script and implemented the read size based on @wicusverhoef's suggestion. However I can't test it right now, I count on you lads :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment