智慧鱼缸,检测土壤湿度,检测室内温湿度和光照,检测鱼缸水位,检测鱼缸温度,各种蜂鸣器报警(水温超20-24)和控制舵机(步进电机),控制两个水泵,一个需要是从植物里面抽水到鱼缸,另外一个是供养氧作用,数据上传onenet,显示在oled,ESP32做主MCU,下行控制氧气水泵

1、项目简介

2、实现逻辑

3、应用场景

#智慧鱼缸

4、核心代码梳理


const char *ssid = "ziroom602";//WIFI
const char *password = "4001111";//WIFI密码
const char* serverIP = "183.230.40.33"; //欲访问的地址
uint16_t serverPort = 80;         //服务器端口号
String url = "http://api.heclouds.com/devices/7xxxxxxxxx7/datapoints?type=3";//网址 设备ID
String api="h8txxxxxxxxxxxxxxxxxxxYFNsgW4=";//api-key
String post;//http请求
int Content_Length;
WiFiClient client; //声明一个客户端对象,用于与服务器进行连接OneWire  ds(0);  // on pin 10 (a 4.7K resistor is necessary)
BH1750FVI myBH1750(BH1750_DEFAULT_I2CADDR, BH1750_CONTINUOUS_HIGH_RES_MODE_2, BH1750_SENSITIVITY_DEFAULT, BH1750_ACCURACY_DEFAULT);
U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 18, /* data=*/ 19, /* cs=*/ 5, /* dc=*/ 16, /* reset=*/ 17);
Servo myservo;  // create servo object to control a servo
#define DHTTYPE       DHT11 //选择的类型int     servoPin    = 14;      // GPIO pin used to connect the servo control (digital out)
#define LED_BUILTIN   02
#define WATER         15
#define GROUND_H      4
#define WATER_MOTOR   12 //
#define O2_MOTOR      13
#define BEEP          33
#define DHTPIN        27 //DHT11 DATA 数据引脚
DHT dht(DHTPIN, DHTTYPE);
long  ground_h = 0, water = 0, pwm_value = 0;
float tank_temp = 0, house_h = 0, house_t = 0, light_value = 0;
int8_t rx_data = 0, beep_flag = 0, water_ok_flag = 0, water_in_flag = 0, O2_in_flag = 0;
static unsigned long time_=0;//定义初始发送时间为0
static unsigned long time_out=0;//定义超时发送时间为0void setup(void)
{//DHT11dht.begin();  //OLEDu8g2.begin();u8g2.enableUTF8Print();        // enable UTF8 support for the Arduino print() function//USARTSerial.begin(9600);//PIN CFGpinMode(LED_BUILTIN, OUTPUT);pinMode(WATER_MOTOR, OUTPUT);pinMode(O2_MOTOR, OUTPUT); pinMode(BEEP, OUTPUT);digitalWrite(BEEP, 1); //low - beeppinMode(GROUND_H, INPUT);pinMode(GROUND_H, INPUT_PULLUP);pinMode(WATER, INPUT);pinMode(WATER, INPUT_PULLUP);//WIFISerial.print("Connecting to ");Serial.println(ssid);WiFi.begin(ssid, password);//连接到网络while (WiFi.status() != WL_CONNECTED) {//等待网络连接成功delay(500);Serial.print(".");}Serial.println("");Serial.println("WiFi connected");Serial.print("IP address: ");Serial.println(WiFi.localIP());//打印模块IP//BH1750while (myBH1750.begin() != true)               {Serial.println(F("ROHM BH1750FVI is not present")); //(F()) saves string to flash & keeps dynamic memory freedelay(5000);}Serial.println(F("ROHM BH1750FVI is present"));//PWM & MOTORESP32PWM::allocateTimer(0);ESP32PWM::allocateTimer(1);ESP32PWM::allocateTimer(2);ESP32PWM::allocateTimer(3);myservo.setPeriodHertz(50);// Standard 50hz servomyservo.attach(servoPin, 500, 2400);
}void loop(void)
{byte i;byte present = 0;byte type_s;byte data[12];byte addr[8];float celsius, fahrenheit;//DS18B20if ( !ds.search(addr)) {ds.reset_search();delay(250);return;}if (OneWire::crc8(addr, 7) != addr[7]) {Serial.println("CRC is not valid!");return;}switch (addr[0]) {case 0x10://Serial.println("  Chip = DS18S20");  // or old DS1820type_s = 1;break;case 0x28://Serial.println("  Chip = DS18B20");type_s = 0;break;case 0x22:// Serial.println("  Chip = DS1822");type_s = 0;break;default:Serial.println("Device is not a DS18x20 family device.");return;} ds.reset();ds.select(addr);ds.write(0x44, 1);        // start conversion, with parasite power on at the end  delay(1000);     // maybe 750ms is enough, maybe notpresent = ds.reset();ds.select(addr);    ds.write(0xBE);         // Read Scratchpadfor ( i = 0; i < 9; i++) {           // we need 9 bytesdata[i] = ds.read();}int16_t raw = (data[1] << 8) | data[0];if (type_s) {raw = raw << 3; // 9 bit resolution defaultif (data[7] == 0x10) {// "count remain" gives full 12 bit resolutionraw = (raw & 0xFFF0) + 12 - data[6];}} else {byte cfg = (data[4] & 0x60);// at lower res, the low bits are undefined, so let's zero themif (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 mselse if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 mselse if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms default is 12 bit resolution, 750 ms conversion time}celsius = (float)raw / 16.0;fahrenheit = celsius * 1.8 + 32.0;tank_temp = celsius;//DHT11house_h = dht.readHumidity();house_t = dht.readTemperature();if (isnan(house_h) || isnan(house_t)){Serial.println("Failed to read from DHT sensor!");return;}//BH1750light_value = myBH1750.readLightLevel();//logicground_h = 1-digitalRead(GROUND_H);water = 1-digitalRead(WATER);Serial.printf("GROUND-WATER: %d,%d",ground_h,water);Serial.println("//");digitalWrite(WATER_MOTOR, 1-ground_h); //HIGH-OPEN ground h low  open water motordigitalWrite(O2_MOTOR, water);//no useif(light_value >= 50)pwm_value = 180;else if(light_value <= 20)pwm_value = 0;if((tank_temp>30) || (tank_temp<20)){digitalWrite(BEEP, 0); //low - beep}else digitalWrite(BEEP, 1);//MOTOR myservo.write(pwm_value);                  // set the servo position according to the scaled value  (value between 0 and 180)//LEDdigitalWrite(LED_BUILTIN, HIGH);delay(1000);digitalWrite(LED_BUILTIN, LOW);delay(1000);//OLEDu8g2.setFont(u8g2_font_unifont_t_chinese2);u8g2.clearBuffer(); //清除模组的缓存u8g2.setFont(u8g2_font_ncenB08_tr); // 设置字体u8g2.setCursor(0, 15);u8g2.printf("TEMP-WATER: %.2fC", tank_temp);u8g2.setCursor(0, 30);u8g2.printf("GOUND:%d WATER:%d",ground_h, water);u8g2.setCursor(0, 45);u8g2.printf("HOUSE-TH: %.1fC,%.1f%",house_t,house_h); u8g2.setCursor(0, 60);u8g2.printf("LIGHT-LUX: %.2fLux",light_value);u8g2.sendBuffer(); // 将缓存输出到屏幕
}

