ESP - Arduino I2C

Alex_CPL
Offline
Зарегистрирован: 23.06.2020

Всем доброго времени суток! В микроконтроллерах только начал разбираться, прошу сильно не бить, вопрос возможно очень тупой. 
Хочу сделать, чтобы ведомое устройство (Arduino nano в моем случае) передавало некоторую информацию на мастер (ESP8266) в произвольные моменты времени, например по нажатию кнопки (подключенной к ардуино). Сколько гуглил в интернете, находил только примеры, как передать информацию с master на slave, и как передать со slave на master. Однако во втором варианте передача всегда начинается по запросу мастера, а я же хочу сделать, чтобы slave отправляло информацию когда захочется. 

Привожу коды - попытка реализовать то, что хочу.

//КОД ДЛЯ МАСТЕРА - ESP
#include <Arduino.h>
#include <Wire.h>

void receiveEvent(int howMany)
{
  while(Wire.available())
  {
    char c=Wire.read();
    Serial.print(c);
  }
}

void setup() 
{
 Serial.begin(9600); /* открываем серийный порт для дебаггинга */
 Wire.begin(D1, D2); /* задаем i2c мост через контакты SDA=D1 и SCL=D2 на NodeMCU */
 Wire.onReceive(receiveEvent);
}
 
void loop() 
{
  /*Wire.requestFrom(8, 13);
  while(Wire.available())
  {
    char c = Wire.read();
    Serial.print(c);
  }
  Serial.println();*/
  delay(1000);
}


//КОД ДЛЯ ВЕДОМОГО - ARDUINO
#include <Wire.h>
#include <Arduino.h>

void setup() 
{
 Wire.begin(8);              
 Wire.write("Hello ESP!");  /* Отправляем "hello Arduino" */
 Serial.begin(9600);           /* открываем серийный порт для дебаггинга */
}
 
void loop() 
{
 delay(100);
}

 

rkit
Offline
Зарегистрирован: 23.11.2016

так нельзя

Alex_CPL
Offline
Зарегистрирован: 23.06.2020

то есть можно лишь сделать так, чтобы мастер опрашивал ведомые устройства?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

http://easyelectronics.ru/interface-bus-iic-i2c.html

Но вот случилось вообще невероятное — два Ведущих начали вещать одновременно. Прям совсем одновременно. Как быть? А тут нам поможет свойство монтажного И — где против лома нуля нет приема. Короче, оба мастера бит за битом играют в простую игру ножик-камень(1 и 0 соответственно). Кто первый выкинет камень против ножика тот и побеждает арбитраж, продолжая вещать дальше. Так что очевидно, что самый важный адрес должен начинаться с нулей, чтобы тот кто к нему пытался обращаться всегда выигрывал арбитраж. Проигравшая же сторона вынуждена ждать пока шина не освободится.

но думаю готового примера вы не найдете как реализовать два master одновременно

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Если хочется, чтобы слейв отправлял информацию, когда ему захочется, то в рамках протокола I2C это сделать можно - достаточно слейва сделать мастером, а мастера - слейвом.

Alex_CPL
Offline
Зарегистрирован: 23.06.2020

DIYMan пишет:

Если хочется, чтобы слейв отправлял информацию, когда ему захочется, то в рамках протокола I2C это сделать можно - достаточно слейва сделать мастером, а мастера - слейвом.


 

У меня будет вероятно не один слейв

Alex_CPL
Offline
Зарегистрирован: 23.06.2020

Спасибо, ознакомлюсь с информацией 

Alex_CPL
Offline
Зарегистрирован: 23.06.2020

Можно еще вопрос?

Никак не могу найти примеров как сделать передачу данных с сервера (например, через скрипты на сайте) на ESP через интернет (как сделать наоборот, много информации в интернетах), может кто даст ссылки на мануалы/примеры?

rkit
Offline
Зарегистрирован: 23.11.2016

Alex_CPL пишет:

Можно еще вопрос?

Никак не могу найти примеров как сделать передачу данных с сервера (например, через скрипты на сайте) на ESP через интернет (как сделать наоборот, много информации в интернетах), может кто даст ссылки на мануалы/примеры?

Может быть, потому что это очень и очень плохая идея?

Alex_CPL
Offline
Зарегистрирован: 23.06.2020

Почему же плохая? Например, сделать так, чтобы по нажатию кнопки на сайте зажигался светодиод, что здесь не так?