这么改一下超市价签,商业价值飙升啊!

嘉丽科技讨论 2024-08-14 02:51:16

最近很喜欢看一些爆改超市价签的开源项目。

比如这个——把超市价签,爆改成了参会胸牌。

它主要起到什么作用呢,又是怎么爆改的呢……

功能一: 基础功能

默认显示:会议名称+个人信息。

按下按键:显示录入信息二维码

松开按键:恢复默认显示

信息含:名字、单位、照片等

功能二:续航180天

支持usb充电,一次充电,续航半年!

续航久的秘诀:单次信息显示时长不小5个小时;平时处于休眠状态,定时被动/按键主动更新。

功能三:录入信息方式

支持提前录入参会人员资料;支持直接扫描胸牌录入;支持用户自行手机扫码录入

功能四:其他功能

一些巧思:胸牌背面有磁吸卡口,用于卡在衣服上

后续更新:由于胸牌显示的二维码具有唯一性,后续可以开发会议记帐等功能

说实在的

电子产品存在的目的,不就是为了减少重复化的操作,节约大家的时间嘛~

而且这个墨水屏还能重复使用……

是不是好方便,好节能!

不过,既然这是DIY开源项目,那我们就一起看看——它爆改了哪些地方?

硬件设计

硬件设计的目的是——有一个处理数据+信息显示的载体,且能实现胸牌的休眠状态+定时被动更新+按键主动更新。

采用esp32模块实现。

原理图

PCB图

软件说明(真有教程的那种)

软件部分主要实现——信息的收集和发布;墨水屏的基础功能。

系统分为2个部分:

墨水屏数据收集和发布的后台

下面分别说明一下原理。

1.墨水屏(也就是胸牌)部分

胸牌采用esp-idf开发。

主要实现:

按键后系统启动连接网络,获取数据显示进行休眠

主要逻辑如下:

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

主要代码如下:

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 { // 显示没有联网,所以休眠,请重新启动? // ; }...}

2.服务器端

主要实现:

数据存储支持excle等格式的导入和导出。

采用django应用服务器,采有sqlite3作为数据存储。

使用说明如下:

提前制作好胸牌的图片文件,存在服务器的相应位置。如果采用参会人员自行录入,则可以不做任何处理,只要发放胸牌。如果提前录入数据,则需要每个胸牌的mac地址,然后制作excel表格,导入服务器后,按一下胸牌按键就可以显示了。可以导出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

3.系统安装教程

①建立一个有AP的局域网,此处假设网络地址为192.168.5.x

②安装web 服务器(假设服务器地址为192.168.5.1):0,新建一个文件夹,如/opt/web:

mkdir /opt/web

1.建立venv环境:

cd /opt/webpython -m venv .

2.安装django:

pip install django

3.安装必须的插件:

pip install django-import-export pillow qrcode

4.生成一个网站:

django-admin startproject mysite

5.将附件中的mysite.tgz 解压,并覆盖上一步的文件

6.启动django:

python manager.py runserver 192.168.5.1:8080

7.进入管理界面(增删改数据、导入导出):

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/";

编译并上传到胸牌。

4.esptouch时,特别需要注意是2.4G网络。

参考资料:https://oshwhub.com/dbhua/design-of-electronic-badges-for-meetings

结语

如果是你爆改超市价签,你会想爆改成啥样的?

【正文完】

你的点赞,就是我的动力~

0 阅读:0

嘉丽科技讨论

简介:感谢大家的关注