1. 认识元器件

图片

  • 主控板可以通过USB线跟电脑连接,从而将电脑上编写的程序传输到主控板中运行;可以连接各类传感器以便收集数据和发送控制指令;可以连接WIFI从而实现远程控制。我们所用的主板叫做esp8266.

  • 扩展板用于将核心主控板和其他传感器连接在一起,按照板子表面的位置示意图正确安装即可。

  • 显示屏是用于显示文字的,可以通过编程给它发送我们自己编写的文字,想显示什么就显示什么。

  • RGB LED灯跟我们主控板上自带的小灯是有区别的,主控板上自带的灯只有一种颜色,而这个RGB灯可以通过编程实现各种颜色,原理就是它是由R Red红色 G Green绿色 B Blue蓝色这三个电子世界的三原色构成的。具体编程方式我们后面再讲。

  • 温湿度传感器可以收集空气中温度和湿度。 植物只有在一定的温度范围内才能够健康生长。温度对生长的影响是综合的,它既可以通过影响光合作用、呼吸、蒸腾等代谢过程,也可以通过影响有机物的合成和运输等代谢过程来影响植物的生长。 空气湿度影响蒸腾作用,蒸腾作用除了是水分吸收的动力,还是矿质营养运输的动力。空气湿度大,蒸腾作用弱,植物运输矿质营养的能力就下降。空气湿度长期过低,会造成叶片内部水汽供应不足而坏死。另外空气湿度过大或过小都会导致气孔关闭,CO2不能进入叶肉细胞,光合作用就会减慢甚至停止。 通过编程我们可以从它这里获取到温湿度,从而发送给显示屏进行显示或者发送到我们的手机上面,这样我们就可以对它进行监控,发现异常的时候及时地采取防治措施。

  • 土壤湿度传感器可以检测土壤湿度,也就是土壤的含水量。土壤湿度过低将形成土壤干旱,降低光合作用效率,影响作物的产量和品质。严重缺水甚至会导致作物凋萎和死亡。土壤湿度过高会恶化土壤通气性,影响土壤微生物的活动,使作物根系的呼吸、生长等生命活动受到阻碍,从而影响作物地上部分的正常生长,造成徒长、倒伏、病害滋生等。 土壤湿度数值参考

图片

注1:不同土壤介质的测量值会存在差异。土壤中的水分存在分布不均匀的情况,数据仅能代表局部湿度。
注2:传感器顶部的塑料部分不防水,请勿将传感器整个埋入土中。
原理介绍:
土壤中的水分含量能改变土壤的电阻率,通常来说土壤中的含水量越高,导电能力就越强。土壤湿度传感器的金属片在插入土壤中时,能充分接触到土壤,检测到电阻率的改变,并转化成电信号。所以使用的时候需要将传感器跟转化模块连接在一起。
  • 水泵的作用是将水杯等容器中的水抽出来经由水管运送到花盘中。该水泵采用直流小电机,使用简单,直接将接口线安装到电池对应正负极即可启动,注意红线是电机正极,黑线是电机负极,不要接反哦。
  • USB数据线用于连接电脑和控制主板,将电脑中编写的程序传输至控制主板中运行。
  • 亚克力板可以将组装好的扩展板安装到一起,形成一个具有透明外壳保护的智能浇水神器。

2. 组装过程

图片

组装示意图如上,具体步骤如下:

  1. 安装主板,注意带有充电口的一端跟扩展板上的充电口标志保持一致;
  2. 安装RGB LED灯,注意将灯上的GND引脚接到板子上的负极(-);
  3. 安装温湿度传感器,注意将传感器上的GND引脚接到板子的负极(-),VCC引脚接到板子的正极(+);
  4. 安装显示器模块,注意将显示器的VCC引脚接到板子的正极(+),GND引脚接到板子的负极(-);
  5. 安装水泵,注意水泵的红线接板子上的正极(+),黑线接板子的负极(-);
  6. 安装土壤湿度传感器,注意先将传感器跟数模转换器连接在一起,无极性区别,然后将数模转换器插入到主板上,注意VCC引脚接到板子的正极(+),GND引脚接到板子的负极(-);
  7. 用透明亚力克板将扩展板固定住;
  8. 将土壤传感器插入花盆中,水泵放入水杯中,水管放入盆栽中;

