一、准备物品

1. 树莓派ZeroWH(针脚焊接) (100元)

2. DC电池盒(2节装)(1元)

3. 18650锂电池2节(10元)

4. 小水泵(3元)

5. 继电器(3元)

6. 红外避障传感器(2元)

7. 多路DC-DC电压转换模块电源 12V转3.3/5/12V(2元)

8. 杜邦线若干(10元)

9. 斐讯N1小LINUX服务器(100元)

二、总体设计

三、硬件接线

树莓派ZeroWH 红外避障传感器 继电器 多路DC-DC电压转换模块电源
BCM18 VIN
BCM23 OUT
GND GND
红外避障传感器 多路DC-DC电压转换模块电源
V3.3 V3.3
GND GND
继电器 多路DC-DC电压转换模块电源
V3.3 V3.3
GND GND
继电器 水泵 多路DC-DC电压转换模块电源
COM 5V
NO 5V
GND GND

四、程序代码

4.1 服务器代码

CREATE TABLE IF NOT EXISTS `warter_log` (
`id` int(11) NOT NULL,`warter_time` datetime NOT NULL DEFAULT current_timestamp()
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
const Koa    = require("koa");
const serve  = require("koa-static");
const router = require("koa-router")();const app = new Koa();var knex = require('knex')({client: 'mysql',connection: {host : 'xxx',port :  3360,user : 'root',password : 'xxx',database : 'cjy'},debug: true,pool: {min: 0,max: 3,},acquireConnectionTimeout: 10000,
});app.use(serve(__dirname + "/webroot"));router.get('/t', async (ctx, next) => {ctx.response.body = "hello world!";
})//添加取水记录
router.get('/warter_count', async (ctx, next) => {try{itemList = await knex('warter_log').insert({})ctx.response.body = itemList;}catch(e){console.log(e);}
})//获取取水时间记录列表
router.get('/warter_logs', async (ctx, next) => {try{let itemList = await knex.select('*').from('warter_log').orderBy([{ column: 'id', order: 'desc' }]);ctx.response.body = itemList;}catch(e){console.log(e);}
})app.use(router.routes());
app.listen(6060);

4.2 树莓派ZeroWH代码

#!/usr/bin/python3
# encoding:utf-8
import RPi.GPIO as GPIO
import asyncio
import aiohttpclass cjy_automatic_water_dispenser:def __init__(self, loop=None):self._queue  = asyncio.Queue(loop=loop)self._future = asyncio.Future(loop=loop)#提交自动饮水时间记录async def upload_action(self):print("upload_action start")upload_url = 'http://cwn1.f3322.net:6060/warter_count'while True:try:r = await  asyncio.wait_for(self._queue.get(), timeout=1.0)async with aiohttp.ClientSession() as session:async with session.get('http://python.org') as response:print("Status:", response.status)print("Content-type:", response.headers['content-type'])html = await response.text()print("Body:", html[:15], "...")# r = await self._queue.get()print('consumer value>>>>>>>>>>>>>>>>>>', r)except asyncio.TimeoutError as e1:print('get value timeout')continueexcept Exception as e2:print(e2)breakprint('quit')#自动饮水服务async def main(self):print("main start")#放水计数v = 0#接水位置最后一次水杯状态:1--存在水杯,0--不存在水杯zb_state = 0#树莓派ZeroWH采用BCM模式定义引脚GPIO.setmode(GPIO.BCM)#红外传感器检测是否有水杯的数字引脚pin_avoid_obstacle=23#连接水泵的继电器控制引脚pin_reply = 18#设置红外传感器连接引脚为上拉电阻,数字信号输入模式GPIO.setup(pin_avoid_obstacle, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)#设置水泵继电器连接引脚,数字信号输出模式GPIO.setup(pin_reply, GPIO.OUT)#每隔0.5秒检测一次红外探头检测范围内是否放置了物体while True:status = GPIO.input(pin_avoid_obstacle)if status == 1:print('红外避障模组【没有检测到】障碍物纸杯')zb_state = 0#设置水泵处于关闭状态GPIO.output(pin_reply, GPIO.HIGH)else:print('红外避障模组【检测到】障碍物纸杯')if zb_state == 0:zb_state = 1print("自动出水【开始】")#打开水泵,控制引脚低电平时打开GPIO.output(pin_reply, GPIO.LOW)#水泵放水0.5秒 await asyncio.sleep(0.5)#关闭水泵,控制引脚高电平时关闭GPIO.output(pin_reply, GPIO.HIGH)print("自动出水【结束】")print('add value to queue:',str(v))await self._queue.put(v)v = v + 1else:pass#休眠0.5秒await asyncio.sleep(0.5)async def run(self):asyncio.ensure_future(self.main())asyncio.ensure_future(self.upload_action())if __name__ == '__main__':loop = asyncio.get_event_loop()cawd = cjy_automatic_water_dispenser(loop=loop)#将自动饮水服务加入协程asyncio.ensure_future(cawd.run())#进入事件循环try:loop.run_forever()except KeyboardInterrupt as e:print(asyncio.Task.all_tasks())for task in asyncio.Task.all_tasks():print(task.cancel())loop.stop()loop.run_forever()finally:loop.close()#清除树莓派所有引脚状态GPIO.cleanup()

五、成果展示


六、关键技术小代码

6.1 协程入门(python3.7+)

import asyncioasync def main():print('Hello ...')await asyncio.sleep(1)print('... World!')# Python 3.7+
asyncio.run(main())

6.2 生产者消费者模型(python3.7+)

import asyncioclass Test(object):def __init__(self, loop=None):self._queue = asyncio.Queue(loop=loop)self._future = asyncio.Future(loop=loop)async def _producer(self, interval):v = 0while True:await asyncio.sleep(interval)print('add value to queue:',str(v))await self._queue.put(v)v = v + 1async def _consumer(self):while True:try:r =await  asyncio.wait_for(self._queue.get(), timeout=1.0)# r = await self._queue.get()print('consumer value>>>>>>>>>>>>>>>>>>', r)except asyncio.TimeoutError:print('get value timeout')continueexcept:breakprint('quit')async def run(self):asyncio.ensure_future(self._producer(2))asyncio.ensure_future(self._consumer())if __name__ == '__main__': loop = asyncio.get_event_loop()t = Test(loop=loop)asyncio.ensure_future(t.run())try:loop.run_forever()except KeyboardInterrupt as e:print(asyncio.Task.all_tasks())for task in asyncio.Task.all_tasks():print(task.cancel())loop.stop()loop.run_forever()finally:loop.close()

6.3 水泵继电器代码(python3+)

import RPi.GPIO as GPIO
import timeif __name__ == '__main__': GPIO.setmode(GPIO.BCM)pin_reply = 23GPIO.setup(pin_reply, GPIO.OUT)#水泵放水3秒GPIO.output(pin_reply, GPIO.HIGH)time.sleep(3)GPIO.output(pin_reply, GPIO.LOW)GPIO.cleanup()

6.4 红外障碍检测代码(python3+)

import RPi.GPIO as GPIO
import timeif __name__ == '__main__': pin_avoid_obstacle=18GPIO.setmode(GPIO.BCM)GPIO.setup(pin_avoid_obstacle, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)try:while True:status = GPIO.input(pin_avoid_obstacle)if status == 1:print('我是红外避障模组,没有检测到障碍物,一切正常!')else:print('我是红外避障模组,检测到障碍物,注意停车')time.sleep(0.5)except KeyboradInterrupt:GPIO.cleanup()

6.5 HTTP客户端请求

import aiohttp
import asyncioasync def main():async with aiohttp.ClientSession() as session:async with session.get('http://python.org') as response:print("Status:", response.status)print("Content-type:", response.headers['content-type'])html = await response.text()print("Body:", html[:15], "...")loop = asyncio.get_event_loop()
loop.run_until_complete(main())

树莓派自动饮水机编程示例相关推荐

  1. 树莓派python编程读取电压_《树莓派Python编程指南》——3.2 在结构体中存储值-阿里云开发者社区...

    本节书摘来自华章计算机<树莓派Python编程指南>一书中的第3章,第3.2节,作者:(美) Alex Bradbury Ben Everard更多章节内容可以访问云栖社区"华章 ...

  2. 07 树莓派裸机编程,并在Windows MSYS2 QEMU模拟器中运行

    作者 将狼才鲸 创建日期 2022-11-14 Gitee源码和工程地址:才鲸嵌入式 / 开源安防摄像机(嵌入式软件) CSDN文章地址:项目介绍:开源安防摄像机(嵌入式软件) 4)完整的环境安装步骤 ...

  3. 树莓派 学习编程_为什么要学习在树莓派上编程

    树莓派 学习编程 In this article "Java vs Python - Which Programming Language Should Programmer Learn F ...

  4. C语言与OpenCL的编程示例比较

    C语言与OpenCL的编程示例比较 OpenCL支持数据并行,任务并行编程,同时支持两种模式的混合.对于同步 OpenCL支持同一工作组内工作项的同步和命令队列中处于同一个上下文中的 命令的同步. 在 ...

  5. 《树莓派Python编程指南》——2.2 一个Python游戏:猫和老鼠

    本节书摘来自华章计算机<树莓派Python编程指南>一书中的第2章,第2.2节,作者:(美) Alex Bradbury Ben Everard更多章节内容可以访问云栖社区"华章 ...

  6. 《树莓派Python编程指南》—— 1.3 树莓派快速指南

    本节书摘来自华章计算机<树莓派Python编程指南>一书中的第1章,第1.3节,作者:(美) Alex Bradbury Ben Everard更多章节内容可以访问云栖社区"华章 ...

  7. 《树莓派Python编程指南》——2.3 小结

    本节书摘来自华章计算机<树莓派Python编程指南>一书中的第2章,第2.3节,作者:(美) Alex Bradbury Ben Everard更多章节内容可以访问云栖社区"华章 ...

  8. 《树莓派Python编程入门与实战》——3.5 关于Python交互式shell

    本节书摘来异步社区<树莓派Python编程入门与实战>一书中的第3章,第3.5节,作者:[美]Richard Blum,更多章节内容可以访问云栖社区"异步社区"公众号查 ...

  9. 《树莓派Python编程入门与实战(第2版)》——3.9 小结

    本节书摘来自异步社区<树莓派Python编程入门与实战(第2版)>一书中的第3章,第3.9节,作者[美] Richard Blum Christine Bresnahan,陈晓明 马立新 ...

  10. Win32 API 多线程编程示例 - 窗口版

    网上有一些Win32 多线程编程示例,多是控制台版本:下面哥作一个窗口版本: /*-------------------------------------------------bobo, 2020 ...

最新文章

  1. 栈区和堆区内存分配区别
  2. Windows2012使用笔记
  3. Java 容器之Hashset 详解.
  4. [BUUCTF-pwn]——[Black Watch 入群题]PWN
  5. 为啥一到年底腾讯市值就大涨??????
  6. 谷歌+安卓,他已经改变了世界两次,但还想多来几次
  7. Matlab中diag函数注意事项
  8. 显著性测试(Friedman test, Post-hoc Nimenyi test以及可视化)
  9. JanusGraph安装和配置教程
  10. 微信小程序例子——点击发送信息清空输入框
  11. CentOS 8 下载安装stress实际操作以及实际应用,以及遇到的问题
  12. 【来龙去脉系列】机器学习入门必读
  13. android 解决微信登录白屏样式问题
  14. polplayer下载网址和polplayer直播源
  15. HTML---下拉框、列表框使用详解(select 与 option)
  16. 【如何开发小程序】自己如何开发小程序?
  17. 通用SSM项目环境搭建详细教程
  18. 联邦学习 Federated Learning 相关资料整理
  19. P1309 [NOIP2011 普及组] 瑞士轮
  20. Empirical Covariance 经验协方差 sklearn

热门文章

  1. C语言if( x)的意思,c语言中if(x)是什么意思?_后端开发
  2. 【UE4】使用UMG创建UI,了解内部机制及相应优化方法
  3. 苹果执行请求时出错_苹果执行请求时出错
  4. 26个字母的html代码多少,标准的26个字母的读法 二十六个汉语拼音字母怎么读才算正确...
  5. Storm-kafka【接口实现】4 - KafkaSpout
  6. 尚德机构COO杜铮:在线教育进入下半场 释放供给侧红利成关键
  7. Power BI----到底什么是度量值?
  8. Unity3D坦克大战(附代码和原理讲解)
  9. android ios9 rom,谁说安卓不如苹果?看Android7.0如何逆袭iOS9.3
  10. php7 pecl安装,PHP7安装pecl:memcached扩展