I2C wire.h отправляет 2 переменные
Я пытаюсь отправить 2 переменные с помощью wire.h
. Я пробовал с этим кодом:
ГЛАВНЫЙ ПРИЕМНИК:
#include <Wire.h> // включаем библиотеку
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"
LiquidCrystal_I2C lcd(0x3E, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
RTC_DS1307 RTC; // орология
static int anno;
static int giorno;
static int mese;
static int ora;
static int secondo;
static int oldSecondo;
static int minuto;
static int oldMinuto;
static int annoGrezzo;
char t[10] = {};
char v[10] = {};
void setup() {
Wire.begin(); // присоединяемся к шине i2c с адресом #4
lcd.begin(16, 2);
Serial.begin(9600); // запускаем сериал для вывода
//-----------орологио-----------
RTC.begin();
// Проверяем, отсчитывает ли RTC время. Если это так, загрузите время с вашего компьютера.
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
// Это будет отражать время компиляции вашего скетча
RTC.adjust(DateTime(__DATE__, __TIME__));
}
//-----------тонкая орология-----------
}
void loop() {
//------------------------------------------------ ------------
// си штампано и данные рисовути и рикомпости
//------------------------------------------------ ------------
Wire.requestFrom(8, 6);
int i = 0;
while (Wire.available()) {
Serial.println(i);
t[i] = Wire.read();
// каждый пришедший символ упорядочивает в пустом массиве "t"
i = i + 1;
}
Serial.println(t);
DateTime now = RTC.now();
annoGrezzo = now.year();
anno = (annoGrezzo % 100);
mese = now.month();
giorno = now.day();
ora = now.hour();
minuto = now.minute();
lcd.setCursor(0, 0);
lcd.print(t);
lcd.setCursor(5,0);
lcd.print(v);
lcd.setCursor(0, 1);
lcd.print(giorno);
lcd.print(" ");
lcd.print(mese);
lcd.print(" ");
lcd.print(anno);
lcd.print(" ");
lcd.print(ora);
lcd.print(":");
lcd.print(minuto);
delay (1000);
lcd.clear();
}
ВЕДОМЫЙ ОТПРАВИТЕЛЬ
#include <Wire.h> // si include la libreria
//------------------------------------------------ ---------
char t[10];
char v[10];
void setup() {
Wire.begin(8);
// подключение к шине i2c (адрес необязателен для мастера)
Wire.onRequest(requestEvent);
}
void loop() {
int mioInt = random(30000);
int mioInt2 = 1234;
dtostrf(mioInt, 3, 2, t);
// преобразует число с плавающей запятой или целое число в строку. (floatVar, minStringWidthIncDecimalPoint, numVarsAfterDecimal, пустой массив);
dtostrf(mioInt2, 3, 2, v);
//------------------------------------------------ ------
delay (500);
}
void requestEvent() {
Wire.write(t);
Wire.write(v);
}
Мне не удается получить v
на главный приемник. Спасибо за помощь.
@Francesco Valla, 👍1
Обсуждение1 ответ
I2C — это 8-битная шина данных, где адрес может быть 7-битным или 10-битным, вы не можете отправлять более 8 бит за раз, если вы хотите отправить данные более 8 бит, вы будете отправлять их как это, например, позволяет вам отправлять 16-битные данные, затем вы отправляете сначала 8-битный младший бит, а затем 8-битный старший бит или наоборот в соответствии с вашей конфигурацией.
Во-вторых, я заметил ваш код и заметил много ошибок, главная из которых заключается в том, что вы не следовали правилам протокола I2C в своем коде. Здесь я прикрепил ссылку на образец программы arduino i2c slave и master. Пройди его и получишь ответ.
- Отправка и получение различных типов данных через I2C в Arduino
- Как выбрать альтернативные контакты I2C на ESP32?
- Альтернативы библиотеке Wire для I2C
- Библиотека Wire.h работает на Uno, но не компилируется для ATtiny85
- Вызов I2C во время Wire.requestFrom
- I2C связь между Arduino Uno и Nodemcu32-s (ESP32)
- Как обнаружить ошибки I2C с помощью requestFrom()
- Проблемы с I2C и Wire.Available()
У меня нет под рукой библиотеки, но я думаю, что чтение требует, чтобы вы запросили определенное количество байтов с адреса I2C. Вы, кажется, не делаете этого. Предложите вам более внимательно изучить работающую библиотеку I2C и посмотреть, как они это делают., @Code Gorilla
Вы запрашиваете 6 байт вместо 20, если я правильно понимаю, и в Мастере нет кода для записи в
v
., @Mark Smith