Продолжаем разбор технологии обмена данными по коммуникации I2C
В предыдущей статье рассматривался пример сбора данных одним контроллером Arduino NANO c двух других таких же контроллеров по шине I2C и отправка их по этой же шине в жидкокристаллический индикатор. Теперь хотелось бы разобраться с двухсторонним почти равнозначным обменом между контроллерами по I2C. Я возьму на этот раз два контроллера Nano. Один будет выступать в роли мастера, другой - слейва. Мастер периодически сначала будет отправлять значение одной переменной integer подчиненному Arduino Nano, после чего делать запрос на значение такой же переменной от него. А слейв при поступлении данных от мастера будет их считывать, а при поступлении запроса будет отправлять один integer.
Видео по предыдущей статье.
Программа мастера выглядит следующим образом
#include <Wire.h>
#define SLAVE_ADDRESS 0x01
byte high[2];
int com = 223;
int i;
int nano3;
void setup()
{
Wire.begin();
Serial.begin(9600);
}
void loop()
{
high[0] = (com >> 8);
high[1] = (com & 0xff);
Wire.beginTransmission(0x01);
Wire.write(high[0]);
Wire.write(high[1]);
Wire.endTransmission();
Serial.println("Requesting Data");
Wire.requestFrom(SLAVE_ADDRESS, 2);
i=0;nano3=0;
while (Wire.available()) {
byte c = Wire.read();
if (i==0) nano3 = ((c & 0xff) << 8); else nano3 = nano3 | c;
i++;
}
Serial.print("nano3 ");
Serial.println(nano3);
delay(2000);
}
Преобразование данных выполнено по мотивам предыдущей статьи.
Адрес слейва будет иметь значение 01.
Отправлять будем целое число 223.
Программа контроллера - слейва. Arduino i2c несколько устройств
#include <Wire.h>
#define SLAVE_ADDRESS 0x01
int temp=22;
byte high[2];
int nano3;
void setup()
{
Wire.begin(SLAVE_ADDRESS);
Wire.onReceive(receiveEvent);
Wire.onRequest(requestEvent);
Serial.begin(9600);
}
void loop()
{
delay(100);
}
void requestEvent()
{
Serial.println("Request from Master. Sending: ");
high[0] = (temp >> 8);
high[1] = (temp & 0xff);
Wire.write(high[0]);
Wire.write(high[1]);
}
void receiveEvent(int bytes)
{
int i=0;
nano3=0;
while (Wire.available()) {
byte c = Wire.read();
if (i==0) nano3 = ((c & 0xff) << 8); else nano3 = nano3 | c;
i++;
}
Serial.print("nano3 ");
Serial.println(nano3);
}
Слейв Arduino Nano принимает данные от главного контроллера. В нашем случае принимает цифру 223 и выводит её в монитор порта. А при запросе данных от мастера этот Нано отправляет целое число 22. Все запросы от главного обрабатываются при помощи отдельных функций.
При правильном подключении мастер в монитор порта будет выводить полученные цифры 22, а слейв 223.
Выводы
Оказалось, что в интернете по этой тематике опубликованы или откровенно не работающие примеры программ или работающие только с байтами. Пришлось сделать по своему и в результате получилось прекрасное решение.
Мне в следующем проекте будет необходимо подключить 10 Arduino Nano к главному контроллеру. При чем 8 из них должны будут обмениваться с главным двухсторонними данными. Для этого идеально подойдет коммуникация I2C. Так что я в цикле контроллера-мастера буду последовательно, возможно в цикле FOR опрашивать слейвов и посылать им управляющие данные. Будет весело!
Таймеры Arduino UNO — Часть 5. Измерение длительности импульсов и частоты (Input Capture)
Таймеры Arduino UNO — Часть 5. Измерение длительности импульсов и частоты (Input Capture) Т..
Коннектор круглый на 40 пинов 2,54мм мама
Коннектор для пайки на печатную плату с круглыми отверстиями под радиодетали (микросхемы, транзистор..
16.08грн.
Что такое Arduino и каковы его основные преимущества и компоненты?
Что такое Arduino и каковы его основные преимущества и компоненты? Arduino — это популярная..
Умный дом 1. Постановка задачи.
Умный дом 1. Постановка задачи. Каждый человек представляет себе свой умный дом в соответствии со с..
Терминальный разъем питания папа 5,5 x 2,5мм
Разъем питания, который используется для перехода от стандартного разъема 5,5 x 2,5мм питания к..
31.56грн.





