【物联网毕设】基于Arduino与树莓派的智能鱼缸【二】
提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
- 前言
- 一、Arduino與樹莓派進行通信
- 二、樹莓派把數據上傳到服務器
- 1.在樹莓派上用Django搭建服務器
- 2.在樹莓派上搭建MySQL數據庫
- 3.樹莓派把數據post到服務器上
- 三、微信小程序通過服務器獲取數據庫的值
- 總結
前言
本文主要講的是智能魚缸樹莓派部分,也是我的畢業設計我認為最棘手的部分。
一、Arduino與樹莓派進行通信
看過我上一篇文章的小伙伴們應該知道,現在我們已經實現了Arduino讀取傳感器的值,那我們怎么將它傳給樹莓派呢?(注:如果你手里是一塊全新的樹莓派,需要安裝鏡像源,實現遠程訪問等準備工作,推薦B站樹莓派教程:https://www.bilibili.com/video/BV1bt411c7fC?share_source=copy_web只看前四節課就完全ok)
參考鏈接:樹莓派與Arduino通信
在跟著這個帖子成功實現簡單的通訊后(我用的是USB通訊),接下來要做的就是把我的Arduino里接收到的傳感器的數據傳給樹莓派了。
上代碼!
在Arduino IDE里寫入下面這段代碼,覆蓋我上一篇文章里Arduino IDE上的代碼(此代碼在之前的基礎上加入了Arduino向樹莓派傳數據的部分):
Arduino代碼:
在樹莓派上新建一個post.py文件,寫入:
樹莓派代碼:
注意樹莓派代碼第六行里的:/dev/ttyUSB0,還有人是/dev/ttyACM0,要知道你的是什么,把樹莓派和Arduino用USB連接后,在樹莓派終端輸入: ls /dev/tty*查看兩者連接端口的名字,多出哪個就是哪個。
for i in range(2): 的意思是讓樹莓派打印兩次,因為經過實驗,發現第一個值一直打不出來,咱也不知道為什么,硬件有時候就是玄學,所以就讓這段代碼循環兩次,讓樹莓派和Arduino之間實現穩定的傳值。
提醒一下之后post.py里還要寫入一部分代碼,也就是說目前上面的這段樹莓派里的代碼只是一部分,所以你試驗的時候,可能會出現多余的頭文件,然后樹莓派的IDE報錯,沒事,暫時把沒有用到的頭文件注釋掉就好了,后面會用得著的(我可真是太貼心了)。
運行結果:
注意這里是后期要放在論文里的截圖,特意把第一個沒有打出來的temperature蓋住了(怕老師問我我答不上來),然后讓程序循環了五次。
二、樹莓派把數據上傳到服務器
現在我們的樹莓派已經得到了從Arduino上傳過來的傳感器數據了。接下來就是把數據上傳到服務器,通過服務器寫入到數據庫了。首先,我們得有一個基于樹莓派的服務器。其次,我們樹莓派上得有一個MySQL數據庫。然后,我們要把服務器和數據庫連接起來。最后,把樹莓派上的數據post到服務器。接下來我一部分一部分的細說。
參考鏈接:https://blog.csdn.net/weixin_52079689/article/details/109383872?spm=1001.2014.3001.5506
1.在樹莓派上用Django搭建服務器
參考鏈接:https://blog.csdn.net/damanchen/article/details/85224686
跟著這個鏈接,我們可以在樹莓派上下載好Django。需要注意的是,你的樹莓派要有python,我的3B里python默認的是python2。為了之后方便操作,我需要將python2換成python3,這個視情況而定,你不一定非得改。如果你也想改,推薦鏈接:https://blog.csdn.net/ylzmm/article/details/107827065
好的。現在我們的樹莓派上已經有Django了,可以正式開始創建一個服務器了。
輸入:
創建好后的截圖:
配置功能:
需要說明以下我的項目名都是fish_tank,app都叫index。上面的項目和app是我為了演示新建的。名字會有變化。
fish_tank/setting
這里是有關樹莓派數據庫的,要加這兩句代碼。
[’*’]是為了讓同一局域網下面不同ip都可以訪問該服務器。
這是連接數據庫。后面會講到樹莓派上搭建數據庫,這里就是將數據庫與服務器連接起來的代碼。
fish_tank/urls.py
fish_tank/index/admin.py
from django.contrib import admin# Register your models here. from .models import *class SensorAdmin(admin.ModelAdmin):list_display = ('id', 'time', 'temperature','water_level','oxygen')admin.site.register(Sensors, SensorAdmin)fish_tank/index/app.py
from django.apps import AppConfigclass IndexConfig(AppConfig):default_auto_field = 'django.db.models.BigAutoField'name = 'index'fish_tank/index/models.py
from django.db import models# Create your models here. class Sensors(models.Model):time = models.DateTimeField(auto_now_add=False)temperature = models.CharField(max_length=10)water_level= models.CharField(max_length=10)oxygen = models.CharField(max_length=10)def __str__(self):return self.timefish_tank/index/serializers.py(沒有的文件就右鍵新建)
from rest_framework import serializers from index.models import Sensors class SensorSerializer(serializers.ModelSerializer):class Meta:model = Sensorsfields = ['time', 'temperature','water_level','oxygen']fish_tank/index/urls.py
from django.conf.urls import url from index import viewsurlpatterns = [url(r'^post', views.Sensors_api.as_view(),name='sensor.Sensors_api'),url(r'^get', views.SensorView.as_view(),name='sensor.Sensors_api'), ]這里新建了兩個網址,post用來接收樹莓派上傳的數據,得到的是所有的數據;get用來顯示最新的數據,因為我們只需要當前的數據。為什么要寫成兩個網址呢?是因為post用的接口和get不一樣,get用的那個接口可以顯示最新值,但是post的那個接口我沒有找到如何顯示最新的值的方法,所以就寫了兩個網址,一個用來接收數據,一個用來顯示最新數據到服務器上,后續小程序也方便get到最新數據。
fish_tank/index/views.py
這里就可以看出來,我post用的是ListCreateAPIView這個接口,get用的是APIView這個接口。
到此,樹莓派上成功搭建起了一個web服務器。
2.在樹莓派上搭建MySQL數據庫
在樹莓派上設置安裝MySQL,設置用戶名密碼,推薦鏈接:點我
注意這里設置的用戶名密碼要和setting里連接的一樣。
建議在pc端下載Navicate,連接樹莓派上的數據庫,這樣有了圖形化界面,建表看著也舒心。
然后執行給數據庫建表的兩句代碼:
參考鏈接:點我
Navicate與樹莓派數據庫連接成功:
到此,數據庫和服務器全都創建成功,并且進行了連接。
3.樹莓派把數據post到服務器上
在剛才樹莓派post.py后面加上此代碼:
# Post Data to webpagerqs_headers={'Content-Type': 'application/json'}requrl ='http://192.168.43.121:8000/sensor/post/'new_data = {"time": datetime.datetime.now(),"temperature": temperature,"water_level": water_level,"oxygen": oxygen}class ComplexEncoder(json.JSONEncoder):def default(self, obj):if isinstance(obj, datetime.datetime):return obj.strftime('%Y-%m-%d %H:%M:%S')elif isinstance(obj, datetime.date):return obj.strftime('%Y-%m-%d')else:return json.JSONEncoder.default(self, obj)test_data = json.dumps(new_data, cls=ComplexEncoder)response = requests.post(url=requrl, headers=rqs_headers, data=test_data)time.sleep(50);運行服務器:
記得要先進入項目的文件夾在文件夾在運行哦
運行:
在瀏覽器上輸入:192.168.43.121:8000/sensor/post/和192.168.43.121:8000/sensor/get/
192.168.43.121是我樹莓派的ip地址,你們輸網址的時候要改成自己的ip地址。
運行post.py文件,可以看到post頁面獲取到了所有的值,get頁面獲取到了最新值,Navicat中可以看到數據庫里更新了值。
post頁面:
get頁面:
Navicat連接數據庫頁面:
如果你不想手動點擊post.py,而是想讓它自動每60秒執行一次,可以:
這個時候post.py里的while 1 就可以去掉了。我把自動執行的放到post2.py里,手動執行的放在post.py里,手動的方便調試,自動的最后使用。
至此,由arduino獲取傳感器數值,并傳給樹莓派,樹莓派上傳到服務器,通過服務器寫入到數據庫就完成了。
三、微信小程序通過服務器獲取數據庫的值
最后一步!!終于快寫完了!!
我們要開發一個微信小程序,讓小程序通過服務器獲取到傳感器的數值。
微信小程序課程推薦的B站鏈接:
下載微信開發者工具
注冊賬號,獲取到appid
其實不用做那么復雜,只需要改兩段代碼,其他的默認就行:
index.wxml
這里只加了一個按鈕
index.js
這里get數據。
在手機上運行的結果:(我點擊按鈕會出來傳感器數值)
總結
終于寫完了,最后再整體捋一遍
1、arduino獲取傳感器數值
2、arduino與樹莓派進行通訊,樹莓派獲取傳感器數值
3、樹莓派將數值上傳到服務器上,通過服務器寫入數據庫,服務器用Django寫,然后與樹莓派上數據庫進行連接。
4、微信小程序通過服務器獲取數據庫值。
我去歇一會兒。
總結
以上是生活随笔為你收集整理的【物联网毕设】基于Arduino与树莓派的智能鱼缸【二】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 两种启动模式安装windows操作系统
- 下一篇: Keras搭建序贯式模型