【问题标题】:Having trouble sending a string via I2C通过 I2C 发送字符串时遇到问题
【发布时间】:2021-11-04 02:36:04
【问题描述】:

我有一个连接了 3 个传感器的 arduino,需要将我从所述传感器获得的信息发送到另一个 arduino,并将其显示在连接的液晶显示器上。我试图通过将float 值更改为string 来解决此问题,将string 发送到另一个arduino 并在液晶显示器上显示。但是当我尝试执行此操作时,我收到一条错误消息:

" 在函数 'void receiveEvent(int)' 中: 16:24:错误:intchar [7] 的分配不兼容类型“

#include <Wire.h>

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

int sensePin = A0;
int sensorInput;

int lightPin = A1;
int lightInput;

int gasPin = A2;
int gasInput;
int buzzer = 13;

int b_state = 3;

float temp;
float light;

char t_buffer[7];

int state = 0;

void setup()
{
  Wire.begin();
  pinMode(A0, INPUT);
  pinMode(A1,INPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(A2, INPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(b_state, INPUT_PULLUP);
  Serial.begin(9600);
  lcd.begin(16, 2);
  
  attachInterrupt(digitalPinToInterrupt(3), buttons, FALLING);
}

void loop()
{ 
  gasInput = analogRead(gasPin);
  sensorInput = analogRead(sensePin);
  lightInput = analogRead(lightPin);
  
  temp = (float)sensorInput / 1024;
  temp = temp * 5;
  temp = temp - 0.498;
  temp = temp * 100;
  
  light = ((float)lightInput - 26) / 8.97;
  
  dtostrf(temp, 6, 2, t_buffer);

  Serial.print("Current Temperature: ");
  Serial.println(temp);
  Serial.print("Current Light: ");
  Serial.println(light);
  Serial.print("Gas (conc.?): ");
  Serial.println(gasInput);
  
  Wire.beginTransmission(9);
  Wire.write(t_buffer, 7);
  Wire.endTransmission();
  
  delay(100);
  
  if (state == 0){
  lcd.setCursor(0, 0);
  lcd.print("Temp (C): ");
  lcd.setCursor(0,1);
  lcd.print(t_buffer);
  }
  
  else {
  lcd.setCursor(0,0);
  lcd.print("Light Intensity: ");
  lcd.setCursor (0,1);
  lcd.print(light);
  }
  
  if (gasInput > 800)
    digitalWrite(buzzer, HIGH);
  else
    digitalWrite(buzzer, LOW);
}

void buttons()
{
  lcd.clear();
  state = !state;
}
#include <Wire.h>

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

float temp;
char t_buffer[7];

void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);
  Wire.begin(9); 
  Wire.onReceive(receiveEvent);
}
void receiveEvent(int bytes) {
  t_buffer = Wire.read();
  //temp = t_buffer.toFloat();
}

void loop() {
  lcd.setCursor(0, 0);
  lcd.print("Temp (C): ");
  lcd.setCursor(0,1);
  lcd.print(t_buffer);
}

另外,我需要发送 2 个单独的浮点值,我想我可以正确地对传输进行计时,并将它们一个接一个地发送。这是这样做的好方法还是有其他方法?

The circuit

【问题讨论】:

  • 也许你想要Wire.readBytes(t_buffer , bytes);
  • Wire.read读取一个字节,将一个字节分配成7个字节是什么意思?

标签: c++ arduino arduino-uno i2c


【解决方案1】:

这可能不是您问题的直接答案,但它可能会帮助您解决问题。

t_buffer 是一个指针,而 t_buffer[0] 是缓冲区中的第一个字符。 Wire.read 返回一个字符而不是指针。

如果上面的解释没有意义,您可能需要阅读数组。

话虽如此,由于您的主循环几乎是空的,您可以使用Juraj 的建议并使用Wire.readBytes(t_buffer , bytes) 这样您就不必担心通过缓冲区进行索引。

我强烈建议您将文本数据放入 t_buffer 并在尝试发送浮点数之前测试您的应用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多