Połączyłem Raspberry pi 2 model B z arduino uno za pomocą dwukierunkowego przesuwnika poziomu.Jak odczytać dane z Arduino z Raspberry pi przez I2C
Raspberry pi GND ---------- GND Arduino
3.3v ---------- 5v
SCL ---------- A5
SDA ---------- A4
Mam nadzieję, że moje połączenie I2C jest poprawne?
i mój Arduino jest podłączony do 8-kanałowej płyty przekaźnikowej.
Teraz mam napisany kod, w którym mogę kontrolować płytę przekaźnikową przez Raspberry Pi. Dla przykładu, jeśli i Wciśnij "1", przekaźnik 1 idzie wysoko.
Teraz chcę wysłać dane z arduino do raspberry pi, aby sprawdzić, czy przekaźnik 1 jest wysoki, czy nie, jeśli przekaźnik 1 jest wysoki, powinien wysłać dane z powrotem do Raspberry Pi, lub nie.
Mój kod Rpi jest
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()
Mój kod 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);
}
Teraz gdybym typu 1 i ze względu na pewne luźne Relay połączenie 1 nie przechodzi w stan wysoki, a więc w tym przypadku chcą, aby Arduino pobierał dane z tablicy przekaźników i wysyłał je do Raspberry pi za każdym razem.
Będzie świetnie, jeśli ktoś może wyjaśnić również, jak to działa.
Mam nadzieję, że udało mi się wyjaśnić problem. Zrobiłem wiele badań, ale nie byłem w stanie znaleźć odpowiedzi.
Jestem początkujący w python, więc proszę mi pomóc.
Z góry dziękuję.
Czy masz dostęp do elektrycznego sprzętu pomiarowego? W takim przypadku idealnym rozwiązaniem byłby analizator logiczny, aby określić, po której stronie ogrodzenia występuje problem. Czy możesz podać numer części swojego dwukierunkowego przesuwnika poziomu? –