#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <WiFi.h>
#include <WiFiUdp.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define GAMMA 0.7
#define RL10 50
// 定义I2C引脚(对于ESP32)
#define SDA_PIN 21
#define SCL_PIN 22
#define potentiometerPin 0
#define RelayPin 13
#define lightSensorPin 34 // 光敏电阻连接到ADC引脚
#define lightControlPin 5 // 控制灯光强度的PWM引脚
// DS18B20引脚
#define ds18b20Pin 4 // 将DS18B20连接到GPIO
float input_temp;
float input;
#define ssid "your_SSID" // 替换为你的WiFi SSID
#define password "your_PASSWORD" // 替换为你的WiFi密码
// UDP设置
WiFiUDP udp;
#define udpAddress "192.168.1.100" // 替换为接收UDP数据的设备的IP
#define udpPort 12345 // 设置UDP端口
// 初始化显示和传感器
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
OneWire oneWire(ds18b20Pin);
DallasTemperature sensors(&oneWire);
void setup() {
Wire.begin(SDA_PIN, SCL_PIN); // 手动定义I2C引脚
Serial.begin(9600); // 初始化串口监视器
WiFi.mode(WIFI_STA);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 初始化显示屏
display.clearDisplay(); // 清屏
pinMode(lightSensorPin, INPUT);
pinMode(potentiometerPin, INPUT);
pinMode(lightControlPin, OUTPUT);
pinMode(RelayPin, OUTPUT);
sensors.begin(); // 初始化DS18B20传感器
if (WifiScan()) {
WifiConnecting();
}
}
void loop() {
float lux = readLightSensor();
input = readPotentiometer() * 1023.0 / 4095.0;
// 控制LED开关
if (lux < 10) {
digitalWrite(lightControlPin, true); // 打开LED
} else {
digitalWrite(lightControlPin, false); // 关闭LED
}
// 模拟湿度传感器
if (input > 850) {
digitalWrite(RelayPin, true);
} else if (input < 500) {
digitalWrite(RelayPin, false);
}
sensors.requestTemperatures(); // 请求温度读取
float temperature = sensors.getTempCByIndex(0); // 获取第一个传感器的温度值
display.clearDisplay(); // 清屏
display.setTextSize(1); // 设置文本大小
display.setTextColor(SSD1306_WHITE); // 设置文本颜色
display.setCursor(0, 0); // 设置光标位置
display.print("Temp: ");
display.print(temperature); // 显示温度值
display.print(" C");
display.setCursor(0, 20);
display.print("Light: ");
display.print(lux); // 显示光照强度
display.setCursor(0, 40);
display.print("Humidity: ");
display.print(input);
display.display(); // 更新显示
Serial.print("Temperature: ");
Serial.print(temperature); // 输出温度值
Serial.print(" C, Light: ");
Serial.print(lux);
Serial.println("");
if (WiFi.status() == WL_CONNECTED) {
sendData(temperature, lux, input);
} else if (WifiScan() && WiFi.status() != WL_CONNECTED) {
WifiConnecting();
} else {}
delay(10); // 可以加入一些延时以平滑效果
}
int readPotentiometer() {
// 读取电位器的值(0-4095)
int potValue = analogRead(potentiometerPin);
return potValue;
}
float readLightSensor() {
// 读取光敏电阻值
float input_temp = analogRead(lightSensorPin) * 1023.0 / 4095.0;
float voltage = input_temp / 1024. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
return (float) lux;
}
void WifiConnecting() {
WiFi.begin(ssid, password);
unsigned long startTime = millis();
const unsigned long timeout = 10000; // 超时设置为10秒
while (WiFi.status() != WL_CONNECTED) {
if (millis() - startTime >= timeout) {
Serial.println("Failed to connect to WiFi within timeout");
break; // 或者执行其他处理
}
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
udp.begin(udpPort);
}
void sendData(float temperature, float lux, float humidity) {
// 发送温度、光照和湿度数据到UDP
String message = String("Temp: ") + temperature + " C, Light: " + lux + " lux, Humidity: " + humidity;
udp.beginPacket(udpAddress, udpPort);
udp.print(message);
udp.endPacket();
}
bool WifiScan () {
int n = WiFi.scanNetworks();
bool found = false;
for (int i = 0; i < n; i++) {
if (WiFi.SSID(i) == ssid) {
found = true;
break;
}
}
return found;
}