智能门铃助理 — ESPBell

ESPBell是一个基于ESP12F模块的智能门铃项目。它使用ESPBell-Lite开发板,该开发板包含ESP8266芯片、摄像头、扬声器和麦克风。https://mp.weixin.qq.com/cgi-bin/readtemplate?t=tmpl/video_tmpl&vid=wxv_3251263471233613825

功能包括:

  • 实时视频传输
  • 双向语音通话
  • 人体检测
  • 触摸按钮
  • 远程控制

使用方法如下:

  1. 下载项目代码并安装依赖项。
  2. 将ESPBell-LITE开发板连接到电脑。
  3. 编译并烧录代码到开发板。
  4. 按照说明配置 Wi-Fi 连接。

优势包括:

  • 使用ESP8266芯片,具有较高的性能和低功耗。
  • 集成了摄像头、扬声器和麦克风,可实现实时视频传输、双向语音通话和人体检测等功能。
  • 支持触摸按钮和远程控制,使用方便。

不足之处包括:

  • 开发板的价格相对较高。
  • 视频传输的质量受网络环境的影响。

总体而言,该项目是一个功能强大且易于使用的智能门铃项目。它适合家庭、办公室和其他场所使用。

以下是该项目的部分亮点:

  • 使用ESP8266芯片,具有较高的性能和低功耗,可满足实时视频传输、双向语音通话和人体检测等功能的需求。
  • 集成了摄像头、扬声器和麦克风,可实现丰富的功能。
  • 支持触摸按钮和远程控制,使用方便。

该项目具有良好的开发潜力,可以进一步扩展功能,例如:

  • 添加更多传感器,例如 PIR 传感器、门磁传感器等,实现更智能的功能。
  • 支持云端存储,实现视频录像和回放。
  • 支持 AI 识别,实现人脸识别、车辆识别等功能。

源代码:

https://github.com/IoToutpost/ESPBell-LITE
https://file.daihuo.qq.com/mp_cps_goods_card/v57/index.html

用树莓派Pico W做蓝牙遥控车

不然树莓派Pico W刚放出来那会,官方只对Wi-Fi做了支持,并未启用蓝牙功能。但这个小片片上有英飞凌的CYW43439无线模块,蓝牙、Wi-Fi都支持的。

经过漫长的等待,2023年6月,官方终于腾出手让这小片片功能全部释放。

你现在不需要再外接HC-05等其它模块,只需要原来的一片Pico W,就可以通过C语言或MicroPython来启用蓝牙了。

蓝牙在嵌入式领域有多重要,多好使,估计物联网和应用电子的从业者能跟你讲半天。

这次就让Kevin McAleer这位树莓派Pico W老粉,用MicroPython编程来给大家实践一下。

从蓝牙基础,一直跟你讲到蓝牙控制小车。深入浅出,精打实招。

https://mp.weixin.qq.com/s/EZic0V6Uba93gPiqRdGTBg

相关代码:

https://github.com/IoToutpost/pico_ble_remote

用树莓派Pico和气体传感器保护厨房

当你在厨房烹饪食物,又跑去刷剧,玩游戏,取快递……

食物正在加热,没人看着,锅烧焦了怎么办?着火了怎么办?

无人看管的烹饪是迄今为止厨房火灾的主要原因。

你可能需要有个东西来帮你盯一下。

这个小东西主要是由树莓派Pico和传感器构成的。

先说开发板,虽然该项目是基于Raspberry Pi Pico构建的,但你可以使用任何与RP2040兼容的电路板创建它。

该项目中使用的Grove-HCHO传感器可检测空气VOCs(挥发性有机化合物)的气体浓度。比如:甲醛和苯。

相关链接:

https://wiki.seeedstudio.com/Grove-HCHO_Sensor/

它是如何工作的?

通过在Raspberry Pi Pico上运行Edge Impulse的Sensor Fusion软件,它可以从气体,温度和湿度传感器读取数据。然后数据通过神经网络模型计算,会判断当前的厨房是否处于安全状态。

是的,要更准确的判断厨房安全状态,你需要更多传感器配合。

Edge Impulse相关链接:

