复刻数字BP机(传呼机)
14272024/08/19原创 电子技术 IP:天津
关键词
串口
ESP32

没有听错,就是二十年前的那个传呼机,现在已经基本消失了,不过因为我们学校占地面积比较大,加上不让用手机,地方比较多,放学了如果分开去吃个饭或者洗个澡之后根本就找不到人的尴尬,有时候找一个人还需要用最短路径,比如从教室到实验室到食堂到宿舍……,但是找半天也不知道去哪里了,于是复刻了一个类似功能的数字BP机,主控依旧是ESP32,用来收发的串口模块HC-12,因为活动范围直径不会超过二千米,加上手头正好有这个模块,放几个常见的命令来通讯,用OLED屏幕显示,比如所在的位置,问答的语句,发送按键,还增加了一个热释电的模块,有人体感应会给从机发送信息,免的你的室友在你不在宿舍的情况下对你的柜子或者行李箱里吃的进行零元购 sticker ,以后还会更新一个录音的功能

IMG_20240815_215519.jpg IMG_20240815_222133.jpg

串口芯片用的是cp2104,附带了一个4056来给充电,就是串口模块和屏幕摆放不太合理,有点别扭

  从左上角开始数的按键用处,第一个是发送按键,起到一个保险 

作用,选中要发送的信息再按确保不会误触,第二个就是热释电感应,按一下启动,感应到有人靠近就会自动给从机发送信息,第三个是选择发送的按键,内置几个询问和回复的话

such: where are you,come to me ,ok,no,

i am busy ,wait to come

剩下的两个按钮就是位置了,可以根据自己需要更改代码比如我这个

1/Restaurant 2/Restaurant食堂

class hostel,1/laboratory,2labrotary实验室

我觉得英文比较方便改,多学几个单词也没有坏处(实际上是我懒得折腾字库)

剩下两个拨钮是控制蜂鸣器开关的,另一路可以增加点其他的功能

右上是ESP32的复位和Boot按键,下边的按键是调整串口模块的空中波特率和其他参数的

这里放一下micropython的代码

from machine import Pin, SoftI2C, UART
from ssd1306 import SSD1306_I2C
import time

# Initialize UART
uart = UART(2, 9600, rx=16, tx=17)

# Initialize pins connected to buttons
key1 = Pin(14, Pin.IN, Pin.PULL_UP)
key2 = Pin(27, Pin.IN, Pin.PULL_UP)
key3 = Pin(26, Pin.IN, Pin.PULL_UP)
key4 = Pin(25, Pin.IN, Pin.PULL_UP)

# Initialize PIR sensor and beep pin
pirPin = 34
beep_pin = Pin(15, Pin.OUT)
pir = Pin(pirPin, Pin.IN, Pin.PULL_DOWN)
pir_state = 0

# Initialize states
key1_states = [
    "1/Restaurant",
    "2/Restaurant",
    "Bathroom",
    "Hostel",
    "B/Laboratory",
    "D/Laboratory"
]
key2_states = [
    "Where are you?",
    "Come to me",
    "OK",
    "No",
    "I am busy",
    "Wait to come"
]
current_state_index_key1 = 0
current_state_index_key2 = 0
last_state = None
received_message = None
def key1_irq(pin):
    global current_state_index_key1, last_state
    if pin.value() == 0:
        current_state_index_key1 = (current_state_index_key1 + 1) % len(key1_states)
        last_state = key1_states[current_state_index_key1]
        display_text(sent_text=last_state)
def key2_irq(pin):
    global current_state_index_key2, last_state
    if pin.value() == 0:
        current_state_index_key2 = (current_state_index_key2 + 1) % len(key2_states)
        last_state = key2_states[current_state_index_key2]
        display_text(sent_text=last_state)
def key3_irq(pin):
    global last_state
    if pin.value() == 0:
        if last_state is not None:
            uart.write(last_state + "\n")
            print("Sent over UART:", last_state)
            display_text(sent_text=last_state)
def key4_irq(pin):
    global pir_state
    if pin.value() == 0:
        pir_state = not pir_state 
        if pir_state:
            print("PIR sensor active")
        else:
            print("PIR sensor inactive")
