Связь I2C не работает
Я работал над своим проектом, но обнаружил ошибку и мне нужен совет или исправление.
Я использую метод I2C для связи между главным и подчиненным устройствами. У меня два вопроса:
- Я отправляю 7 входных данных (от ведущего) ведомому, но получаю только 6.
- Сможет ли мой код выдать результат, подобный этому видео
Главный код
// Мастер-код
#include <Wire.h>
byte nChar =0;
char input[7];
void setup () {
Serial.begin(9600);
Wire.begin();
}
void loop()
{
if (nChar < 7) {if (Serial.available()) { input[nChar++] = Serial.read();}}
else {
Wire.beginTransmission(1);
//а
Wire.write(input[0]);
Serial.print("Drawer : ");
Serial.println(input[0]);
//Икс
Wire.write(input[1]);
Serial.print("Output : ");
Serial.println(input[1]);
//00
Wire.write(input[2]);
Wire.write(input[3]);
Serial.print("Output : ");
Serial.print(input[2]);
Serial.println(input[3]);
//у
Wire.write(input[4]);
Serial.print("Output : ");
Serial.println(input[4]);
//00
Wire.write(input[5]);
Wire.write(input[6]);
Serial.print("Output : ");
Serial.print(input[5]);
Serial.println(input[6]);
delay(15);
while (Serial.available())
{
//Удалим лишние
Serial.read();
}
Wire.endTransmission();
nChar = 0;
}
}
Подчиненный код
#include <Wire.h>
byte ledPins[] = {12, 11, 10, 9, 8, 7, 6};
byte ledPins2[] = {12, 11, 10, 9, 8, 7, 6};
byte count;
byte nChar;
char c;
char input[8];
char data[30] = "";
int n;
#define nBits sizeof(ledPins)/sizeof(ledPins[0])
#define nBits sizeof(ledPins2)/sizeof(ledPins[0])
void setup()
{
Wire.begin(1);
Serial.begin(9600);
for (byte i = 0; i < nBits; i++) {
pinMode(ledPins[i], OUTPUT);
}
for (byte i = 0; i < nBits; i++) {
pinMode(ledPins2[i], OUTPUT);
}
Serial.begin(9600);
}
void loop()
{
if (nChar < 8) { //накапливаем три символа
if (Serial.available()) {
c = Serial.read();
input[nChar++] = c;
}
}
else {
input[8] = 1; //atoi() ожидает признак конца строки
n = atoi(input); //конвертируем входные символы в целые числа
dispBinary(n);
delay(100); //ждём появления дополнительных символов
while (Serial.available()) { //игнорируем их
c = Serial.read();
}
nChar = 1;
}
}
void receiveEvent(int howMany)
{
while (1 < Wire.available()) {
char c = Wire.read();
Serial.print(c);
}
}
void dispBinary(int n) //Вертикально
{
if (n >= 0 && n <= 5) {
for (byte i = 0; i < nBits; i++) {
digitalWrite (ledPins[i], n & 1);
n /= 2;
}
}
}
void dispBinary2(int n) //Горизонтально
{
if (n >= 0 && n <= 5) {
for (byte i = 0; i < nBits; i++) {
digitalWrite (ledPins2[i], n & 1);
n /= 2;
}
}
}
void b()
{
if (data[0] != 'a')
{
dispBinary(atoi("00"));
delay(100);
dispBinary2(atoi("00"));
delay(100);
goto fin;
}
if (data[1] = 'x')
{
char xdata[2] = {data[2], data[3]};//(данные[2], данные[3]);
dispBinary2(atoi(xdata));
delay(100);
}
if (data[4] = 'y')
{
char ydata[2] = {data[5], data[6]};//(data[5], data[6]);
dispBinary(atoi(ydata));
delay(100);
}
fin:;
}
@Muhammad Nazirul Na'im Maznan, 👍0
Обсуждение1 ответ
Большинство программистов записывают while (1 < Wire.available()) {
как while ( Wire.available() > 1) {
и читают его «Повторить, пока доступно больше 1 байта». но подождите, зачем оставлять здесь этот один байт? вы хотите «повторить, пока больше нет доступных байтов».
вам нужен while (0 < Wire.available())
Какая кодировка, господа?, @Muhammad Nazirul Na'im Maznan
измените while (1 < Wire.available())
на while (0 < Wire.available())
, @Juraj
Другой вопрос, почему оно стало на одной линии. Почему бы не сделать одну строку одним выходом. Я не могу разместить изображение, чтобы поделиться с вами. Как сделать ?, @Muhammad Nazirul Na'im Maznan
замените Serial.print(c);
на Serial.println(c);
ln
— это строка, @Juraj
- avrdude ser_open() can't set com-state
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Какое максимальное энергопотребление Arduino Nano 3.0?
- Как навсегда изменить скорость передачи данных ESP8266 (12e)?
- Питание светодиодной ленты - Сколько ампер?
- Arduino nano как клавиатура HID
- Как я могу запитать Arduino Nano от батареи LiPo, желательно 3,7 В
- В чем разница между библиотеками Software Serial? Какая из них совместима с Arduino Nano?
Где находится Wire.onRequest?, @Jot