https://studio.edgeimpulse.com/

这里有相关视频来引导你完成软件下载、设置和部署。如果你有兴趣构建自己的厨房监视器,可以照着完成。

经过AI训练,它可以检测厨房的三种状态:空闲,正常烹饪和非正常燃烧。

隐藏在炉子上方风扇罩中的传感器

除了烹饪,从新房子到新家具,也都会存在危害健康的挥发性有机化合物(比如甲醛)。如果你在家里检测到高浓度的挥发性有机化合物,那么你要尽快通风来保证安全。

相关链接:

用Phew在Pico W上构建登录系统

Home Assistant 加 Pico W 改进车库门

树莓派Pico如何用好定时器

在树莓派Pico上跑BASIC程序

Pico SDK — 树莓派Pico起步

树莓派Pico W控制玩具车

树莓派Pico怎么接DHT11温湿度传感器

树莓派Pico W迷你火星车

用Arduino IDE给Pico W开发应用

树莓派Pico上跑TinyML音频分类

用Rust语言来开发树莓派Pico

树莓派Pico的CircuitPython入门

用Pico W做个手机遥控的车库门

太阳能驱动的Pico W在线气象站

Pico W搭网站并显示访问者IP

通过MicroPython控制Pico W上的板载LED

基于树莓派Pico的机器学习

在树莓派Pico上运行“毁灭战士”

用树莓派Pico制作的无人机PiWings

如何让树莓派Pico支持LoRaWAN

长者为你开启树莓派Pico的I/O世界

在树莓派Pico上播放《Bad Apple》

在树莓派Pico上用BBC Micro模拟器玩游戏

用Arduino做一个自动割草机

这个项目中,我们将用Arduino制作一个自动割草机。该机器可以自动修剪院子里长高的草。如果有障碍物,它会自动改变方向,有助于减少人力。

本文提供了项目的基本概述,以及制作Arduino割草机器人所需的组件。提供了电路原理图和Arduino源代码,以便简化组装和编程过程。

注意:这个项目不是玩具,它包含锋利的刀片。如果不小心使用,可能会造成严重的伤害。不要让它无人看管,刀片应正确固定。操作前检查一下。

材料清单

我们需要以下组件:

1、 Arduino UNO
2、 L293D电机驱动盾
3、 超声波传感器HC-SR04
4、 超声波传感器外壳/支架
6、 直流减速电机 x4
7、 BLDC电机100KV
8、 舵机SG-90
9、 ESC模块
10、舵机测试仪
11、3针滑动开关
12、X型十字支架
13、机器人底盘
14、11.1V锂电池

什么是割草机器人(割草机)?

割草机器人是一种用于自动修剪和维护草坪的机器人设备。这些机器人使用传感器和算法来导航和修剪草坪,并且可以根据草坪的生长速度或特定的时间表来编程修剪草坪。一些割草机器人还配备了诸如障碍物检测、防盗保护和通过智能手机应用程序远程控制等功能。它们近年来越来越受欢迎,因为可以节省割草的时间和精力。

电路和连接

源代码/程序

AFMotor Library:
https://github.com/adafruit/Adafruit-Motor-Shield-library

NewPing Library:
https://github.com/microflo/NewPing

需要编译到Arduino UNO开发板中的代码:

#include <AFMotor.h>  
#include <NewPing.h>
#include <Servo.h> 
 
#define TRIG_PIN A0 
#define ECHO_PIN A1 
#define MAX_DISTANCE 200 
#define MAX_SPEED 190 
#define MAX_SPEED_OFFSET 20
 
NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE); 
 
AF_DCMotor motor1(1, MOTOR12_1KHZ); 
AF_DCMotor motor2(2, MOTOR12_1KHZ);
AF_DCMotor motor3(3, MOTOR34_1KHZ);
AF_DCMotor motor4(4, MOTOR34_1KHZ);
Servo myservo;   
 
boolean goesForward=false;
int distance = 100;
int speedSet = 0;
 
void setup() {
 
  myservo.attach(10);  
  myservo.write(115); 
  delay(2000);
  distance = readPing();
  delay(100);
  distance = readPing();
  delay(100);
  distance = readPing();
  delay(100);
  distance = readPing();
  delay(100);
}
 
