Ich habe Raspberry Pi 2 Modell B mit Arduino Uno über Bidirektionale Level Shifter verbunden.Wie man Daten von Arduino mit Raspberry Pi über I2C liest
Raspberry pi GND ---------- GND Arduino
3.3v ---------- 5v
SCL ---------- A5
SDA ---------- A4
Hoffe, dass meine I2C-Verbindung korrekt ist?
und mein Arduino ist mit 8-Kanal-Relaiskarte verbunden.
Jetzt habe ich Code geschrieben, in dem ich die Relaisplatine von Raspberry Pi steuern kann. Wenn zB '1' gedrückt wird, wird das Relais 1 hochgeschaltet.
Jetzt möchte ich Daten zurück von arduino zu raspberry Pi senden, um zu überprüfen, ob Relais 1 hoch ist oder nicht, wenn Relais 1 hoch ist, sollte es einige Daten zurück zu Raspberry Pi oder auch nicht senden.
Mein Rpi Code ist
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()
My Arduino Code:
#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);
}
Nun, wenn ich 1 geben und aufgrund einiger lose Verbindung Relais 1 nicht geht nicht hoch, also in diesem Fall I möchte, dass das arduino Daten von der Relaiskarte nimmt und es jedes Mal an Raspberry Pi sendet.
Es wird großartig sein, wenn jemand auch erklären kann, wie es funktioniert.
Ich hoffe, ich konnte das Problem erklären. Ich habe viel geforscht, konnte aber keine Antwort finden.
Ich bin ein Anfänger in Python, also bitte helfen Sie mir.
Vielen Dank im Voraus.
Haben Sie Zugang zu einer elektrischen Messausrüstung? Ein Logikanalysator wäre in diesem Fall ideal, um zu bestimmen, auf welcher Seite des Zauns das Problem existiert. Kannst du auch die Teilenummer deines bidirektionalen Level Shifters angeben? –