【问题标题】:Run C++ on Arduino only when rasperry pi asks for it仅当 raspberry pi 要求时在 Arduino 上运行 C++
【发布时间】:2019-12-19 23:25:43
【问题描述】:

我想从树莓派向我的 arduino 发送数据,向我发送传感器值一次,然后继续什么都不做并通过。目前我发送一个值,然后我收到一个我不想要的无限循环。这是代码:

void loop() {
  if (Serial.available() > 0) {
    unsigned long startTime=millis();  
    int phValue = analogRead(sensorPin);
    float voltage = phValue * (5/1023.0);
    float ph = (-5.6548 * voltage) + 15.509;
    int dis=SharpIR.distance();
    float humidity = dht.readHumidity();
    float outside_temp = dht.readTemperature();
    float h = dht.readHumidity();
    float f = dht.readTemperature(true);
    float hif = dht.computeHeatIndex(f,h);
    Serial.print(ph); //ph
    Serial.print(' ');
    Serial.print(dis);
    Serial.print(' ');
    Serial.print(h); //humidity
    Serial.print(' ');
    Serial.print(f); //outside temp in farenheit
    Serial.print(' ');
    Serial.println(hif);
  } else {
    ;
  }

}

【问题讨论】:

  • 要接收来自 Pi 的 Arduino 请求,您必须始终在 Arduino 上运行代码,并且必须始终检查是否有新信息。如果你每 10 秒运行一次,那么它可能会错过一些请求,Pi 将不会获取数据,而是空结果。
  • 是的,这就是为什么我想从树莓派发送一个“1”到 arduino。如果 arduino 确实得到了一个,则发送一次数据,然后继续监听 1

标签: python c++ arduino raspberry-pi


【解决方案1】:

您的 Arduino 板和 Raspberry Pi 板应该通过 UART 相互通信。您应该只在您的设备上设置波特率。

例如,在 Arduino 端,您可以设置串行连接:

void setup() {
    Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}

void loop() {
  if (Serial.available() > 0) {
    // read the incoming string:
    incomingString = Serial.readString();
    Serial.write("Hello Raspberrry");
  }
}

在 Raspberry 方面,您应该首先使用 this 教程配置您的开发板。然后你需要使用pip3 install pyserial 在你的树莓派上安装 PySerial 包。然后您的开发板可以使用以下方式与 Arduino 对话:

import serial
import time

port = serial.Serial("/dev/ttyAMA0", baudrate=9600, timeout=2.0)

while True:
    port.write("Hello Arduino")
    string = port.readline()
    print(string)

    time.sleep(10)

【讨论】:

  • 太棒了,这就是我想要的。所以基本上“serial.available > 0”正在等待将数据发送到arduino,一旦它是Serial.readString()读取发送的数据?
  • @MikeSandstrom 没错。因此,每当收到请求时,它都会进入if 语句并将数据发送回树莓派。
  • 好的,但是,一旦我发送数据,我就无法跳出循环。我发送了数据并进入了一个无限循环,我的数据被发送了很多次。每次向 arduino 发送消息时,我如何才能只收到一次数据?
  • 也许我可以向 arduino 发送 1 以接收消息。然后在我收到它后发送一个 0,其中 0 进入循环中每次都通过的部分?
  • @MikeSandstrom loop() 应该始终运行。每当有来自 Raspberry pi 的请求时,您输入 if 并回复。否则,您可以做其他事情,或者准备新数据,或者干脆什么都不做。
猜你喜欢
  • 2019-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多