3. 认识编程软件

为了实现对主板进行编程,我们需要往主板内安装一下Python的精简版本:MicroPython,具体做法为:安装uPyCraft软件,然后烧录micropython到esp8266.

  1. esp8266通过usb连接到电脑上
  2. 下载uPyCraft软件
  3. 安装uPyCrafat, 会弹出一个安装字库的提示,同意并安装 图片
  4. 安装完成后进入软件的界面,选择对应的端口号 图片
  5. 在弹出框如下图勾选 图片
  6. 等待安装完 图片
  7. 点击右侧的连接按钮,出现如下图的三箭头符号,就表示esp8266上的micropython环境已经安装完成 图片

4. 编程控制指示灯

接下来我们会学习如何编程控制套装中的两种灯,一种是主板上自带的蓝色的小灯,它只能控制亮和灭,无法控制颜色;另一种是RGB LED灯,这种灯由red红色green绿色blue蓝色三种颜色混合而成,我们可以通过编程来分别设定红绿蓝的大小,从而组合成各种各样的颜色。

板载灯控制

主板上的小灯我们可以通过编程控制引脚2,当把引脚2设定成1时灯就亮起来了;设定成0时灯就灭掉了;结合time模块中sleep延时的功能,我们就可以做出循环闪烁的效果啦,代码如下:

import time  #导入time模块
from machine import Pin  #导入引脚模块

led=Pin(2, Pin.OUT) #将led引脚定义为输出

while True:
  led.value(1)      #点亮led
  time.sleep(2)
  led.value(0)      #熄灭led
  time.sleep(2)

RGB LED灯控制

RGB LED灯跟板载小灯不同,它不止是可以控制亮和灭,还可以通过控制数值大小来实现不同的颜色,要实现这个功能我们需要用到一个叫PWM的模块,把引脚设定成PWM模块后就可以给引脚设定不同大小的数字了,而不仅仅是0和1.在RGB颜色的控制中,每种颜色red/green/blue可以设定的大小范围是0~255,接下来我们试一下设定成全是0和全是255的效果:

import time
from machine import Pin,PWM

red = PWM(Pin(12)) #红色对应引脚12,设定为PWM模式
green = PWM(Pin(2))
blue = PWM(Pin(0))

for i in range(10):
  red.duty(0) #红色引脚设定为0
  green.duty(0)
  blue.duty(0)

  time.sleep(2) #延时秒

  red.duty(255) #红色引脚设定为255
  green.duty(255)
  blue.duty(255)

  time.sleep(2)

当然你也可以设定成其他颜色试试,可以点击这个网址查询:RGB颜色对照表在新窗口打开

5. 编程控制显示屏

接下来我们学习如何编程控制套装中的显示屏,这个显示屏的全称是OLED SSD1306显示屏,OLED是它的工作原理,不用深究,SSD1306是它的型号,这个要留意一下,只有跟型号对应的模块才能驱动屏幕正确显示。对于喜欢从网上找代码然后改编的同学要注意了,一定要找对代码才可以,不是所有控制屏幕的代码都适用于我们这个SSD1306的。

我们先来实现基本的文本显示的功能,然后逐步增加难度让显示屏显示更加丰富的内容,代码如下:

from machine import Pin, I2C
import ssd1306 #SSD1306对应的模块默认是没有烧录到固件的,所以需要手工烧录到主板中,具体操作就是将ssd1306.py拖到device文件夹中,之后其他外部模块也是同样的操作

i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000) #设定引脚5和4用于通信
oled=ssd1306.SSD1306_I2C(128,64,i2c)           #初始化oled屏幕,其中128,64是屏幕的宽和高