5、部分参考资料

#硬件原理图资料见资料包(下)

6、注意事项

#代码暂不包含nodemcu代码

完整可运行项目地址

技能梳理6@NODEMCU+BH1750+DS18B20+DHT11+PWM电机+ONENET相关推荐

  1. 技能梳理14@stm32+esp8266+ds18b20+红外传感器+烟雾传感器+CO传感器+蜂鸣器

    画板子,有至少8个io口(分别连ds18b20.红外传感器.烟雾传感器.CO传感器,后面3个传感器都是检测到就发高电平),2个串口,1个蜂鸣器,nbiot用的YED-C724 核心板(AIR724) ...

  2. 技能梳理3@NODEMCU+串口屏+随机抽签+物理按键

    串口屏抽签,类似抽奖,物理按键选中和清除,mcu是stm32 1.项目简介 2.实现逻辑 #屏幕页面放58个图标控件,每个图标控件上显示一个人名,控件下面位置再放一个控件,可在语数外物化生6个字(6个 ...

  3. 【业务建模_5】数据分析师技能梳理

    [业务建模_5]数据分析师技能梳理 大纲 1.固定报表提炼 产品侧 活动侧 重点功能侧 2.固有分析模块工具 事件+多维度 漏斗+多维度 留存+多维度 3.临时需求+SQL模板+临时报表 4.用户画像 ...

  4. 技能梳理37@stm32+按键+光耦+锁存+串行转并行+继电器

    技能梳理37@stm32+按键+光耦+锁存+串行转并行+继电器 1.项目简介 2.实现逻辑 3.应用场景 #主从机有线控制 #开关操作 4.核心代码梳理 //根据按下的按键执行相应的操作 void h ...

  5. 【51单片机学习】PWM电机调速

    简单的PWM电机调速--基于51单片机 (一)51单片机需要用到的寄存器 (二)PWM波的产生及调速原理 (三)电机调速的实现 (一)51单片机需要用到的寄存器 中断允许寄存器,详情可以看STC51单 ...

  6. 树莓派Pico直流电机接口技术及PWM电机调速控制MicroPython编程

    内容目录: 一.树莓派Pico开发板直流电机接口技术 1.H桥驱动电路的基本工作原理 2.典型H桥驱动电路分析 3.DRV8833双H桥电机驱动模块介绍 4.Pico开发板与直流电机接口 二.Pico ...

  7. STM32小车——PWM电机调速

    PWM电机调速(寄存器版) 我的上一篇博客已经写了如何用定时器产生PWM来实现LED灯的呼吸灯效果,当我想实现PWM来控制电机调速时,网上翻阅了很多的资料但是大多数是在呼吸灯的基础上改一下代码实现的, ...

  8. 初学树莓派——(九)DHT11数据传入ONENET

    目录 前言 DHT11实现本地温湿度监测 DHT11.py 接线图 效果图 温湿度数据上传至ONENET 新建产品 新建设备 ONENET.py 测试 Shell脚本配置 效果图 前言 本文分部分实现 ...

  9. 技能梳理1@树莓派3B+bh1750+震动+dht11+onenet+本地保存

    树莓派采集温湿度.震动传感器检测的声音.光照强度,并发送到云平台OneNET进行曲线绘制,保存传感器数据到树莓派本地 1.项目简介 2.实现逻辑 #通过i2c协议读取光照传感器bh1750检测的光照数 ...

