Comment envoyer 4 Pot de valeurs via i2c depuis l'arduino arduino? Comment différencier ces valeurs tout en recevant d'eux?
J'ai un Arduino avec 4 Pots. L'autre Arduino reçoit ces 4 valeurs via i2c et les imprime sur un Écran. Le problème est que je ne sais pas comment faire pour envoyer ces 4 valeurs que l'Esclave est abel savoir dont la valeur appartient à laquelle Pot.
Esclave 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?
}
}
Code Maître:
#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);
}
Sont il y a 4 pots sur un appareil? 4 appareils? - Ils ont des adresses différentes?
OriginalL'auteur user3186918 | 2014-01-12
Vous devez vous connecter pour publier un commentaire.
Ahh ce que nous avons ici est une question de base sur la façon de concevoir communication I2C. Malheureusement, les Exemples I2C maître et de l'esclave inclus dans l'IDE Arduino sont OMI trop limité pour fournir des orientations claires sur cette question.
Tout d'abord dans votre exemple, le maître et les esclaves, les rôles sont échangés et doit être changé. L'esclave doit lire des valeurs des entrées analogiques et maître doit en faire la demande. Pourquoi? Parce que c'est le maître qui doit décider du moment de la demande de valeurs et de décoder correctement la demande. L'esclave doit fournir une réponse à une demande d'éliminer le problème de l'interprétation des données.
Communication I2C est basé sur requestFunction-(attendre)-requestResponse séquence contrôlée par le maître.
Veuillez vous référer à la télémètre exemple sur arduino page. En un mot:
D'abord: le maître demande une fonction de mesure de distance:
(parfois esclaves besoin d'un certain temps, par exemple de 10 à 50 ms pour traiter les demandes, mais dans l'exemple que j'référant à un maître ne tardez pas lire)
Deuxième: maître des requêtes de réponse:
Troisième: maître essaie de lire et d'analyser la réponse.
Vous devriez conception fiable de communication I2C une manière similaire.
Voici comment je le fais; vous pouvez suivre mon modèle et obtenir extensible esclave de la mise en œuvre, support d'une fonction: lecture des entrées analogiques, mais peut facilement être étendue en ajoutant des codes de fonction et de traitement requis de mise en œuvre de l'esclave boucle principale
Remarques initiales
une sorte de protocole simple est nécessaire pour contrôler les esclaves d'exemple, il devrait soutenir demandant fonctions. Fonctions d'appui des demandes n'est pas absolument nécessaire dans de tels simmple scénario que la lecture de quatre entrées analogiques, mais ce que je suis en décrivant de façon plus générale le modèle que vous pouvez utiliser dans d'autres projets.
Esclave ne doit pas effectuer des actions supplémentaires (comme la lecture des entrées) sur demande de réponse en tant que communication I2C peut casser (en raison de retards) et vous obtiendrez des réponses partielles, etc. Ceci est très important exigence qui affectent l'esclave de la conception.
réponse (et demande également si nécessaire) peut contenir des CRC comme si le maître attend pas assez longtemps, il peut obtenir de réponse vide. Si personne d'autre ne va utiliser votre code de telles contre-mesures ne sont pas nécessaires et ne sera pas décrite ici. Autre aspect important, c'est le Fil de tampon de bibliothèque limitation, qui est de 32 octets et la mise en œuvre de somme de contrôle CRC sans modifier la longueur de la mémoire tampon des limites des données disponibles de la longueur de deux octets (si crc16 est utilisé).
esclave:
maître:
J'espère que mon exemple. Il est basé sur le code de travail pour les semaines qui en fait 40 lit un deuxième à partir de plusieurs esclaves, cependant je n'ai pas compilé pour tester la fonction dont vous avez besoin.
Veuillez utiliser WSWire bibliothèque comme le Fil (au moins pour Arduino 1.0.3) peut parfois geler votre maître si pour une raison quelconque esclave ne permettra pas de répondre à la demande.
EDIT: La WSWire lib externe requise résistances de pull-up pour l'I2C, sauf si vous modifiez la source et permettre interne pull-ups comme Fil n'.
EDIT: au lieu de créer i2c esclave de la mise en œuvre, vous pouvez essayer l' EasyTransfer de la bibliothèque. Je n'ai pas essayé, mais il peut être plus facile à utiliser si l'envoi de quatre octets est tout ce dont vous avez besoin.
MODIFIER[12.2017]: Il y a un nouveau joueur sur le bloc - PJON - une bibliothèque adaptée pour des configurations multi-master de communication idéal pour l'échange de pot de valeurs (et beaucoup plus). Il a été autour depuis un certain temps, mais a gagné un important développement de la vitesse au cours des derniers mois. Je suis partiellement impliqués dans son développement et de commutation de tous les niveaux de champ et les bus que j'ai utilisé jusqu'à présent (I2C, MODBUS RTU) pour PJON plus seul fil, matériel de série ou RF.
Merci de souligner ce point; byte/u_int8_t devrait fonctionner. En si peu de code que j'ai est de ne pas payer trop d'attention à l'utilisation de la mémoire.
OriginalL'auteur Mr. Girgitt
Découvrez GitHub-I2CBus, j'ai fait exactement la même chose. J'espère que ça peut aider
OriginalL'auteur Amir