oled.text("Hello World", 2, 0)    #text函数的三个参数:内容,x坐标,y坐标,注意屏幕左上方的x,y坐标是0,越往右x坐标越大,做往下y坐标越大
oled.text("Hello Mr.Hou", 2, 20)
oled.show()    #将上面设置的内容显示在屏幕上

6. 获取空气温湿度

接下来我们学习如何编程把传感器测量的数据收集到主板中进行处理,比如空气温湿度传感器、土壤湿度传感器,然后更进一步可以基于这些数据进行条件判断,从而针对不同情况做出不同的反应,也就一步步实现了智慧农业。首先我们来学习如何获取空气的温度和湿度,代码如下:

from machine import Pin, I2C
import ssd1306
import dht  #导入空气温湿度传感器模块
import time

i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000) 
oled=ssd1306.SSD1306_I2C(128,64,i2c)         
dht11 = dht.DHT11(Pin(14))  #我们的空气温湿度安装在引脚14,设定后才能读取数据

while True:
  dht11.measure()  #测量空气温湿度
  oled.fill(0)
  oled.text("temperature:"+str(dht11.temperature())+"C", 2, 0)  #取出测量出的温度
  oled.text("humidity:"+str(dht11.humidity()), 2, 20)       #取出测量出的湿度
  oled.show()
  time.sleep(2)

7. 获取土壤湿度

获取土壤湿度的功能也是比较简单的,需要导入一个ADC的模块,通过它能够把引脚中的数据读取到主板中进行处理,代码如下:

from machine import ADC, I2C #ADC模块可以读取模拟量
import ssd1306

i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000) 
oled=ssd1306.SSD1306_I2C(128,64,i2c)         
soil = ADC(0) #我们的土壤传感器安装在引脚0,所以需要设定成0才能读取到数据

while True:
  oled.fill(0)
  oled.text("humidity:"+str(soil.read()), 2, 20) #调用read函数实现读取传感器数据
  oled.show()
  time.sleep(3)

8. 控制水泵

控制水泵的功能跟控制板载LED小灯有点像,设定成1水泵开启,设定成0水泵关闭,代码如下:

import time
from machine import Pin

pump=Pin(13, Pin.OUT) #我们的水泵是连接在引脚13

while True:
  pump.value(1)      #开启
  time.sleep(2)
  pump.value(0)      #关闭
  time.sleep(2)

9. 认识一起植物小程序

待补充

10. 远程浇花完整项目

待补充

11. 扩展项目

11.1 LED七彩灯

既然我们能够设定成各种颜色,配合上延时和循环我们就能够实现彩虹7种颜色不断切换的效果,代码如下:

import time
from machine import Pin,PWM

red = PWM(Pin(12))
green = PWM(Pin(2))
blue = PWM(Pin(0))

while True:
  #赤
  red.duty(255)
  green.duty(0)
  blue.duty(0)

  time.sleep(1)
  
  #关灯
  red.duty(0)
  green.duty(0)
  blue.duty(0)
  
  time.sleep(1)

  #橙
  red.duty(255)
  green.duty(165)
  blue.duty(0)

  time.sleep(1)
  
  #关灯
  red.duty(0)
  green.duty(0)
  blue.duty(0)
  
  time.sleep(1)
  
  #黄
  red.duty(255)
  green.duty(255)
  blue.duty(0)

  time.sleep(1)
  
  #关灯
  red.duty(0)
  green.duty(0)
  blue.duty(0)
  
  time.sleep(1)
  
  #绿
  red.duty(0)
  green.duty(255)
  blue.duty(0)

  time.sleep(1)
  
  #关灯
  red.duty(0)
  green.duty(0)
  blue.duty(0)
  
  time.sleep(1)
  
  #青
  red.duty(0)
  green.duty(255)
  blue.duty(255)

  time.sleep(1)
  
  #关灯
  red.duty(0)
  green.duty(0)
  blue.duty(0)
  
  time.sleep(1)
  
  #蓝
  red.duty(0)
  green.duty(0)
  blue.duty(255)

  time.sleep(1)
  
  #关灯
  red.duty(0)
  green.duty(0)
  blue.duty(0)
  
  time.sleep(1)
  
  #紫
  red.duty(128)
  green.duty(0)
  blue.duty(128)

  time.sleep(1)
  
  #关灯
  red.duty(0)
  green.duty(0)
  blue.duty(0)
  
  time.sleep(1)