def display_text(sent_text=None, received_text=None):
    oled.fill_rect(0, 20, 128, 16, 0) 
    oled.fill_rect(0, 40, 128, 16, 0)
    if sent_text:
        oled.text("T:" + sent_text, 0, 20) 
    if received_text:
        oled.text("R:" + received_text, 0, 40) 
    oled.show()
def beep():
    beep_pin.value(1)  
    time.sleep(0.1)    
    beep_pin.value(0)  
    time.sleep(0.1)  
if __name__ == "__main__":
    i2c = SoftI2C(sda=Pin(23), scl=Pin(18))
    oled = SSD1306_I2C(128, 64, i2c)
    key1.irq(trigger=Pin.IRQ_FALLING, handler=key1_irq)
    key2.irq(trigger=Pin.IRQ_FALLING, handler=key2_irq)
    key3.irq(trigger=Pin.IRQ_FALLING, handler=key3_irq)
    key4.irq(trigger=Pin.IRQ_FALLING, handler=key4_irq)

    while True:
        if uart.any():
            received_message = uart.read().decode('utf-8').strip()
            print("Received over UART:", received_message)
            display_text(received_text=received_message)
            beep()
            uart.write(received_message + "\n")
            print("Echoed back over UART:", received_message)
        if pir_state and pir.value() == 1:
            oled.fill(0)
            oled.text("Someone", 0, 20)
            print('Detect someone...')
            beep()
        time.sleep(0.1)

效果视频


video_20240819_121613_edit.mp4 点击下载


PCB

3D.png PCB.png PCBfile.png

工程文件

attachment icon ESP32透传.eprj 3.41MB EPRJ 1次下载

attachment icon serial.py 3.12KB PY 0次下载

掉电运行把serial改成main

测试一下代码

PIR感应

video_20240819_122727.mp4 点击下载

按键发送

video_20240819_122802.mp4 点击下载

接收 hello world

video_20240819_122917.mp4 点击下载


+0.5  科创币    chenruixi    2024/08/19 辛苦了,不过提升空间蛮大的
+1  科创币    helium    2024/08/19 支持一下
+1  科创币    粥粥    2024/08/19 鼓励一下
+1  科创币    铅球脑袋    2024/09/20 黎巴嫩很需要你这样人才
来自:电子信息 / 电子技术
11
4
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
yushu
1个月8天前 IP:浙江
936023

好东西!建议加精

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
1427作者
1个月7天前 IP:天津
936100

更正一下,按键以程序和pcb参考,上边位置改键位了

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
1427作者
1个月7天前 IP:天津
936103

attachment icon ESP32透传.eprj 3.41MB EPRJ 0次下载


新pcb文件

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
1427作者
1个月7天前 IP:天津
936104

PCB.png 去了wifi模组的敷铜,不过用wifi增加新功能可能会导致pir34脚没法使用,记得esp32的硬件设计模组里边说过

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
1427作者
1个月2天前 IP:天津
936539

IMG_20240825_163528.jpg IMG_20240825_163459.jpg

新的板子又到了,证明我还没跑路 sticker

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
虎哥
1个月2天前 IP:四川
936540

BP机的精华在于在制高点架一个200W的大发射机,覆盖几十公里。

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
1427作者
1个月2天前 IP:天津
936543
引用虎哥发表于6楼的内容
BP机的精华在于在制高点架一个200W的大发射机,覆盖几十公里。

那我这是去其精华取其糟粕了 sticker

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
1427作者
1个月1天前 IP:天津
936597

IMG_20240826_214042.jpg IMG_20240826_214054.jpg IMG_20240826_210440.jpg

板子验证可以正常运行,注意gpio的引脚

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
1427作者
29天17时前 IP:天津
936671

IMG_20240828_140725.jpg 一对

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
铅球脑袋
6天19时前 IP:辽宁
937656

能压缩发射语音,就更实用了。

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
1427作者
6天19时前 IP:天津
937657
引用铅球脑袋发表于10楼的内容
能压缩发射语音,就更实用了。

那和买一个对讲机貌似没啥区别了,我觉得上课或者其他不能用手机的时候这个刚好可以静音发送 sticker

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
1427
进士 机友 笔友
文章
6
回复
172
学术分
0
2022/11/05注册,19分53秒前活动

高中牲不想上学

主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:天津
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}