125 строки
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			125 строки
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C++
		
	
	
	
| #include <Arduino.h>
 | |
| #include <Thread.h>
 | |
| #include <SevenSegmentExtended.h>      // DisplayLib // Extended TM1637 library https://github.com/bremme/arduino-tm1637
 | |
| #include "DHT.h"                       // DHTlib
 | |
| #define DHTPIN 5                       // DHTsensorSetting // DHT pin
 | |
| #define DHTTYPE DHT22                  // DHTsensorSetting // DHT11 / DHT21 / DHT22
 | |
| DHT dht(DHTPIN, DHTTYPE);              // DHTsensorSetting
 | |
| const byte PIN_CLK = 2;                // DisplaySetting // CLK pin
 | |
| const byte PIN_DIO = 3;                // DisplaySetting // DIO pin
 | |
| bool displayOn = false;                // DisplaySetting // Boolian for store display power status
 | |
| SevenSegmentExtended display(PIN_CLK, PIN_DIO); // DisplaySetting
 | |
| const byte buttonPin = 4;              // ButtonSetting // Button pin (a 10K resistor is necessary)
 | |
| long buttonPressed = 0;                // ButtonSetting // Button ms pressed counter
 | |
| long previousButtonMillis = 0;         // ButtonSetting // Button previous press counter
 | |
| byte buttonView = 0;                   // ButtonSetting // Button viewing state
 | |
| int buttonInterval = 10000;            // ButtonSetting // Interval for highlighting 4-Digit Display after pressing button
 | |
| int buttonLongPress = 2500;            // ButtonSetting // Interval for long press button action
 | |
| int buttonCheck = 200;                 // ButtonSetting // Interval for checking button state
 | |
| 
 | |
| // Threads:
 | |
| Thread pressButtonThread = Thread();   // Create thread for button state checking
 | |
| 
 | |
| void setup() {
 | |
|   Serial.begin(9600);                  // Initializes the Serial connection @ 9600 baud for debug
 | |
|   dht.begin();                         // DHTsensorSetting // Initializes the sensor
 | |
|   display.begin();                     // DisplaySetting // Initializes the display
 | |
|   displayOn = true;                    // Display On
 | |
|   display.setBacklight(100);           // Display On - set the brightness to 100 %
 | |
|   display.print("INIT-TINI");          // Display initialization
 | |
|   pinMode(buttonPin, INPUT);           // ButtonSetting
 | |
|   // Button state cheking thread:
 | |
|   pressButtonThread.onRun(pressButton);
 | |
|   pressButtonThread.setInterval(buttonCheck);
 | |
|   display.off();                       // Display Off
 | |
|   displayOn = false;                   // Display Off
 | |
| }
 | |
| 
 | |
| void loop() {
 | |
|   // Threads init:
 | |
|   if (pressButtonThread.shouldRun())
 | |
|     pressButtonThread.run();
 | |
|   // Serial interaction:
 | |
|   if (Serial.available() > 0) {
 | |
|     int incomingByte = Serial.read() - 48;
 | |
|     if (incomingByte == 5) {
 | |
|       float humFloat;
 | |
|       readDHThum(&humFloat);
 | |
|       Serial.println(humFloat);
 | |
|     }
 | |
|     if (incomingByte == 6) {
 | |
|       float tempFloat;
 | |
|       readDHTtemp(&tempFloat);
 | |
|       Serial.println(tempFloat);
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| // Check button pressing thread
 | |
| void pressButton() {
 | |
|   // Display off after buttonInterval ms slack
 | |
|   unsigned long currentMillis = millis();
 | |
|   if (currentMillis - previousButtonMillis > buttonInterval) {
 | |
|     previousButtonMillis = currentMillis;
 | |
|     if (displayOn == true) {
 | |
|       display.off();
 | |
|       displayOn = false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   if (digitalRead(buttonPin) == HIGH) {
 | |
|     buttonPressed = buttonPressed + 200;
 | |
|     if (buttonPressed > buttonLongPress) {
 | |
|       buttonPressed = 0;
 | |
|       longPress();
 | |
|     }
 | |
|     previousButtonMillis = currentMillis;
 | |
|     display.on();
 | |
|     displayOn = true;
 | |
|     if (buttonView == 0) {
 | |
|       float tempFloat;
 | |
|       readDHTtemp(&tempFloat);
 | |
|       int tempInt = (int)tempFloat;
 | |
|       if (tempInt < 0)
 | |
|         tempInt = tempInt * (-1);
 | |
|       byte rawData[4];
 | |
|       rawData[0] = display.encode(tempInt / 10);
 | |
|       rawData[1] = display.encode(tempInt % 10);
 | |
|       rawData[2] = B01100011;          // degree
 | |
|       rawData[3] = display.encode('c');
 | |
|       display.printRaw(rawData);
 | |
|     } else if (buttonView == 1) {
 | |
|       float humFloat;
 | |
|       readDHThum(&humFloat);
 | |
|       int humInt = (int)humFloat;
 | |
|       byte  rawData[4];
 | |
|       rawData[0] = display.encode('h');
 | |
|       rawData[1] = display.encode('u');
 | |
|       rawData[2] = display.encode(humInt / 10);
 | |
|       rawData[3] = display.encode(humInt % 10);
 | |
|       display.printRaw(rawData);
 | |
|     }
 | |
|     if (buttonView < 1) buttonView += 1;
 | |
|     else buttonView = 0;
 | |
|   } else {
 | |
|     buttonPressed = 0;
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| // DHT Temperature
 | |
| void readDHTtemp(float *a) {
 | |
|   float t = dht.readTemperature();
 | |
|   *a = t;
 | |
| }
 | |
| 
 | |
| // DHT Humidity
 | |
| void readDHThum(float *a) {
 | |
|   float h = dht.readHumidity();
 | |
|   *a = h;
 | |
| }
 | |
| 
 | |
| void longPress() {
 | |
|   display.print("-doctor-equivalent-me-");
 | |
| }
 |