So senden Sie ein 4-Topf-Werte per i2c vom arduino zu arduino? Wie unterscheiden sich diese Werte, wenn Sie zu erhalten?
Habe ich einen Arduino mit 4 Töpfen. Die anderen Arduino empfängt diese 4 Werte über i2c an und druckt Sie auf einem Display an. Das problem ist, dass ich nicht wissen, wie Sie diese 4 Werte, die der Slave ist abel zu wissen, welcher Wert gehört zu welchem Topf.
Slave-Code:
#include <Wire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup()
{
Wire.begin(5);
Wire.onReceive(receiveEvent);
Serial.begin(9600);
lcd.begin(16,2);
}
void loop()
{
}
void receiveEvent(int)
{
while(Wire.available())
{
//How to create this part? How does the Slave know wich value belongs to which pot?
}
}
Master Code:
#include <Wire.h>
void setup()
{
Serial.begin(9600);
Wire.begin();
delay(2000);
}
void loop()
{
int sensor1 = analogRead(A1);
Wire.beginTransmission(5);
Wire.write(sensor1);
Serial.print(sensor1);
Wire.endTransmission();
delay(100);
int sensor2 = analogRead(A2);
Wire.beginTransmission(5);
Wire.write(sensor2);
Serial.print(sensor2);
Wire.endTransmission();
delay(500);
}
Sind es 4 Töpfe, die auf einem Gerät? 4 Geräte? Tun Sie unterschiedliche Adressen haben?
InformationsquelleAutor user3186918 | 2014-01-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ahh, was wir hier haben, ist eine grundlegende Frage, wie design die I2C-Kommunikation. Leider Beispiele für I2C master und slave enthalten in der Arduino IDE sind IMO zu begrenzt, um klare Orientierung bieten in dieser Angelegenheit.
Zunächst in Ihr Beispiel die master-und Slave-Rollen sind ausgetauscht und sollten gewechselt werden. Slave Lesen sollten Werte von der analog-Eingänge und master sollten Sie beantragen. Warum? Weil es den master, die entscheiden sollen, wenn auf Anfrage Werte und decodiert die Anfrage. Slave sollte die richtige Antwort auf eine bestimmte Anfrage, dass das problem der interpretation der Daten.
I2C-Kommunikation basiert auf requestFunction-(warten)-requestResponse-Sequenz gesteuert durch den master.
Bitte entnehmen Sie die Entfernungsmesser Beispiel auf arduino-Seite. Kurz gesagt:
Erste: master fordert eine Funktion zum Messen der Entfernung:
(manchmal auch Sklaven brauchen einige Zeit, z.B. 10 - 50 ms, Anfragen zu Bearbeiten, aber in dem Beispiel bin ich auf Meister nicht Verzögerung gelesen)
Zweite: master Anfragen Antwort:
Dritte: master versucht zu Lesen und zu analysieren Antwort.
Sollten Sie design zuverlässige I2C-Kommunikation in ähnlicher Weise.
Hier ist, wie ich es tun; Sie Folgen können, meine Muster und get extensible slave Implementierung, die Unterstützung einer Funktion: Lesen der analog-Eingänge, kann aber leicht erweitert werden, indem zusätzliche Funktionscodes und erforderliche Verarbeitung mit der Umsetzung der slave-main-loop
Einleitenden Ausführungen
irgendeine Art von einfaches Protokoll ist notwendig für die Steuerung von slave - z.B. es sollte Unterstützung ersuchenden Funktionen. Unterstützende Funktionen-Anfragen ist nicht unbedingt nötig, in solchen simmple Szenario wie die Lektüre von vier analoge Eingänge, aber das, was ich beschreibe, ist ein allgemeineres Muster, das Sie verwenden können, die in anderen Projekten.
Slave, sollten Sie nicht führen Sie keine weiteren Aktionen (wie Lesen Eingänge) auf Anfrage Antwort wie die I2C-Kommunikation unterbrechen können (aufgrund der Verzögerungen) und du bekommst teilweise Antworten etc. Dies ist eine sehr wichtige Anforderung, welche einen Einfluss auf den slave-design.
Antwort (und auch Wunsch, wenn erforderlich) enthalten kann, die CRC als wenn der master wartet nicht lange genug, kann es ein leeres Antwort. Wenn niemand sonst noch Los ist, verwenden Sie Ihren code Gegenmaßnahmen sind nicht erforderlich und wird hier nicht beschrieben werden. Andere wichtige Sache ist die Wire-Bibliothek Puffer Beschränkung von 32 bytes und Durchführung von CRC-Prüfsumme verändern, ohne die Länge des Puffers Grenzen der verfügbaren Daten-Länge von zwei bytes (wenn die crc16 verwendet wird).
slave:
master:
Ich hoffe, mein Beispiel hilft. Es basiert auf dem code arbeiten seit Wochen machen 40 liest einen zweiten von mehreren slaves, jedoch habe ich nicht kompiliert, um die Funktion zu testen, die Sie benötigen.
Bitte verwenden Sie WSWire Bibliothek als der Draht (zumindest für Arduino 1.0.3) kann gelegentlich einfrieren, Ihre master -, wenn aus irgendeinem Grund der slave reagiert nicht auf Anfrage.
EDIT: Die WSWire lib benötigt externe pull-up-widerstände für I2C, es sei denn, Sie ändern Sie die Quelle und aktivieren die internen pull-ups wie Draht hat.
EDIT: anstatt i2c-slave-Implementierung Sie können versuchen, die EasyTransfer Bibliothek. Ich habe es nicht ausprobiert, aber kann es einfacher sein, es zu benutzen, wenn senden von vier bytes, ist alles was Sie brauchen.
BEARBEITEN[12.2017]: Es ist ein neuer Spieler auf den block - PJON - eine Bibliothek geeignet für einfache multi-master-Kommunikation ideal zum Austausch poti-Werte (und vieles mehr). Es ist schon seit einiger Zeit, aber gewann eine beträchtliche Geschwindigkeit der Entwicklung in den letzten Monaten. Ich bin teilweise an der Entwicklung beteiligt und wechselte alle Feld-Ebene und der lokalen Busse, die ich bisher verwendet habe (I2C, MODBUS RTU) PJON über single-wire -, seriellen hardware-oder RF.
Vielen Dank für diesen Hinweis; byte/uint8_t funktionieren sollte. In so kurzer code, den ich war nicht zahlen zu viel Aufmerksamkeit auf die Speicherauslastung.
InformationsquelleAutor Mr. Girgitt
Check-out GitHub-I2CBus, ich habe haargenau dasselbe getan. Hoffe, es kann helfen,
InformationsquelleAutor Amir