void loop() {
 int distanceR = 0;
 int distanceL =  0;
 delay(40);
 
 if(distance<=15)
 {
  moveStop();
  delay(100);
  moveBackward();
  delay(300);
  moveStop();
  delay(200);
  distanceR = lookRight();
  delay(200);
  distanceL = lookLeft();
  delay(200);
 
  if(distanceR>=distanceL)
  {
    turnRight();
    moveStop();
  }else
  {
    turnLeft();
    moveStop();
  }
 }else
 {
  moveForward();
 }
 distance = readPing();
}
 
int lookRight()
{
    myservo.write(50); 
    delay(500);
    int distance = readPing();
    delay(100);
    myservo.write(115); 
    return distance;
}
 
int lookLeft()
{
    myservo.write(170); 
    delay(500);
    int distance = readPing();
    delay(100);
    myservo.write(115); 
    return distance;
    delay(100);
}
 
int readPing() { 
  delay(70);
  int cm = sonar.ping_cm();
  if(cm==0)
  {
    cm = 250;
  }
  return cm;
}
 
void moveStop() {
  motor1.run(RELEASE); 
  motor2.run(RELEASE);
  motor3.run(RELEASE);
  motor4.run(RELEASE);
  } 
  
void moveForward() {
 
 if(!goesForward)
  {
    goesForward=true;
    motor1.run(FORWARD);      
    motor2.run(FORWARD);
    motor3.run(FORWARD); 
    motor4.run(FORWARD);     
   for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2) 
   {
    motor1.setSpeed(speedSet);
    motor2.setSpeed(speedSet);
    motor3.setSpeed(speedSet);
    motor4.setSpeed(speedSet);
    delay(5);
   }
  }
}
 
void moveBackward() {
    goesForward=false;
    motor1.run(BACKWARD);      
    motor2.run(BACKWARD);
    motor3.run(BACKWARD);
    motor4.run(BACKWARD);  
  for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2) 
  {
    motor1.setSpeed(speedSet);
    motor2.setSpeed(speedSet);
    motor3.setSpeed(speedSet);
    motor4.setSpeed(speedSet);
    delay(5);
  }
}  
 
void turnRight() {
  motor1.run(FORWARD);
  motor2.run(FORWARD);
  motor3.run(BACKWARD);
  motor4.run(BACKWARD);     
  delay(500);
  motor1.run(FORWARD);      
  motor2.run(FORWARD);
  motor3.run(FORWARD);
  motor4.run(FORWARD);      
} 
 
void turnLeft() {
  motor1.run(BACKWARD);     
  motor2.run(BACKWARD);  
  motor3.run(FORWARD);
  motor4.run(FORWARD);   
  delay(500);
  motor1.run(FORWARD);     
  motor2.run(FORWARD);
  motor3.run(FORWARD);
  motor4.run(FORWARD);
}  

测试

上传代码后,你可以把机器人带到野外,也许在高草地区。高草地区可以是一个很好的测试选择。

打开机器人上的开关,确保电源为Arduino板提供正确的电压,并且所有组件都正确连接。通过手动控制机器人的运动来测试机器人的电机,确保机器人运动平稳准确。

测试机器人的传感器,在其路径上放置障碍物,并确保能避开它们。此外,检查传感器的范围和灵敏度,以确保机器人可以检测到草的存在。

谷歌Sheets和ESP8266构建的考勤系统

用户刷卡后,系统会与包含用户列表的谷歌表单进行核对。

如果用户获得授权,LCD上会显示用户的姓名、接入类型和自定义留言,并发出“嘟”的一声。系统还将考勤数据记录在谷歌Sheet中,供以后查看和分析。

开始之前,你得有一个Google账户,且所在网络可以顺利登录Google。

https://mp.weixin.qq.com/cgi-bin/readtemplate?t=tmpl/video_tmpl&vid=wxv_2903425061842321412

主要材料:

RFID RC522

https://www.aliexpress.us/item/2251832760608169.html

esp8266

https://www.aliexpress.us/item/2251832470086446.html

lcd1602