11.2 LED随机颜色

配合上随机数模块,我们还能实现随时颜色不断切换的功能,有可能出现特别好看的颜色哦。不过值得注意的是MicroPython中用的随机数模块跟Python中的随机数模块用法还是有些不同的,代码如下:

import time
from machine import Pin,PWM
import urandom

red = PWM(Pin(12))
green = PWM(Pin(2))
blue = PWM(Pin(0))

while True:
  #随机颜色
  red.duty(urandom.getrandbits(8))
  green.duty(urandom.getrandbits(8))
  blue.duty(urandom.getrandbits(8))
  time.sleep(1)
  
  #关灯
  red.duty(0)
  green.duty(0)
  blue.duty(0)
  
  time.sleep(1)

11.3 显示屏显示动态文字

居然我们可以设定文字的位置,那么如果我不断改变文字的坐标,那文字不就动起来了吗?!是的,原理就是这么简单,代码如下:

from machine import Pin, I2C
import ssd1306

i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000) 
oled=ssd1306.SSD1306_I2C(128,64,i2c)            

pos = -100  #通过这个变量控制文字的x坐标,初始设定为-100,思考下为什么?设定成0试一下

while True:
  oled.fill(0) #清除屏幕原有内容
  oled.text("Hello World", pos, 20)
  oled.show()
  pos = pos + 5
  if pos >= 128:
    pos = -100

11.4 显示屏显示表情

绘制表情的方法有好几种,今天我们采用比较简单易懂的方式:通过绘制不同的图形来组合成一幅表情。其中要用到绘制空心圆、实心圆以及直线的功能。代码如下:

from machine import Pin, I2C
import ssd1306,gfx #gfx模块用于绘制图形,需要手工烧录到主板中
import time

i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000) 
oled=ssd1306.SSD1306_I2C(128,64,i2c)           

pen = gfx.GFX(128,64, oled.pixel) #初始化绘制模块,起名叫画笔

for i in range(5):
  oled.fill(0)

  pen.circle(60, 30, 30, 1)       #画一个圆心为(60,30),半径为30的空心圆,最后一个参数为线的颜色:1为白色0为黑色
  pen.fill_circle(50, 20, 5, 1)   #画一个实心圆
  pen.fill_circle(70, 20, 5, 1)
  pen.line(50, 40, 70, 40, 1)     #画一条起点为(50,40),终点为(70,40)的直线

  oled.show()
  
  time.sleep(0.1)
  
  oled.fill(0)

  pen.circle(60, 30, 30, 1)
  pen.circle(50, 20, 5, 1)
  pen.circle(70, 20, 5, 1)
  pen.line(50, 40, 70, 40, 1)

  oled.show()
  
  time.sleep(0.1)


oled.fill(0)

pen.circle(60, 30, 30, 1)
pen.fill_circle(50, 20, 5, 1)
pen.fill_circle(70, 20, 5, 1)
pen.line(50, 35, 60, 40, 1)
pen.line(60, 40, 70, 35, 1)

oled.show()

11.5 显示屏显示网络时钟

我们使用的主板esp8266是可以连接上wifi的,再配合上显示屏是可以做出来很多有趣的作品的,比如从网络上获取天气预报显示到屏幕上、从网络上获取笑话大全显示到屏幕上等等,当然这些功能需要掌握的其他方面的知识也很多。今天我们先来学习一个基础的显示网络时钟的功能,代码如下:

