Probleme mit I2C Verbindung
Hallo Freunde , vieleicht bin ich wieder mal ein bischen blind, oder wieder das oft zetierte Brett vorm K... ;) Ich habe Versucht eine Master-Slave-I2C Verbindung zwischen 2 Arduino(Uno) herzustellen. Am Master wird seriel die Tastatureingabe abgefragt und soll zum Slave übertragen per I2C übertragen werde. Dort soll der empfangene Byte Wert( Buchstaben A...Z Ziffern 0...9) auf einem LCD als Kontrolle angezeigt werden..
Wird aber nix angezeigt vom gesendetem Wert.... :o :confused:
Hier mal der Source:
Code:
/* ========================================================================== */
/* */
/* I2C_Master_Tx.c */
/* (c) 2013 Gerhard Hinze */
/* */
/* Description */
/* */
/* ========================================================================== */
/*
The circuit:
* SDA pin to analog pin 4
* SCL pin to analog pin 5
*/
#include <Wire.h>
#define I2C_Slave_Adress 127
void setup()
{
Serial.begin(9600);
Wire.begin(); //als Master am Bus anmelden
}
void loop()
{
if (Serial.available())
{
Wire.beginTransmission(I2C_Slave_Adress);
byte tx = Serial.read(); // Eingabe lesen
Wire.send(tx); // Eingabe über I2C senden
Wire.endTransmission();
Serial.write(tx); // Eingabe als Echo return zum Terminal
delay(100);
}
}
/* ========================================================================== */
/* */
/* I2C_Slave_LCD.c */
/* (c) 2013 Gerhard Hinze */
/* */
/* Description */
/* */
/* ========================================================================== */
/*
* SDA pin to analog pin 4
* SCL pin to analog pin 5
*/
#include <LiquidCrystal.h>
#include <Wire.h>
#define I2C_Slave_Adress 127
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);
void setup()
{
lcd.clear();
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("I2C-Verbindung");
Wire.begin(I2C_Slave_Adress); //als Slave am Bus anmelden
}
void loop()
{
if (Wire.available())
{
byte x = Wire.receive();
lcd.setCursor(0, 1);
lcd.print("Empfange : ");
lcd.setCursor(11,1);
lcd.print (char(x));
delay(100);
}}
Ich danke schon mal dem Edlen Helfer , der mich ein wenig auf die Sprünge, besser zu einer Zeichenanzeige am LCD bringt. :)
Liste der Anhänge anzeigen (Anzahl: 1)
Also ganz kurz, mein Fehler lag darin, das ich den "onReceive-Handler" nicht aufgerufen hatte:
Code:
Wire.onReceive(receiveEvent);
Die Testverbindung zw. 2 Arduino über ca 30cm verbunden geht definitiv auch ohne ext. PullUpsR's, wie folgendes beweist der Empfang einer Zählschleife 0..255:
Anhang 26549
Da ich aber längere Verbindungen , um die 5..7m benötige wird dasdann in der Praxis nicht so gehen, aber um mal empfangende Daten enzuzeigen reicht mir das schon um I2C-Sendemodule zu kontrollieren.
Vielen Dank
Gerhard
Hier nun der funktionierende Code für meine Tests:
Code:
//Listing Master & Slave(ID=4)
// Wire Master Writer
// by Nicholas Zambetti <http://www.zambetti.com>
// Demonstrates use of the Wire library
// Writes data to an I2C/TWI slave device
// Refer to the "Wire Slave Receiver" example for use with this
// Created 29 March 2006
// This example code is in the public domain.
#include <Wire.h>
void setup()
{
Wire.begin(); // join i2c bus (address optional for master)
}
byte x = 0;
void loop()
{
Wire.beginTransmission(4); // transmit to device #4
Wire.write("x is "); // sends five bytes
Wire.write(x); // sends one byte
Wire.endTransmission(); // stop transmitting
x++;
delay(500);
}
/******************************************************************************/
//Listing Slave mit LCD
#include <LiquidCrystal.h>
#include <Wire.h>
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);
void setup()
{
lcd.clear();
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("I2C-Verbindung");
Wire.begin(4); // join i2c bus with address #4
Wire.onReceive(receiveEvent); // register event
}
void loop()
{
delay(100);
}
void receiveEvent(int howMany)
{
while(1 < Wire.available()) // loop through all but the last
{
char c = Wire.read(); // receive byte as a character
Serial.print(c); // print the character
}
int x = Wire.read(); // receive byte as an integer
Serial.println(x); // print the integer
lcd.setCursor(0, 1);
lcd.print("Empfange : ");
lcd.setCursor(11,1);
lcd.print (char(x));
}
/******************************************************************************/