Доброго времени суток , уважаемы помогите пожалуйста.Задача принимать данные на плату мастер nodemcu с нескольких плат slave тоже nodemcu . Не могу не как найти пример рабочего скетча для передачи данный по I2c между двумя еспешками. С ардуинки на esp без проблем получается принимать данные? а вот с esp на esp ни в какую.
Вы код “примера” для передающей ЕСП заливаете от ардуины?
И вообще, не моего ума дело, конечно, но что за блажь, коммуницировать еспшки по iic?
Схема где? Резисторы 4к7 есть?
И от ардуины пробовал и пример из библиотеки wire.
Можно ли как то подкорректировать этот скетч что бы есп сделать слэйвом?
/* Мастер nodemcu */
#include <Wire.h>
void setup() {
Serial.begin(9600); /* открываем серийный порт для дебаггинга */
Wire.begin(D1, D2); /* задаем i2c мост через контакты SDA=D1 и SCL=D2 на NodeMCU */
}
void loop() {
Wire.beginTransmission(8); /* Начинаем передачу на адресе 8 */
Wire.write("Hello Arduino"); /* Отправляем "hello Arduino" */
Wire.endTransmission(); /* прекращаем передачу */
Wire.requestFrom(8, 13); /* запрашиваем и считываем 13 байт с адреса 8 slave устройства */
while(Wire.available()){
char c = Wire.read();
Serial.print(c);
}
Serial.println();
delay(1000);
}
//Слэйв ардуино
#include <Wire.h>
void setup() {
Wire.begin(8); /* задаем на шине i2c 8 адрес */
Wire.onReceive(receiveEvent); /* регистрируем полученное событие */
Wire.onRequest(requestEvent); /* регистрируем запрошенное событие */
Serial.begin(9600); /* открываем серийный порт для дебаггинга */
}
void loop() {
delay(100);
}
// Функция для извлечения любых принимаемых данных от мастера на шину
void receiveEvent(int howMany) {
while (0 <Wire.available()) {
char c = Wire.read(); /* получаем байт как символ*/
Serial.print(c); /* выводим символ в серийный порт */
}
Serial.println(); /* переходим на новую строку */
}
// Функция для извлечения любых отправляемых данных от мастера на шину
void requestEvent() {
Wire.write("Hello NodeMCU"); /* отправляем по запросу строку "Hello NodeMCU" */
}
По WI FI энерго затратно будет. А ардуинок не осталось только есп есть.
очень много обсуждаемая в сообществе тема. Вот тут утверждают. что помогло снижение скорости до 20.
ЗЫ: чтобы мне самому не собирать стенд, отпишись, на какой скорости заработало устойчиво. ОК? Будет полезно сообществу.
Разорись на нормальный контроллер и не порти себе кровь этим мазохизмом.
Спасибо помогло у меня самая стабильная получилось 38,5 кГц . 30 байт за запрос максимум что получилось передать. С повышением или понижением частоты байты теряются, но думаю это частота индивидуальна будет, от длины, емкости, сопротивления провода зависеть подбирать надо. Сейчас попробовал по HDMI проводу на 15 метров передается без проблем, но на частоте 45 кГц на коротких на такой частоте иногда байты теряются.
Вдруг кому пригодиться.
Частоту в библиотеке wire можно поменять с помощью команды: Wire.setClock(45000); где` 45000 это частота в Гц. И простой рабочий пример
#include <Wire.h>
#define SDA_PIN 4
#define SCL_PIN 5
const int16_t I2C_MASTER = 0x42;
const int16_t I2C_SLAVE = 0x08;
void setup() {
Serial.begin(115200); // start serial for output
Wire.begin(SDA_PIN, SCL_PIN, I2C_MASTER);
Wire.setClock(38500); // уменьшаем частоту до 38,5 кГц
}
void loop() {
delay(1000);
Wire.requestFrom(I2C_SLAVE, 30);
while (Wire.available()) {
char c = Wire.read();
Serial.print(c);
}
}
#include <Wire.h>
#define SDA_PIN 4
#define SCL_PIN 5
const int16_t I2C_MASTER = 0x42;
const int16_t I2C_SLAVE = 0x08;
void setup() {
Wire.begin(SDA_PIN, SCL_PIN, I2C_SLAVE); // join i2c bus with address #8
Wire.onRequest(requestEvent); // register event
}
void loop() {}
// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void requestEvent() {
Wire.write("helloasasasasasasasasasasasgg\n"); // respond with message
// as expected by master
}
Частоту менять нужно только на мастере.
Между двумя “есп8266”, по интерфейсу “i2c” на расстояние “15 метров”…
Я все правильно понял ?
В условиях сочетаются несочетаемые дурости.
ЗЫ: почему у меня старые темы в новых появляются переодически ?
Кто-то поредактировал своё сапщение