我正在尝试编写一个程序,从i2c接收字符串数据并将其显示在LCD上。第一次将数据接收到arduino时,它会呈现它,但是后续的i2c有效负载会被忽略。我的onReceive函数在lcd的第二行显示状态行,显示定时器芯片的seconds()
字段。秒数似乎没有增加。但是,loop()中呈现的每秒点闪烁确实会继续闪烁,因此mcu不会被冻结。
#include <LiquidCrystal.h>
#include <Wire.h>
#include <Time.h>
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
void setup()
{
Wire.begin(4); // join i2c bus with address #4
Wire.onReceive(receiveEvent); // register event
lcd.begin(16,2); // columns, rows. use 16,2 for a 16x2 LCD, etc.
lcd.clear(); // start with a blank screen
}
void loop()
{
lcd.setCursor(15,1);
if (second() % 2 == 0)
lcd.write(".");
else
lcd.write(" ");
delay(100);
}
void receiveEvent(int howMany)
{
//char buf[howMany];
int i=0;
char output[16];
lcd.clear();
while(Wire.available())
{
char c = Wire.read(); // receive byte as a character
lcd.setCursor(i,0);
lcd.write(c);
i++;
//buf[i++]=c;
//buf[i+1]=0;
}
lcd.setCursor(0,1);
sprintf(output,"s%dNB%dI%d",second(),howMany,i);
lcd.write(output);
}
答案 0 :(得分:0)
你的Arduino可能被困在这里:
while(Wire.available())
{
//...
使用:
if(Wire.available() > 0) {
//stuff
}
代替。