#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);
}

🏷️没有相关Tag

添加新反馈

如果你是千联萌的开发与管理人员,请登录后再进行反馈。