shi*_*vam 6 python arduino i2c raspberry-pi
我通过双向电平移位器将Raspberry pi 2模型B与arduino uno连接起来.
Raspberry pi GND ---------- GND Arduino
3.3v ---------- 5v
SCL ---------- A5
SDA ---------- A4
Run Code Online (Sandbox Code Playgroud)
希望我的I2C连接正确吗?
我的Arduino连接到8通道继电器板.
现在我编写了代码,我可以通过Raspberry pi控制Relay板.例如,如果按"1",继电器1变为高电平.
现在我想将数据从arduino发送回raspberry pi,以便交叉检查Relay 1是否为高,如果Relay 1为高,那么它应该将一些数据发送回Raspberry pi,否则不会.
我的Rpi代码是
import smbus
import time
# 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 writeNumber(value):
bus.write_byte(address, value)
# bus.write_byte_data(address, 0, value)
return -1
def readNumber():
number = bus.read_byte(address)
# number = bus.read_byte_data(address, 1)
return number
while True:
var = input("")
if not var:
continue
writeNumber(var)
number = readNumber()
Run Code Online (Sandbox Code Playgroud)
我的Arduino代码:
#include <Wire.h>
#define SLAVE_ADDRESS 0x04
#define RELAY1 9
int number = 0;
int state = 0;
void setup() {
pinMode(RELAY1, OUTPUT);
Serial.begin(9600); // start serial for output
// initialize i2c as slave
Wire.begin(SLAVE_ADDRESS);
// define callbacks for i2c communication
Wire.onReceive(receiveData);
Wire.onRequest(sendData);
Serial.println("Ready!");
}
void loop() {
delay(100);
}
// callback for received data
void receiveData(int byteCount){
while(Wire.available()) {
number = Wire.read();
Serial.print("data received: ");
Serial.println(number);
if (number == 1){
if (state == 0){
digitalWrite(RELAY1, HIGH); // set the LED on
state = 1;
}
else{
digitalWrite(RELAY1, LOW); // set the LED off
state = 0;
}
}
}
}
// callback for sending data
void sendData(){
Wire.write(number);
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我输入1并且由于一些松散的连接,继电器1不会变高,所以在这种情况下我希望arduino从中继板获取数据并每次将其发送到Raspberry pi.
如果有人能够解释它是如何工作的,那将是很棒的.
希望我能够解释这个问题.我做了很多研究,但未能找到答案.
我是python的初学者所以请帮助我.
提前致谢.
小智 0
在arduino代码中像这样更改sendData()函数
void sendData(){
int relay_status;
relay_status=digitalRead(4);
Wire.write(relay_status);
}
Run Code Online (Sandbox Code Playgroud)
同样在硬件中将第 4 个数字引脚(或任何其他空闲 I/O 引脚)连接到继电器输入。
希望能帮助到你:)