from machine import Pin, I2C, RTC
import ssd1306
import network  #联网模块
import ntptime  #获取网络时钟模块
import time

ssid="erbao_EX"           #修改为你的WiFi名字
passwd="kaola123@BGY"     #修改为你的WiFi密码

wlan=network.WLAN(network.STA_IF)                        #创建一个wlan对象
wlan.active(True)                                        #激活网络接口
wlan.disconnect()                                        #断开上次的WiFi连接
wlan.connect(ssid,passwd)                                #连接WiFi
while(wlan.ifconfig()[0] == '0.0.0.0'):
  print(".")
  time.sleep(1)
  
i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000) 
oled=ssd1306.SSD1306_I2C(128,64,i2c)            

ntptime.NTP_DELTA = 3155644800   # 可选 UTC+8偏移时间(秒),不设置就是UTC0
ntptime.host = 'ntp1.aliyun.com'  # 可选,ntp服务器,默认是"pool.ntp.org"
ntptime.settime()   # 修改设备时间,到这就已经设置好了
rtc = RTC()
#print(rtc.datetime())

while True:
  now = rtc.datetime()  # 获取网络时间
  date = str('Date:'+str(now[0])+':'+str(now[1])+':'+str(now[2]))
  time2 = str('Time:'+str(now[4])+':'+str(now[5])+':'+str(now[6]))
  
  oled.fill(0)
  oled.text(date, 2, 10)
  oled.text(time2, 2, 30)
  oled.show()
  time.sleep(1)

11.6 异常警示智能灯

在这个案例中我们将各类传感器和其他元器件综合利用起来做一个作品,实现智能警示的功能:当温度正常时,LED显示正常的绿色,屏幕显示正常的表情;当温度高于设定的值时,LED灯显示为警报的红色,同时屏幕显示痛苦的表情。代码如下:

from machine import Pin,I2C,PWM
import ssd1306,gfx
import dht

i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000) 
oled=ssd1306.SSD1306_I2C(128,64,i2c)  
pen = gfx.GFX(128,64, oled.pixel)
dht11 = dht.DHT11(Pin(14))

red = PWM(Pin(12))
green = PWM(Pin(2))
blue = PWM(Pin(0))

while True:
  dht11.measure()
  
  temp = dht11.temperature()
  
  if temp < 33: #根据不同的植物情况设定不同的温度报警值
    oled.fill(0)

    oled.text("temperature:"+str(temp), 2, 0)
    pen.circle(60, 30, 30, 1)
    pen.fill_circle(50, 20, 5, 1)
    pen.fill_circle(70, 20, 5, 1)
    pen.line(50, 35, 60, 40, 1)
    pen.line(60, 40, 70, 35, 1)

    oled.show()
    
    red.duty(0)
    green.duty(255)
    blue.duty(0)
  else:
    
    oled.fill(0)

    oled.text("temperature:"+str(temp), 2, 0)
    pen.circle(60, 30, 30, 1)
    pen.fill_circle(50, 20, 5, 1)
    pen.fill_circle(70, 20, 5, 1)
    pen.line(50, 40, 60, 35, 1)
    pen.line(60, 35, 70, 40, 1)

    oled.show()
    
    red.duty(255)
    green.duty(0)
    blue.duty(0)
  
  time.sleep(2)

11.7 自动浇水

在这个案例中我们将通过监控土壤的湿度实现在干旱时自动浇水的功能。代码如下:

from machine import Pin,ADC

soil = ADC(0)
pump=Pin(13, Pin.OUT)


while True:
  
  soil_data = soil.read()
  
  if soil_data > 500 and soil_data != 1024: #1024是没有安装好土壤湿度传感器时候的异常值
    pump.value(1)      #开启
  else:
    pump.value(0)      #开启
  
  time.sleep(2)

你能完善这个程序,把空气温湿度和土壤湿度等信息显示在屏幕上,同时让LED灯配合水泵的开启和关闭亮起不同的灯光?大胆试试吧!

Last Updated:
Contributors: aibokalv