HC - SR04覆盆子pi

时间:2015-07-14 17:38:04

标签: c raspberry-pi

我有raspberry pi b,我正在尝试用C编写代码,这将允许我使用HC-SR04 Ultrasonic Ranging Module。我使用bcm2835库来控制GPIO引脚。我根据this website连接了它。这是我的尝试:

public class Testing {

    public static void main(String args[]) {
        ArrayList a1 = new ArrayList<>();
        a1.add("a");
        a1.add("e");
        a1.add("f");
        ArrayList a2 = new ArrayList<>();
        a2.add("a");
        a2.add("x");
        a2.add("y");

        a1.removeAll(a2);
        Iterator<String> it = a1.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }

存在两个问题:

  1. 我的阅读时间方法最长只能达到1秒,但是当我寻找一种更好的方法时,我发现了两种方法而且没有明确的答案哪一个实际上更好(clock_gettime()或gettimeofday()) 。
  2. 即使指向很远的地方,循环几乎瞬间完成,导致两个time()调用的值完全相同。这可能是由于我蹩脚的获取当前时间的方法,但我不确定。
  3. 我很确定我在这里遗漏了一些明显的东西,但我需要帮助找到它。

2 个答案:

答案 0 :(得分:1)

编辑:更好的解决方案是使用GPIO中断来定时回显间隔

一个建议(必须真的是评论,但我没有足够的声誉)

使用gettimeofday()而不是time() - 它提供更高的时间分辨率。

另外,我会以这种方式更改while循环:

struct timeval start, end;

while (!bcm2835_gpio_lev(ECHO));   // Although gcc may be smart
gettimeofday(&start, NULL);        // enough to do this optimisation
while (bcm2835_gpio_lev(ECHO));    // on its own
gettimeofday(&end, NULL);

double delta = (end.tv_sec - start.tv_sec) * 1000.0;     // s to ms
       delta += (end.tv_usec - start.tv_usec) / 1000.0;  // us to ms

printf("D: %f ms\n", delta);

答案 1 :(得分:0)

这是我在博客上制作的一个教程,用于在Raspberry Pi上用C ++中的HC-SR04获取值!

您可能需要查看它:

<强> https://causeyourestuck.io/2016/04/15/hc-sr04-raspberry-pi-c/

最后它看起来像这样:

Sonar sonar;
sonar.init(trigger, echo);

while(1){
    cout << "Distance is " << sonar.distance(30000) << " cm." << endl; // 30000 is a timeout in microseconds
}