https://www.aliexpress.us/item/2251832499297742.html

breadboard

https://www.aliexpress.us/item/2251832028089611.html

相关源码:

https://github.com/unreeeal/ESP/tree/master/ESP-RFID-GOOGLE

注:这里ESP32和ESP8266的使用场景是差不多的,两者都可以实现类似功能。

谁进我屋了之“无线门户报警器”

前面我们讲到了简易门户报警器的实现。

相关链接:

这次来做一个升级,实现网络报警。

项目需求:

当有人打开门或没关上门时,Micro:bit马上通过无线网络向你报警。

实现原理:

Micro:bit上面有个磁力计,这里可以设定每2秒测量一次磁场强度。当磁场低于某个特定水平(阈值)时,它会发送一个无线信号“door open”。如果磁性读数超过阈值,则会发送“door closed”。

当警报器Micro:bit收到“door closed”信息时,其 LED显示屏上会显示一个勾号。 当收到“door open”无线电讯息时,它会显示一个大叉并发出警报声。

所需材料:

Micro:bit 2个
电池包 2个
磁铁 1个
万能胶或类似工具,用以将磁铁固定在门上,并将Micro:bit固定在门框上。
可选的蜂鸣器或扬声器
鳄鱼夹引线

门户端代码:

from microbit import *
import radio
radio.config(group=17)
compass.calibrate()
radio.on()

while True:
    if button_a.was_pressed():
        display.scroll(compass.get_field_strength())
    if compass.get_field_strength() < 100000:
        display.show(Image.DIAMOND_SMALL)
        radio.send('door open')
    else:
        display.clear()
        radio.send('door closed')
    sleep(2000)

报警端代码:

from microbit import *
import music
import radio
radio.config(group=17)
radio.on()

while True:
    message = radio.receive()
    if message:
        if message == 'door open':
            display.show(Image.NO)
            music.play(["C4:4"])
        if message == 'door closed':
            display.show(Image.YES)

离线编辑器:

在线编辑器:

https://makecode.microbit.org/#editor

https://python.microbit.org/v/3?l=zh-CN

进阶:

1、按下Micro:bit上的按键A,以帮助校准磁力的最佳阈值。在MakeCode中将其设置为100 microteslas,与在Python中的10000 nanoteslas相同。
2、使用多个Micro:bit来发送不同的无线电消息(例如“back door open”)以追踪多门的状态。
3、使用变量来计算门保持打开状态的时间。

谁进我屋了之“简易门户警报器”

这是写给物联网新手的教程,熟手如果好奇也可以看一下。

有人来过你的房间吗?使用Micro:bit,电池组和磁铁,你可以让门发出警报,以提醒有人闯入。

关于Micro:bit:

Micro:bit是一个卡片大小的计算机,它有一个LED显示屏、按键、传感器和一些输入/输出引脚,可以在Scratch和Python程序的控制下,与你的世界交互。

原理:

Micro:bit上面内建了一个compass sensor,称为磁力计。 你可以使用它来测量地球的磁场,以作为指南针-或感应到附近的磁场强度!

代码:

当磁力强度感应低于200,就显示愤怒的表情。

当按钮A按下时,显示当前磁力强度。

如果用Python的话,这样写:

# Python uses nanoteslas to measure magnetism.
# Experiment with different numbers depending on the
# strength of your magnet, which you can read by 
# pressing button A.

from microbit import *

while True:
    if button_a.was_pressed():
        display.scroll(compass.get_field_strength())
    if compass.get_field_strength() < 200000:
        display.show(Image.ANGRY)

做法:

将磁铁固定在门上,然后将写入开门警报器程序的Micro:bit靠近它,固定在墙上。

接好电源。这样一个简单的报警装置就做好啦。

进阶:

1、添加声音警报。

2、使用一个变量来计算门被打开的次数,这里需要添加一个程序来感应门是否被打开或关闭。

3、创建一个定时器计算门被打开多长时间

好了,拿去玩吧。

本文主要内容来自:

microbit.org

相关视频:

谁进我屋了之“简易门户警报器” (qq.com)

为年轻人做的在线代码编辑器

