发作品签到
专业版

会议用电子胸牌设计

工程标签

8.8k
0
0
18

简介

根据参赛要求,设计并制作一个电子胸牌,可通过绳索或别针佩戴,显示图片与文字信息,多人环境下不同设备互不干扰;低功耗,显示时长不小5个小时;并允许用户可通过手机上传胸牌上图片及姓名,职务等个人信息。

简介:根据参赛要求,设计并制作一个电子胸牌,可通过绳索或别针佩戴,显示图片与文字信息,多人环境下不同设备互不干扰;低功耗,显示时长不小5个小时;并允许用户可通过手机上传胸牌上图片及姓名,职务等个人信息。
星火计划2024

开源协议

CC BY-NC-SA 4.0

(未经作者授权,禁止转载)
创建时间:2024-04-03 02:10:18更新时间:2024-07-29 01:39:17

描述

项目说明

项目基于墨水屏价签改进设计,实现工程简介里的要求。

开源协议

基于CC  BY-NC-SA 4.0发布。

项目相关功能

  1. 胸卡采用墨水屏,正面显示会议名称和个人信息。
  2. 胸牌有一个按键,按下后胸牌显示此牌的二维码,扫描此码即可输入相应信息(名字、单位、照片等);松开按键后恢复显示会议胸牌内容。
  3. 工作人员可以提前录入参会人员资料,也可以直接扫描胸牌录入;也可以由用户自行录入;
  4. 由于胸牌显示的二维码具有唯一性,后续可以开发会议记帐等功能。
  5. 胸牌背面有磁吸卡口,用于卡在衣服上。

项目属性

本项目为首次公开,为本人原创项目。项目未曾在别的比赛中获奖。

项目进度

1, 已完成电路设计;
2. 已完成软件调试;
3. 已完成电路焊接测试;
4. 已完成3d打印外壳设计;
5. 已打印完成外壳;
6. 全部完成。

设计原理

  1. 系统分为2个部分,一是可以佩戴的胸牌;二是数据收集和发布的后台。
  2. 胸牌采用esp32模块处理数据和墨水屏进行显示;平时处于休眠状态,定时被动更新或按键主动更新。
  3. 后台采用django应用服务器,采有sqlite3作为数据存储。

软件说明

一、胸牌部分:

采用esp-idf开发。短按键后系统启动,连接网络并获取取数据进行显示,然后休眠,主要逻辑如下:

  1. 启动后首先进行按键扫描:如果启动时按着,则按键㳄数计数器加1;如果已经释放,则计数器清零。如果计数器不为零,则显示编辑数据的二维码,如果计数次数大于或等于3次,则清除wifi信息。
  2. 启动wifi,如果之前没有连通过(首次开机),或已被强制清除(参看上一条内容),则启动esptouch联网,用户可以用手机上的esptouch(v1)客户端输入wifi密码等;这一步骤可以多台同时开机,esptouch支持对多台设备同时上传密码。
  3. 联网以后,向服务器索取应显示的内容。如果此胸牌信息没有内容,则显示二维码后休眠。用户扫描此二维码后出现信息录入界面,在输入相应信息后存入服务器上的数据库。短按键触发刷新后显示。
  4. 按一下胸牌上面的按键,则胸牌刷新一次(重新读取服务器上的信息)后休眠。
  5. 长按胸牌上面的按键(1秒以上,5秒以内(看到屏幕刷新后松开)),则胸牌会显示录入信息用的二维码(参见第三条内容)后休眠。录入后需短按键触发刷新。
  6. 更长按胸牌上面的按键(30秒以上,直到屏幕第三次刷新,显示esptouch提示后松开),胸牌会重置wifi,需要重新用esptouch设置(用于更换 wifi ssid 和 密码)。
  7. 如果连不上wifi或找不到服务器,大约1分钟后(会一直尝试连接),屏幕会显示“连不上wifi或服务器”,然后休眠。
  8. 如果用微信扫描二维码,请选择“在浏览器中打开”。也可以直接用系统自带的扫码工具。
  9. 胸牌支持usb充电。

主要代码如下:

