raspberry Piの課題

C++温湿度計

C++で温湿度計DHT-11を使います

DHT-11とシリアル通信をして温度と湿度を受信します

/********************************************************************************************
*Filename      : dht11p.cpp
*Description   : make a thermometer
*Author        : Alan
*Website       : www.osoyoo.com
*Update        : 2017/07/06
********************************************************************************************/

#include <wiringPi.h>
#include <iostream>
#include <iomanip>
using namespace std;

#define MAXTIMINGS  85  
#define DHTPIN      4  //DHT connect to TxD->GPIO4
int dht11_dat[5] ={0,0,0,0,0};//store DHT11 data

void read_dht11_dat();
void print_info();

void read_dht11_dat()
{
    unsigned int laststate = HIGH;
    unsigned int counter = 0;
    unsigned int j = 0,i;
    float f;//fahrenheit

    dht11_dat[0] = dht11_dat[1] = dht11_dat[2] = dht11_dat[3] = dht11_dat[4] = 0;

    //pull pin down to send start signal
    pinMode( DHTPIN, OUTPUT );
    digitalWrite( DHTPIN, LOW );
    delay( 18 );
    //pull pin up and wait for sensor response
    digitalWrite( DHTPIN, HIGH );
    delayMicroseconds( 40 );
    //prepare to read the pin
    pinMode( DHTPIN, INPUT );

    //detect change and read data
    for ( i = 0; i < MAXTIMINGS; i++ )
    {
        counter = 0;
        while ( digitalRead( DHTPIN ) == laststate )
        {
            counter++;
            delayMicroseconds( 2 );//1->2
            if ( counter == 255 )
            {
                break;
            }
        }
        laststate = digitalRead( DHTPIN );

        if ( counter == 255 )
            break;
        //ignore first 3 transitions
        if ( (i >= 4) && (i % 2 == 0) )
        {
            //shove each bit into the storage bytes
            dht11_dat[j / 8] <<= 1;
            if ( counter > 16 )
                dht11_dat[j / 8] |= 1;
            j++;
        }
    }
    //check we read 40 bits(8bit x 5) +verify checksum in the last byte
    //print it out if data is good
    if ( (j >= 40) &&
         (dht11_dat[4] == ( (dht11_dat[0] + dht11_dat[1] + dht11_dat[2] + dht11_dat[3]) & 0xFF) ) )
    {
        f = dht11_dat[2] * 9. / 5. + 32;
        cout << "Humidity = " << dec << dht11_dat[0] << "." << dec << dht11_dat[1] <<
			"% Temperature = " << dec << dht11_dat[2] << "." << dec << dht11_dat[3] << "C (" <<
			fixed  << setprecision(1) << f << " F)\n";
    }
    else
    {
        cout << "Data not good, skip\n";
	cout << "[0]=" << hex << dht11_dat[0] << endl;
	cout << "[1]=" << hex << dht11_dat[1] << endl;
	cout << "[2]=" << hex << dht11_dat[2] << endl;
	cout << "[3]=" << hex << dht11_dat[3] << endl;
    }
}


void print_info()
{
    cout << "\n";
    cout << "|***************************|\n";
    cout << "|           DHT11 test      |\n";
    cout << "| --------------------------|\n";
    cout << "| DHT11 connect to GPIO4    |\n";
    cout << "| --------------------------|\n";
    cout << "|                     OSOYOO|\n";
    cout << "|***************************|\n";
    cout << "Program is running...\n";
    cout << "Press Ctrl+C to end the program\n";
}


int main( )
{
    if ( wiringPiSetupGpio() == -1 )
    {
        cout << "Can't init wiringPi\n";
        exit(EXIT_FAILURE);
    }
    print_info();
    while ( 1 )
    {
        read_dht11_dat();
        delay(1000);//wait ls to refresh
    }

    return(0);
}

時々、受信に失敗しながらも受信してくれます