树莓派官方最近出了一款免费的在线编辑器,以帮助 7 岁以上的年轻人学习程序开发。比较有意思的是,这个在线编辑器支持emoji表情。

在线编辑界面

不管你是参加 Code Clubs 和 CoderDojos 的选手,还是普通的在校学生,树莓派用户……都可以用它在线调试自己的程序。

目前该编辑器还在公测阶段,主要目标是让使学习者能够:

  • 直接在浏览器中编写和运行 Python 代码,无需任何设置。界面简单直观,这使得基于文本的编码更加容易。
  • 让那些拥有Raspberry Pi Foundation 帐户的人可以在线保存他们的代码。树莓派基金会希望代码学习者不管是在家里,还是在课堂上,都可以更方便的构建自己的项目。

目前,树莓派基金会选择了Python 作为代码编辑器支持的第一个语言,因为它在学校、CoderDojos 和代码俱乐部中很流行,很多专业开发人员也在用它。

将来会向编辑器添加对 Web 开发语言 (HTML/CSS/JavaScript) 的支持,以及项目共享和协作等功能。树莓派基金会希望这个编辑器是安全、易于访问且适龄的。

关于ICO 的适龄设计规范:

https://ico.org.uk/for-organisations/guide-to-data-protection/ico-codes-of-practice/age-appropriate-design-a-code-of-practice-for-online-services/

经过笔者的测试,目前该编辑器主要支持turtle在内的Python标准库,以及P5高级绘图库,大家可别在里面跑PyGame咯。

官方推荐的入门项目:

https://projects.raspberrypi.org/en/pathways/python-intro-code-editor

基于ESP8266的智能配电板

This is the final curcuit: 

This is components you need for the project:

PZEM-004T: https://s.click.aliexpress.com/e/_9hYStD

ESP8266: https://s.click.aliexpress.com/e/_97j7kp

Resistors: https://s.click.aliexpress.com/e/_9AslPB

Electrolytic Capacitor: https://s.click.aliexpress.com/e/_A2atvx

PCB 6X8: https://s.click.aliexpress.com/e/_d7XpQnS

Pin Header: https://s.click.aliexpress.com/e/_AUvLzT

Female PCB Header: https://s.click.aliexpress.com/e/_AClQip

5V relay module: https://s.click.aliexpress.com/e/_AAXY9i

1602 I2C Display: https://s.click.aliexpress.com/e/_AF3L2o

Compilation

Use core 2.7.4 for this project (Tested with this version)  upd: 08/12/2021 made some changes, tested with 3.0.2 (works)

please download the necessary libraries: https://github.com/electrical-pro/SmartBoard/blob/main/libraries.zip copy them from the archive to: C:\Users\Documents\Arduino\libraries

P.S. I modified the LiquidCrystal_I2C library, I removed Wire.begin(5, 14);

Uploading files from data folder

The project uses SPIFFS to store files on ESP8266, upload them to the ESP8266 (read about SPIFFS if you dont know what that is.) 

 If you don’t see this option install the plugin from here: https://github.com/esp8266/arduino-esp8266fs-plugin

Connecting to router

After flashing connect to “PowerControlESP | Offline” pass is “PowerControlPass” then go to 192.168.4.1 (WI-Fi manager) and connect to your Wi-Fi router. 

Power server is at 192.168.x.x:8089 (port is 8089)

Very unusual authorization that I implemented

If it says “The file exists, but you are not authorized!” – is a simple safety feature that I implemented, so in order to access files you need to go to a secret URL first http://192.168.x.x:8089/me (you can program another one) When you go to http://192.168.x.x:8089/me it puts a cookie in your browser and you become an authorized user

to make it work right set it to false in the sketch

// set it to false, and then get auth cookie by going to 192.168.x.x:8089/me
bool PublicAccess = true;  // authorization 

If it is true it only allows you to go to http://192.168.x.x:8089

if it is false nothing is allowed unless you go to http://192.168.x.x:8089/me first

Serial

Note that I use Serial for PZEM004Tv30 module

PZEM004Tv30 pzem(&Serial);

Other information goes to Serial1 not Serial (so you will not see things in serial monitor)

Serial1.begin(115200);