Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Датчик влажности и малина2
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Отладочные платы > Raspberry Pi
muravei
Пытаюсь подключить DHT11 к RPi2. Код взял от RPi.
Базовый адрес поменял. Но читаются нули. crying.gif
Что еще надо подправить?
CODE
// How to access GPIO registers from C-code on the Raspberry-Pi
// Example program
// 15-January-2012
// Dom and Gert
//


// Access from ARM Running Linux

#define BCM2708_PERI_BASE 0x3f000000//0x20000000
#define GPIO_BASE (BCM2708_PERI_BASE + 0x200000) /* GPIO controller */


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#include <fcntl.h>
#include <assert.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <bcm2835.h>
#include <unistd.h>

#define MAXTIMINGS 100

#define DHT11 11
#define DHT22 22
#define AM2302 22

int readDHT(int type, int pin);

int main(int argc, char **argv)
{
if (!bcm2835_init())
return 1;

if (argc != 3) {
printf("usage: %s [11|22|2302] GPIOpin#\n", argv[0]);
printf("example: %s 2302 4 - Read from an AM2302 connected to GPIO #4\n", argv[0]);
return 2;
}
int type = 0;
if (strcmp(argv[1], "11") == 0) type = DHT11;
if (strcmp(argv[1], "22") == 0) type = DHT22;
if (strcmp(argv[1], "2302") == 0) type = AM2302;
if (type == 0) {
printf("Select 11, 22, 2303 as type!\n");
return 3;
}

int dhtpin = atoi(argv[2]);

if (dhtpin <= 0) {
printf("Please select a valid GPIO pin #\n");
return 3;
}


printf("Using pin #%d\n", dhtpin);

readDHT(type, dhtpin);
return 0;

} // main


int bits[250], data[100];
int bitidx = 0;

int readDHT(int type, int pin) {
int counter = 0;
int laststate = HIGH;
int j=0;
int i=0;
// Set GPIO pin to output
bcm2835_gpio_fsel(pin, BCM2835_GPIO_FSEL_OUTP);
bcm2835_gpio_write(pin, HIGH);
usleep(100);
bcm2835_gpio_write(pin, LOW);
usleep(20000);
bcm2835_gpio_fsel(pin, BCM2835_GPIO_FSEL_INPT);

data[0] = data[1] = data[2] = data[3] = data[4] = 0;
// read data!

for (i=0; i< MAXTIMINGS; i++) {
counter = 0;
while ( bcm2835_gpio_lev(pin) == laststate) {
counter++;
nanosleep(1); // overclocking might change this?
if (counter == 100)
break;
}
laststate = bcm2835_gpio_lev(pin);
if (counter == 100) break;
bits[bitidx++] = counter;

if ((i>3) && (i%2 == 0)) {
// shove each bit into the storage bytes
data[j/8] <<= 1;
if (counter > 16)
data[j/8] |= 1;
j++;
}
}


#ifdef DEBUG
for (int i=3; i<bitidx; i+=2) {
printf("bit %d: %d\n", i-3, bits[i]);
printf("bit %d: %d (%d)\n", i-2, bits[i+1], bits[i+1] > 15);
}
#endif

printf("Data (%d): 0x%x 0x%x 0x%x 0x%x 0x%x\n", j, data[0], data[1], data[2], data[3], data[4]);

if ((j >= 39) &&
(data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) ) {
// yay!
if (type == DHT11)

printf("Temp = %d *C, Hum = %d \%\n", data[2], data[0]);
if (type == DHT22) {
float f, h;
h = data[0] * 256 + data[1];
printf ("%s\n",h);
h /= 10;

f = (data[2] & 0x7F)* 256 + data[3];
f /= 10.0;
if (data[2] & 0x80) f *= -1;
printf("Temp = %.1f *C, Hum = %.1f \%\n", f, h);
}
return 1;
}

return 0;
}
Tarbal
Цитата(muravei @ Feb 11 2016, 23:58) *
Пытаюсь подключить DHT11 к RPi2. Код взял от RPi.
Базовый адрес поменял. Но читаются нули. crying.gif
Что еще надо подправить?


Вы это на линуксе из пространства пользователя собираетесь исполнять?
Не ждите выполнения временной диаграммы, что ставит крест на способе коммуникации через один провод.
Решение в лоб -- поставить какой нибудь мелкий процессор для интерфейса.
Возможно можно найти что-нибудь хитрое через SPI или PCM, но в этом случае придется с драйвером иметь дело.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.