raspberry Piの課題

C++温湿度計

C++で温湿度計の温度でLED4を切り替えます

適当な温度を境に光るLEDを切り替えるプログラムを作りなさい

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

#include <wiringPi.h>
#include <iostream>
#include <iomanip>
#include <signal.h>
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 humi_color(int a);
void signal_handler(int a);

int P_WHITE = 5;
int P_GREEN = 6;
int P_RED = 13;

void signal_handler(int signal) {
    if (signal == SIGINT) {
        humi_color(0);
        exit(EXIT_FAILURE);
    }
}
void humi_color(int a) {
    if (a  > 80) {
	digitalWrite(P_WHITE, LOW);
	digitalWrite(P_GREEN, LOW);
	digitalWrite(P_RED, HIGH);
   } else if (a > 70) {
	digitalWrite(P_WHITE, LOW);
	digitalWrite(P_GREEN, HIGH);
	digitalWrite(P_RED, LOW);
   } else if (a > 60 ) {
	digitalWrite(P_WHITE, HIGH);
	digitalWrite(P_GREEN, LOW);
	digitalWrite(P_RED, LOW);
   } else {
	digitalWrite(P_WHITE, LOW);
	digitalWrite(P_GREEN, LOW);
	digitalWrite(P_RED, LOW);
   }
}

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";
	humi_color(dht11_dat[0]);
    }
    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();

    //Color LED init
    pinMode( P_WHITE, OUTPUT);
    pinMode( P_GREEN, OUTPUT);
    pinMode( P_RED, OUTPUT);
    digitalWrite(P_WHITE, LOW);
    digitalWrite(P_GREEN, LOW);
    digitalWrite(P_RED, LOW);

    // signal handler
    if (signal(SIGINT,signal_handler)==SIG_ERR)
        cout << "signal error";

    while ( 1 )
    {
        read_dht11_dat();
        delay(1000);//wait ls to refresh
    }

    return(0);
}

息を吹きかけるなどして温度を変化させてLEDを切り替えてください