void app_main(void)
{
...
    if (gpio_get_level(key_pin) == 0) {
        // key pressed
        ++restart_counter;
    } else
        restart_counter = 0;

    // 如果一直按键,则重新配网
    if (restart_counter >= 3) {
        printf("wifi cleared\n");
        esp_wifi_restore();
        err = nvs_commit(my_handle);
        ESP_LOGI("WIFI", "clearing wifi password & ssid\n");
        ESP_ERROR_CHECK(nvs_flash_erase());
        nvs_flash_init();
        restart_counter = 0;
    }

    // 获取wifi配置信息,如果没有,则显示 esptouch 界面
    // wifi 没有初始化,取不得数据,所以放到 initialise_wifi 里面,见下
    /*esp_wifi_get_config(WIFI_IF_STA, &myconfig);
    if (strlen((char*)myconfig.sta.ssid) == 0) {
        printf("Current wifi ssid is %s, length = %d\n", myconfig.sta.ssid, strlen((char*)myconfig.sta.ssid));
        epd.display(esptouch);
    }
    */
    // 启动配网,或直接入网
    initialise_wifi(epd, esptouch);
    //等待配网成功
    // 如果连上,则联网,否则休眠。
    uxBits = xEventGroupWaitBits(s_wifi_event_group, CONNECTED_BIT , false, true, pdMS_TO_TICKS(100000));
    if ((uxBits & CONNECTED_BIT)  ){
        get_mac_address();
        if (restart_counter > 0)
            sprintf(url, "%s%s%s", URL_BASE, "qr/", mac_str);
        else
            sprintf(url, "%s%s%s", URL_BASE, "name/", mac_str);
        epd_task_url(epd, url);
        printf("Restart Counter = %ld\n", restart_counter);
        // Write
        printf("Updating restart counter in NVS ... ");
        err = nvs_set_i32(my_handle, "restart_counter", restart_counter);
        // Commit written value.
        // After setting any values, nvs_commit() must be called to ensure changes are written
        // to flash storage. Implementations may write to storage at other times,
        // but this is not guaranteed.
        printf("Committing updates in NVS ... \n");
        err = nvs_commit(my_handle);
        // Close
        nvs_close(my_handle);
    //} else {
        // 显示没有联网,所以休眠,请重新启动?
    //    ;
    }...
}

二、服务器端:

采用django实现,数据存储采用sqlite3,支持excle等格式的导入和导出。

  1. 可以提前制作好胸牌的图片文件,存在服务器的相应位置。
  2. 如果采用参会人员自行录入,则可以不做任何处理,只要发放胸牌即。
  3. 如果提前录入数据,则需要每个胸牌的mac地址,然后制作excel表格,导入服务器后,按一下胸牌按键就可以显示了。
  4. 可以导出excel文件,内容为所有参加人员自行录入的信息,并包括mac地址。

显示屏部分后端主要代码如下:

def name(request, mac):
    try:
        person = Meetings.objects.get(mac = mac)
    except Meetings.DoesNotExist:
        return qr(request, mac)
    font36 = ImageFont.truetype(SIMKAI, 36)
    font24 = ImageFont.truetype(SIMKAI, 20)
    font12 = ImageFont.truetype(SIMKAI, 12)
    # 296 * 128
    im = Image.open(OSHWHUB) # 296 * 128
    im = im.convert('L')
    draw_table = ImageDraw.Draw(im=im)
    draw_table.text(xy=(96, 50), text=person.name, fill=0x0, font= font36, spacing=12, align='left')  # 文字位置,内容,字体
    draw_table.text(xy=(70, 100), text=person.company, fill=0x0, font= font24, spacing=12, align='left')  # 文字位置,内容,字体
    if person.img and hasattr(person.img, 'url'):
        img = Image.open(person.img.path)
        img = img.transpose(Image.ROTATE_270)
        img.thumbnail((60, 80))
        im.paste(img, (8,40))
    im.save('/tmp/' + mac + '.bmp', 'BMP')  # 保存在当前路径下,格式为PNG
    im.close()

    response = FileResponse(open('/tmp/' + mac + '.bmp', 'rb'))
    response['Content-Type'] = 'application/octet-stream'
    f.close()
    return response

实物展示

MeetingCard.jpg

系统安装流程

一、建立一个有AP的局域网,此处假设网络地址为192.168.5.x
二、安装web 服务器(假设服务器地址为192.168.5.1):
0,新建一个文件夹,如/opt/web:

mkdir /opt/web
  1. 建立venv环境: 
cd /opt/web
python -m venv .
  1. 安装django:
pip install django 
  1. 安装必须的插件:
pip install django-import-export pillow qrcode
  1. 生成一个网站: 
django-admin startproject mysite
  1. 将附件中的mysite.tgz 解压,并覆盖上一步的文件
  2. 启动django:
python manager.py runserver 192.168.5.1:8080
  1. 进入管理界面(增删改数据、导入导出):
http://192.168.1.5.1:8080/admin/

三、重新编译固件

  1. 下载并安装 vscode
  2. 解压附件的中idfepd.zip;
  3. 根据需要修改main.cpp 的第57行,这是配置服务器的地址
const char * URL_BASE ="http://192.168.5.1:8080/epdiy/";
  1. 编译并上传到胸牌。
  2. esptouch时,特别需要注意是2.4G网络。

其他

一、演示视频和设备源码(idfedp.zip)、设备固件(epd2in9.bin)、服务器端源码(mysite.tgz)、外壳模型(stl.zip,三维猴可以直接打印)已上传附件。
二、胸牌信息模板文件为服务器端mysite文件夹下面的 oshwhub.bmp,请按当前大小和颜色保存。
三、设计中参考了oshwhub上的多个价签屏模块。

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

附件

序号文件名称下载次数
1
QPOO0639.MP4
180
2
epd2in9.bin
139
3
mysite.tgz
102
4
idfepd.zip
158
5
stl.zip
95
克隆工程
添加到专辑
0
0
分享
侵权投诉

工程成员

评论

全部评论(1)
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航