【RPi系列】STC12C5A60S2单片机通过传感器采集数据无线收发至树莓派并存入阿里云服务器ECS

325 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、简介

  本次项目的前期工作已经接近尾声,现已实现通过STC12C5A60S2单片机驱动3144霍尔传感器NEO-6M GPS模块来采集当前区域的经纬度信息以及磁场变化;LCD1602液晶显示屏显示采集到的信息;深联智达 DL-20 2.4G zigbee无线串口收发模块将采集到的信息从单片机发送给树莓派;树莓派4B将接收到的数据再转发给阿里云服务器ECS阿里云服务器ECS对接收到的数据进行处理,存入mysql数据库;最后通过Navicat远程连接数据库,使用SSM框架搭建上位机系统对采集到的数据状态进行实时显示。

二、前情提要

1、STC12C5A60S2

STC12C5A60S2接线说明:

STC12C5A60S2 ADC采集:

STC12C5A60S2 Uart串口通信:


2、树莓派

树莓派与无线收发设备:

树莓派通过Socket与ECS进行通信:


3、阿里云服务器ECS

Navicat远程连接ECS数据库:

ECS搭建MQTT服务器:

三、硬件准备

  参见 树莓派与STC12C5A60S2单片机之间的无线通信

四、软件准备

   树莓派使用Socket发送数据至阿里云服务器ECS并存入数据库 此处代码有所改动,对应了单片机发送过来的数据形式。

1、raspberry pi

# -*- coding: utf-8 -*
from socket import *
import serial
import time
import json

HOST = '公网地址'
PORT = 2222
BUFSIZ = 1024
ADDR = (HOST,PORT)

temp = 0;
ser = serial.Serial('/dev/ttyAMA0', 9600)
if ser.isOpen == False:
    ser.open()                # 打开串口

try:
    mySocket = socket(AF_INET,SOCK_STREAM)
    mySocket.connect(ADDR)
    print("连接到服务器")
except :                           ##连接不成功,运行最初的ip
    print ('连接不成功')

try:
    while True:
        size = ser.inWaiting()               # 获得缓冲区字符
        if size != 0:
            response = ser.read(18)# 读取内容并显示
            temp = response.decode("UTF-8") # 将读取到的bytes转化为str
            print(temp)
            
            # 获得一个较为准确的数值 {index,ad}
            if temp.startswith('{') and temp[16] == '}':
               msg = temp
               mySocket.send(msg.encode("utf-8"))
               print("发送完成")
               time.sleep(10)
            
            ser.flushInput()                 # 清空接收缓存区
            time.sleep(0.1)                  # 软件延时
            
except KeyboardInterrupt:
    mySocket.close()
    ser.close()
    print("程序结束\n")
    exit()
    

2、ECS

import socket
import pymysql
import time

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
HOST = '内网地址'
PORT = 2222
#绑定socket
s.bind((HOST, PORT))
s.listen(10)


# 打开数据库连接
db = pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    passwd='数据库密码',
    db='centosdb',
    charset='utf8'
)
print("数据库开启")
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
sqltime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))

index = ""
adc = ""

try:
    while True:
        # 接收客户端连接
        print("等待连接....")
        client, address = s.accept()
        print("新连接")
        print("IP is %s" % address[0])
        print("port is %d\n" % address[1])
        while True:
            # 读取消息
            msg = client.recv(1024)
            # 把接收到的数据进行解码
            print(msg.decode("utf-8"))
            print("读取完成")
            temp = msg.decode("utf-8")

            if temp.startswith('{') and temp[16] == '}':
                index = temp[7]
                adc = temp[12:16]
            
            # SQL 插入语句
            # sql = "INSERT INTO MAGNETISM(MTIME , MFLAG) VALUES ('%s','%s')" % (sqltime, msg.decode("utf-8"))
            sql = "INSERT INTO magnetism(MINDEX, MFLAG) VALUES ('%s','%s')" % (index,adc)

            try:
                # 执行sql语句
                cursor.execute(sql)
                # 提交到数据库执行
                db.commit()
                print("insert success!")
            except:
                # 如果发生错误则回滚
                db.rollback()
                print("insert fail!")

            time.sleep(10)
            
except KeyboardInterrupt:
    client.close()
    s.close()
    # 关闭数据库连接
    db.close()
    print("程序结束\n")
    exit()


实验结果