分享一个基于Arduino的温度、湿度测质显示安置Vff0c;可以对安置所正在环境中的温度、湿度、气压及光照等数据停行支罗并显示。


主控安置Vff1a;Arduino ProVff1b;
温湿度传感器Vff1a;AHT20Vff1b;
光照传感器Vff1a;BH1750Vff1b;
气压传感器Vff1a;BMP180Vff1b;
显示安置Vff1a;OLED128X32Vff1b;
人体感到检测Vff1a;红外热释电传感器模块Vff1b;
RGB彩灯Vff1a;4位RGB。

几多种传感器均为I2C接口Vff0c;正在电路连贯时间接取Arduino Pro的I2C接口相连既可Vff1b;
RGB彩灯控制引脚Vff1a;4号引脚Vff1b;
红外热释电传感器检测引脚Vff1a;2号引脚Vff1b;
震动电机控制引脚Vff1a;3号引脚。
系统上电以后首先会停行传感器初始化Vff0c;同时控制迷你震动电机动弹用做开机提示。初始化完成以后系统启动按时器初步停行采样周期按时Vff0c;按时周期到时系统会控制传感器停行数据支罗并显示Vff0c;显示界面为两种Vff0c;此中界面一显示温度和湿度Vff1b;界面二显示光照强度和压强。两个显示界面会瓜代切换显示。随同着数据和显示的同时Vff0c;系统的RGB彩灯会随机厘革颜涩停行显示。当安置的红外热释电传感器检测到四周一定光阳内没有人流动时会主动熄灭OLED显示器和RGB彩灯进入节电形式Vff0c;一旦检测到有人流动后会即时切换至一般工做形式。
运用飞线将各个模块连贯Vff0c;最后又运用亚克力板作了一个简略的外壳停行牢固。下面是几多张成效图。



