许多店里都请了员工,但是收款码确是自己手机的,而收款微信因为要与客户联系等诸多原因没有办法放在店里,因此需要购买收钱吧并支付收款金额0.12%的手续费。作为一名自动化人,怎能愿意让广大创业者被如此厚颜无耻之人收手续费呢!!!(附相关电路原理图和layout文件)


一、思路

        如果想要一个能播报任意金额(不只是预设的固定金额)的语音播报器,可以采用以下方案:手机端安装MacroDroid将支付收款消息转发到MQTT服务器,ESP32连接本地WIFI后实时获取MQTT订阅的主题消息,再利用SYN6288E语音模块实时播报即可。


二、硬件电路
        同时,为了保证续航、充放电、程序上载、芯片供电,需要对以下电路进行设计。均参考相关芯片说明文档和部分网上电路制作而成。
1.SYN6288E语音播报电路;


2.锂电池充电电路;


3.锂电池3.7V转5V稳压电路;


4.5V转3.3V稳压电路;


5.5V转3.7V稳压电路;(锂电池在充放电过程中电压不稳定,需要稳定的3.7V)


6.CH340串口电路;


7.type-C程序下载电路;


8.自动下载电路;


9.主控电路;

三、PCB layout
          因为我也是第一次做layout,所以不太好看,但应该是可以用的:
1.铺铜正面(接口处有DRC警告,但不影响实际使用):

2.铺铜反面:

3.未铺铜正面:

4.未铺铜反面:


板子制作建议立创EDA领券后下单,电阻电容等便宜的元器件可以在立创商城直接下单,SYN6288E和ESP32模块建议淘宝下单更便宜。
四、代码框架:
 

#include <WiFi.h>
#include <PubSubClient.h>
#include <SoftwareSerial.h>

// WiFi设置
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";

// MQTT设置
const char* mqtt_server = "broker.emqx.io"; // 免费MQTT服务器
const char* topic = "payment/notify";       // 订阅主题

WiFiClient espClient;
PubSubClient client(espClient);
SoftwareSerial synSerial(16, 17); // RX, TX

// 发送指令到SYN6288
void synPlay(String text) {
  // 文本转GB2312编码(SYN6288需要)
  unsigned char gbText[100];
  int len = text.length();
  text.toCharArray((char *)gbText, len+1);
  
  // SYN6288指令格式
  unsigned char frame[20] = {0xFD, 0x00, 0x00, 0x01, 0x00};
  frame[1] = len + 3;
  frame[2] = 0x01; // GB2312编码
  
  synSerial.write(frame, 5);
  synSerial.write(gbText, len);
}

// 从消息中提取金额
float extractAmount(String msg) {
  int start = msg.indexOf("¥");
  if(start == -1) start = msg.indexOf("¥");
  if(start != -1) {
    String numStr = msg.substring(start+1);
    return numStr.toFloat();
  }
  return 0.0;
}

// MQTT回调
void callback(char* topic, byte* payload, unsigned int length) {
  String message;
  for(int i=0; i<length; i++) {
    message += (char)payload[i];
  }
  
  if(message.indexOf("收款") != -1) {
    float amount = extractAmount(message);
    if(amount > 0) {
      String voiceMsg = "微信收款" + String(amount) + "元";
      synPlay(voiceMsg);
    }
  }
}

void reconnect() {
  while(!client.connected()) {
    if(client.connect("ESP32Client")) {
      client.subscribe(topic);
    } else {
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  synSerial.begin(9600);
  
  WiFi.begin(ssid, password);
  while(WiFi.status() != WL_CONNECTED) delay(500);
  
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  
  // 测试语音
  synPlay("语音模块初始化完成");
}

void loop() {
  if(!client.connected()) reconnect();
  client.loop();
}

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