最新文章

  1. 如何在Linux使用Eclipse + CDT开发C/C++程序? (OS) (Linux) (C/C++) (gcc) (g++)
  2. 共享资源的保护:锁机制
  3. Angular 页面元素的DOM级别的删除过程
  4. Java List<T>去重方法,引用类型集合去重
  5. android系统框架()
  6. Metasequoia 4 for Mac(3D建模)
  7. BZOJ4407 :于神之怒加强版
  8. 一些常用的前端基础操作
  9. C语言多文件编程详解
  10. 【Shopee干货】虾皮广告关键词选词技巧
  11. 一个简单的密码登陆界面。C语言
  12. 二次型对自变量向量的导数
  13. 用ArcMap打开MXD文件报One or more layers failed to draw错误!
  14. 评自主创新与自主实现
  15. HTML+CSS+JavaScript 实现登录注册页面(超炫酷)
  16. 2022 国际培训产品博览会--第十一届,2022.11.17-19日,深圳
  17. matlab灰关联度,[转载]灰色关联和加权关联分析法matlab程序
  18. -source 1.5 中不支持 diamond 运算符 [ERROR] (请使用 -source 7 或更高版本以启用 diamond 运算符)
  19. cocos2dx 常用的基本功能
  20. [JAVA毕业设计]服装连锁店后台管理系统源码获取和系统演示

热门文章

  1. JAVA房产中介预约看房系统毕业设计 开题报告
  2. 遇到bug我们如何分析定位?
  3. 扫描识别工具Dynamic Web TWAIN使用教程:如何自定义Web TWAIN对象
  4. YOLOv5的Tricks | 【Trick11】在线模型训练可视化工具wandb(Weights Biases)
  5. 运放放大倍数计算公式_放大器设计100问
  6. 锁存器Latch和触发器Flip-flop的区别
  7. 计算机主机突然断电有什么影响吗,断电对电脑硬件会产生哪些影响
  8. Illustrator绘制时尚的圣诞老人插画教程
  9. Avoid adding reactive properties to a Vue instance or its root $data at runtime - declare it upfront
  10. 我奋斗了18年不是为了和你壹起喝咖啡