#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <Servo.h> //加载文件库
int pos = 0;
Servo myservo;
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 20, 4); // I2C地址为0x27,显示屏为
#define TrigPin 13 //超声波发射引脚
#define EchoPin 12 //超声波接收引脚
void setup() {
Serial.begin(9600);
pinMode(3,INPUT_PULLUP);
pinMode(4,INPUT_PULLUP);
pinMode(8,INPUT_PULLUP); //模式切换
lcd.begin(16, 2);
dht.begin();
lcd.print("Temperature:");
lcd.setCursor(0, 1);
lcd.print("Humidity:");
lcd.setCursor(0, 2);
lcd.print("lux:");
myservo.attach(9, 500, 2500); //修正脉冲宽度
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
digitalWrite(6, LOW); //red
digitalWrite(7, LOW); //green
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
digitalWrite(11, LOW);
}
int open=0;
int close=0;
int closed=0;
int alarm=0;
bool flag;
void loop() {
digitalWrite(TrigPin, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);//发一个10ms的高脉冲去触发TrigPin
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
//float distance_mm = pulseIn(EchoPin, HIGH) * 0.1724138; //单位mm
float distance_cm = pulseIn(EchoPin, HIGH) / 58.0; //单位cm
//Serial.println(String("Distance: ") + String(distance_mm) + String(" mm"));
Serial.println(String("Distance: ") + String(distance_cm) + String(" cm"));
if(distance_cm<150){
digitalWrite(6, HIGH);
}
else
digitalWrite(6, LOW);
if(digitalRead(3)==LOW){ //open
open=1;
close=0;
}else
{
}
if(digitalRead(4)==LOW){ //close
open=0;
close=1;
}else
{
}
if(open==1&&close==0){
for (pos = 0; pos <= 180; pos += 1) { //pos+=1等价于pos=pos+1
myservo.write(pos);
delay(15);
}
open=0;
closed=0;
}
if(open==0&&close==1&&closed==0){
for (pos = 180; pos >= 0; pos -= 1) {
myservo.write(pos);
delay(15);
}
close=0;
closed=1;
}
int ldr=analogRead(A0);
Serial.println(analogRead(A0));
int cloth=analogRead(A3);
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
lcd.setCursor(12, 0);
lcd.print(temperature);
lcd.setCursor(9, 1);
lcd.print(humidity);
lcd.setCursor(4, 2);
lcd.print(ldr);
if(humidity>80||ldr>800||temperature<45){
alarm=1;
open=0; //close
close=1;
}
if(alarm){
digitalWrite(7, HIGH);//green
for (int i = 200; i <= 300; i++)
{
tone(10, i);
delay(2);
}
alarm=0;
}
else
{
digitalWrite(7, LOW);
noTone(10);
}
if(digitalRead(8)==LOW){
flag=!flag;
}
if(flag){
digitalWrite(11, HIGH);
int mappedValue = map(analogRead(A3), 0, 1023, 0, 180); // 将原始值映射到0到100的范围内
myservo.write(mappedValue);
}
else
digitalWrite(11, LOW);
delay(500);
}