#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <WebServer.h>
#include <WiFi.h>
const byte ledPin = 8;
//用3号引脚作为中断触发引脚
const byte interruptPin = 3;
const byte statled = 13;
const byte greenled = 0;
const byte redled = 0;
const byte alermbuzz = 12;
//网络
const char* ssid = "IridiumPhoenixRouter";
const char* password = "[email protected]";
const char* hostname = "ESP-FlowSensor";
WebServer server(80);
//显示屏
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
int freq = 0;
float lm = 0.0;
int webfreq = 0;
float weblm = 0.0;
unsigned long time_now = 0;
void setup() {
pinMode(statled, OUTPUT);
pinMode(alermbuzz, OUTPUT);
digitalWrite(statled, HIGH);
tone(alermbuzz,300);
pinMode(ledPin, OUTPUT);
//将中断触发引脚(2号引脚)设置为INPUT_PULLUP(输入上拉)模式
pinMode(interruptPin, INPUT_PULLUP);
//设置中断触发程序
attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
Serial.begin(9600);
delay(100);
display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Starting...");
display.display();
//wifi初始化
delay(1000);
noTone(alermbuzz);
display.println("Connecting...");
display.display();
WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE);
WiFi.mode(WIFI_STA);
WiFi.setSleep(false);
WiFi.begin(ssid,password);
int i = 0;
while(WiFi.status() != WL_CONNECTED){
i++;
//连接wifi时闪烁灯光
delay(250);
digitalWrite(statled, LOW);
delay(250);
digitalWrite(statled, HIGH);
delay(250);
digitalWrite(statled, LOW);
delay(250);
digitalWrite(statled, HIGH);
display.print(">");
display.display();
//连接超时重启
if(i > 30){
display.println("");
display.println("Connect Failed!Restarting...");
display.display();
delay(5000);
esp_restart();
}
}
//设置HostName
WiFi.setHostname(hostname);
display.println("");
display.println("Connected!Waiting...");
display.print("IP:");
display.println(WiFi.localIP());
display.display();
delay(2000);
//启动web服务
server.on("/",webIndex);
server.on("/freq",webFreq);
server.on("/speed",webSpeed);
server.begin();
digitalWrite(statled, LOW);
}
void loop() {
time_now = millis();
Serial.println(freq);
display.clearDisplay();
display.setTextSize(4);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
lm = (freq*30.000)/450.000;
if(lm < 10){
display.print(lm,2);
}else{
display.print(lm,1);
}
display.println("~");
display.display();
Serial.println(lm);
webfreq = freq;
weblm = lm;
//流速频率1L/min时,报警灯亮起
if(weblm < 1){
tone(alermbuzz,300);
delay(200);
noTone(alermbuzz);
}
freq = 0;
while(millis() < time_now + 2000){
//wait...
server.handleClient();
}
}
//中断服务程序
void blink() {
freq++;
}
void webIndex(){
//访问根目录时,如果流量过低则提示low,否则提示ok
if(weblm < 1){
server.send(200,"text/plain","LOW");
}else{
server.send(200,"text/plain","OK");
}
delay(50);
digitalWrite(statled, HIGH);
delay(50);
digitalWrite(statled, LOW);
}
void webSpeed(){
//访问speed接口时,返回当前流速(L/min)
server.send(200,"text/plain",String(weblm,2));
delay(50);
digitalWrite(statled, HIGH);
delay(50);
digitalWrite(statled, LOW);
}
void webFreq(){
//访问freq接口时,返回当前原始pwm频率数据
server.send(200,"text/plain",String(webfreq));
delay(50);
digitalWrite(statled, HIGH);
delay(50);
digitalWrite(statled, LOW);
}