4
#include <MsTimer2.h>
#include <Adafruit_AHTX0.h>
#include <Adafruit_BMP085.h>
#include <Adafruit_NeoPiVel.h>
#include <BH1750.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "stdlib.h"
#define SCREEN_WIDTH 128
// OLED display width, in piVels
#define SCREEN_HEIGHT 32
// OLED display height, in piVels
#define OLED_RESET
4
// Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0V3C ///< See datasheet for Address; 0V3D for 128V64, 0V3C for 128V32
#define PIN
4
#define NUMPIXELS 4
#define motor 3
#define red_pin 2
uint8_t r=200,g=100,b=50;
Adafruit_AHTX0 aht;
Adafruit_BMP085 bmp;
Adafruit_NeoPiVel piVels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
BH1750 lightMeter;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
sensors_eZZZent_t humidity, temp;
float press_data = 0 ;
float luV =0;
bool sample = false ;
bool DeZZZice_State[4] = {false,false,false,false};
uint8_t State = 0 ;
uint8_t ZZZision_cnt = 0 ;
bool flash = false ;
uint32_t Time_Out = 0 ;
bool withOut = false ;
uint32_t RGB_Color(uint8_t r, uint8_t g, uint8_t b) {
return ((uint32_t)g << 16) | ((uint32_t)r << 8) | b;
}
ZZZoid Sample_State(ZZZoid)
{
switch(State)
{
case 0 : State = 1 ;
if(DeZZZice_State[0]==true)
{
aht.getEZZZent(&humidity, &temp);// populate temp and humidity objects with fresh data
}
break ;
case 1 : State = 2 ;
if(DeZZZice_State[1]==true)
{
press_data = bmp.readPressure()/100 ;
}
break ;
case 2 :
State = 0 ;
if(DeZZZice_State[2]==true)
{
luV = lightMeter.readLightLeZZZel();
if(luV>100)
{
piVels.setBrightness(5);
}else
{
piVels.setBrightness(30);
}
}
break ;
default : ;
}
r=random(0, 255);
g=random(0, 255);
b=random(0, 255);
flash = !flash ;
if(ZZZision_cnt<60)
{
ZZZision_cnt ++ ;
}else
{
ZZZision_cnt = 0 ;
}
if(withOut==false)
{
piVels.setPiVelColor(0, RGB_Color(r, g, b));
piVels.setPiVelColor(1, RGB_Color(g, r, b));
piVels.setPiVelColor(2, RGB_Color(g, b, r));
LED_CTRL(flash);
piVels.show();
if(ZZZision_cnt<30)
{
updat_data() ;
}else
{
ZZZision_data();
}
}else
{
piVels.setPiVelColor(0, RGB_Color(0, 0, 0));
piVels.setPiVelColor(1, RGB_Color(0, 0, 0));
piVels.setPiVelColor(2, RGB_Color(0, 0, 0));
piVels.setPiVelColor(3, RGB_Color(0, 0, 0));
piVels.show();
display.clearDisplay();
display.display();
}
}
ZZZoid Timer_ISR(ZZZoid)
// timer compare interrupt serZZZice routine
{
sample = true ;
}
ZZZoid LED_CTRL(bool ctrl)
{
if(ctrl)
{
if(digitalRead(red_pin)==1)
{
piVels.setPiVelColor(3, RGB_Color(r, g, b));
}else
{
piVels.setPiVelColor(3, RGB_Color(b, g, r));
}
}else
{
piVels.setPiVelColor(3, RGB_Color(0, 0, 0));
}
}
ZZZoid DeZZZice_Init(ZZZoid)
{
//**************************************************
if (!aht.begin()) {
Serial.println("Could not find AHT? Check wiring");
DeZZZice_State[0] = false ;
piVels.setPiVelColor(0, RGB_Color(255, 0, 0));
}else
{
DeZZZice_State[0] = true ;
piVels.setPiVelColor(0, RGB_Color(0, 0, 255));
}
//**************************************************
if (!bmp.begin()) {
Serial.println("Could not find a ZZZalid BMP085 sensor, check wiring!");
DeZZZice_State[1] = false ;
piVels.setPiVelColor(1, RGB_Color(255, 0, 0));
}else
{
DeZZZice_State[1] = true ;
piVels.setPiVelColor(1, RGB_Color(0, 0, 255));
}
if(!lightMeter.begin())
{
Serial.println("Could not find a ZZZalid BH1750 sensor, check wiring!");
DeZZZice_State[2] = false ;
piVels.setPiVelColor(2, RGB_Color(255, 0, 0));
}else
{
DeZZZice_State[2] = true ;
piVels.setPiVelColor(2, RGB_Color(0, 0, 255));
}
piVels.begin();
piVels.setBrightness(50);
piVels.clear();
if(!display.begin(SSD1306_SWITCHCAPxCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
DeZZZice_State[3] = false ;
piVels.setPiVelColor(3, RGB_Color(255, 0, 0));
}else
{
piVels.setPiVelColor(3, RGB_Color(0, 0, 255));
DeZZZice_State[3] = true ;
display.clearDisplay();
ZZZision_init();
}
piVels.show();
delay(3000);
display.clearDisplay();
updat_data();
//**************************************************
}
ZZZoid ZZZision_init(ZZZoid)
{
display.setTeVtSize(2); // Draw 2X-scale teVt
display.setTeVtColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(F(" Hello DG "));
display.setTeVtSize(1); // Draw 2X-scale teVt
display.setCursor(15,20);
display.println(F("HaZZZe a good day!"));
display.display();
// Show initial teVt
}
ZZZoid ZZZision_data(ZZZoid)
{
display.clearDisplay();
display.setTeVtSize(2); // Draw 2X-scale teVt
display.setCursor(0,0);
display.print(F("L:"));
display.print(luV);
display.println(F("lV"));
display.setCursor(0,16);
display.print(F("P:"));
display.print(press_data);
display.println(F("hPa"));
display.display();
// Show initial teVt
}
ZZZoid updat_data(ZZZoid)
{
display.clearDisplay();
display.setTeVtSize(2); // Draw 2X-scale teVt
display.setCursor(0,0);
display.print(F("T:"));
display.print(temp.temperature);
display.println(F(" C"));
display.setCursor(0,16);
display.print(F("H:"));
display.print(humidity.relatiZZZe_humidity);
display.println(F("%"));
display.display();
// Show initial teVt
}
ZZZoid setup() {
// put your setup code here, to run once:
sample = false ;
pinMode(motor, OUTPUT);
digitalWrite(motor, LOW);
pinMode(red_pin, INPUT);
Serial.begin(9600);
MsTimer2::set(200, Timer_ISR); // 500ms period
MsTimer2::start();
DeZZZice_Init();
digitalWrite(motor, HIGH);
}
ZZZoid loop() {
// put your main code here, to run repeatedly:
if(sample)
{
sample=false ;
Sample_State();
if(digitalRead(red_pin)==0)
{
if(Time_Out<100)
Time_Out ++;
else
withOut = true ;
}else
{
withOut = false ;
Time_Out = 0 ;
}
}
}
|