У меня есть малина pi b, и я пытаюсь написать код в C, который позволит мне использовать HC-SR04 Ultrasonic Ranging Module. Я использовал библиотеку bcm2835 для управления контактами GPIO. Я подключил его в соответствии с this website. Вот моя попытка: естьHC - SR04 raspberry pi
# include <bcm2835.h>
# include <stdio.h>
# include <time.h>
# include <stdlib.h>
# define ECHO RPI_V2_GPIO_P1_03
# define TRIG RPI_V2_GPIO_P1_05
int main(int argc, char **argv) {
if (!bcm2835_init())
return 1;
bcm2835_gpio_fsel(ECHO, BCM2835_GPIO_FSEL_INPT);
bcm2835_gpio_fsel(TRIG, BCM2835_GPIO_FSEL_OUTP);
time_t clockstart = 0;
time_t clockstop = 0;
bcm2835_gpio_write(ECHO, LOW);
delay(2);
printf("trigger\n");
bcm2835_gpio_write(TRIG, HIGH);
usleep(10);
bcm2835_gpio_write(TRIG, LOW);
printf("measure\n");
while (bcm2835_gpio_lev(ECHO) == 0) {
clockstart = time(NULL);
}
printf("B: %i\n", (int)clockstart);
while (bcm2835_gpio_lev(ECHO) == 1) {
clockstop = time(NULL);
}
printf("E: %i\n", (int)clockstop);
time_t delta = clockstop - clockstart;
printf("D: %i\n", delta);
double distance = (delta * 340)/2;
printf("DISTANCE: %i\n", distance);
bcm2835_close();
return 0;
}
Две проблемы:
- Мой метод для чтения времени является точным только до 1 сек, - тем не менее, как я искал лучший способ сделать это я нашел два методы и окончательный ответ, который на самом деле лучше (clock_gettime() или gettimeofday()).
- Даже при очень большом удалении петли заканчиваются почти мгновенно, что приводит к точному значению как вызовов времени(). Это может быть связано с моей дрянной метод получения текущего времени, но я "не уверен.
Я довольно уверен, что я что-то очевидное здесь отсутствует, но мне нужна помощь в поиске ее.
посланной код не чисто компиляции. вот некоторые из проблем. 1) usleep() требует #include (или аналогичный) заголовочный файл 2) это утверждение: 'printf ("D:% i \ n", delta);' ожидает аргумент 'int', но аргумент 2 равен 'time_t' 3) это утверждение: 'printf ("DISTANCE:% i \ n", distance);' ожидает аргумент 'int', но аргумент 2 равен 'double' –
user3629249
опубликованный код не выполняет чисто компиляцию. вот еще несколько проблем:. 1) главный параметр «argc» не используется 2) главный параметр «argv []» не используется. Предложите объявить main через: 'int main (void)' – user3629249
, чтобы получить точную (или, по крайней мере, более точную) синхронизацию, 1) использовать прерывания, управляемые эхо-сигналом. 2) используйте gettimeofday() непосредственно перед передачей и в функции обработчика прерываний. – user3629249