毕业设计 单片机智慧农业管理系统 -大棚管理系统 自动灌溉系统
文章目錄
- 0 前言
- 1 簡介
- 2 主要器件
- 3 實(shí)現(xiàn)效果
- 4 硬件設(shè)計(jì)
- LoRa發(fā)射器:土壤濕度傳感器+AHT10溫濕度傳感器
- LoRa接收器:Lora Radio (433M/868M/915M)
- 設(shè)置Lora土壤濕度發(fā)射器
- 設(shè)置Loara接收器
- 5 軟件說明
- 發(fā)射器代碼
- 接收器的代碼
- 5 最后
0 前言
🔥 這兩年開始畢業(yè)設(shè)計(jì)和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點(diǎn),往往達(dá)不到畢業(yè)答辯的要求,這兩年不斷有學(xué)弟學(xué)妹告訴學(xué)長自己做的項(xiàng)目系統(tǒng)達(dá)不到老師的要求。
為了大家能夠順利以及最少的精力通過畢設(shè),學(xué)長分享優(yōu)質(zhì)畢業(yè)設(shè)計(jì)項(xiàng)目,今天要分享的是
🚩 基于單片機(jī)的智慧農(nóng)業(yè)管理系統(tǒng)
🥇學(xué)長這里給一個(gè)題目綜合評分(每項(xiàng)滿分5分)
- 難度系數(shù):3分
- 工作量:3分
- 創(chuàng)新點(diǎn):3分
1 簡介
本項(xiàng)目中介紹如何制作基于物聯(lián)網(wǎng)LoRa的智慧農(nóng)業(yè)和遠(yuǎn)程監(jiān)控系統(tǒng)。智慧農(nóng)業(yè)意味著監(jiān)測影響作物生產(chǎn)的環(huán)境條件以及跟蹤牲畜健康指標(biāo)。基于LoRa的農(nóng)業(yè)物聯(lián)網(wǎng)技術(shù)可提高效率,減少對環(huán)境的影響,最大限度地提高產(chǎn)量并最大限度地減少開支。基于LoRa設(shè)備和LoRaWAN協(xié)議的智慧農(nóng)業(yè)用例已經(jīng)表現(xiàn)出明顯的優(yōu)勢,例如商業(yè)農(nóng)場的用水量減少了50%。
該項(xiàng)目使用LoRa土壤濕度傳感器電路板模塊,該模塊基于Atmega328P微控制器、LoRa模塊RFM95和AHT10溫濕度傳感器。AHT10溫濕度傳感器測量當(dāng)?shù)乜諝鉁囟群蜐穸取k娙菔酵寥罎穸葌鞲衅鳒y量土壤濕度。所有測量數(shù)據(jù)都可以無線發(fā)送至15公里的距離,并且可以被接收器讀取。發(fā)射器和接收器都是使用LoRa模塊設(shè)計(jì)。
2 主要器件
- AHT10土壤濕度傳感器發(fā)射器
- LoRa接收器
- USB轉(zhuǎn)UART模塊(FTDI模塊)
- AAA電池
- Micro-USB數(shù)據(jù)線
3 實(shí)現(xiàn)效果
打開發(fā)送器和接收器的串口監(jiān)視器。Lora發(fā)射器和接收器將啟動(dòng)并相互通信。
發(fā)射器將讀取土壤濕度數(shù)據(jù),該數(shù)據(jù)可以轉(zhuǎn)換為百分比值。同樣,AHT10將收集空氣濕度和溫度數(shù)據(jù),然后傳輸?shù)絃ora網(wǎng)關(guān)。
發(fā)射器發(fā)送數(shù)據(jù)后進(jìn)入深度睡眠模式或省電模式。在數(shù)據(jù)傳輸模式下,它消耗大約0.2mA的電流。在省電模式下,電流降低至0.75μA。通過增大數(shù)據(jù)傳輸?shù)拈g隔,電池壽命可以增加到幾個(gè)月。
4 硬件設(shè)計(jì)
LoRa發(fā)射器:土壤濕度傳感器+AHT10溫濕度傳感器
發(fā)射器電路板由Lora土壤濕度傳感器和AHT10溫濕度傳感器組成。該電路板使用的微控制器是支持Arduino編程的Atmel的Atmega328P。AHT10傳感器收集當(dāng)?shù)乜諝鉁囟群蜐穸取k娙菔酵寥罎穸葌鞲衅鳈z測土壤濕度。該傳感器基于555定時(shí)器。Lora無線接收器和發(fā)射器必須采用相同的工作頻率。否則,它不會(huì)從另一個(gè)接收任何數(shù)據(jù)。發(fā)射器使用LoRa模塊RFM95將本地環(huán)境數(shù)據(jù)傳輸?shù)骄W(wǎng)關(guān)。
Lora發(fā)射器由一對AAA電池供電。設(shè)備每隔幾分鐘定期傳輸數(shù)據(jù),然后進(jìn)入睡眠模式以節(jié)省電池電量。根據(jù)代碼和硬件設(shè)置,這項(xiàng)傳感器功能可以關(guān)閉,或者只在短時(shí)間內(nèi)開啟。因此,由于睡眠模式和低功耗模式,電池壽命可以延長幾個(gè)月。電容式土壤濕度傳感器涂有防水涂料,因此即使傳感器長時(shí)間浸入土壤中也不會(huì)產(chǎn)生任何腐蝕作用。該模塊適用于智能農(nóng)場、灌溉、農(nóng)業(yè)等應(yīng)用。
ATmega328芯片集成了Arduino引導(dǎo)加載程序,因此可以使用Arduino IDE輕松編程。我們只需要一個(gè)USB轉(zhuǎn)TTL轉(zhuǎn)換器模塊。
LoRa接收器:Lora Radio (433M/868M/915M)
Lora Radio接收器是基于ATmega328和433MHZ/868MHz/915MHz RFM95 LoRa模塊的主板。LoRa Radio接收器允許用戶以低數(shù)據(jù)速率發(fā)送數(shù)據(jù)并達(dá)到極遠(yuǎn)的范圍。它提供超長距離擴(kuò)頻通信和高抗干擾性,同時(shí)最大限度地減少電流消耗。它在此板上具有Arduino pro mini 3.3V 8MHz引導(dǎo)加載程序,并使用CP2104作為USB轉(zhuǎn)串口使用Arduino IDE上傳代碼。在這個(gè)LoRa智慧農(nóng)業(yè)項(xiàng)目中,我們將使用它作為接收器網(wǎng)關(guān)。
設(shè)置Lora土壤濕度發(fā)射器
為了將代碼上傳到發(fā)射器,需要焊接一個(gè)5針的插頭。所以首先在這里焊接插頭。
現(xiàn)在您需要連接USB轉(zhuǎn)UART模塊以使用Arduino IDE上傳Atmega328的代碼。請注意,USB轉(zhuǎn)UART轉(zhuǎn)換器中的DTR需要連接到復(fù)位引腳。如果沒有DTR,您可能需要手動(dòng)按下復(fù)位按鈕來上傳代碼。
在模塊背面安裝AAA電池。
現(xiàn)在為了使用Arduino IDE對Lora傳感器電路板進(jìn)行編程,在Arduino IDE中選擇默認(rèn)的一個(gè)電路板。從頂部的Arduino IDE菜單中,選擇Tools-> Board-> Arduino Pro 或 Pro Mini。同時(shí)選擇Tools-> Processor-> Atmega328P(3.3V,8Mhz)。
設(shè)置Loara接收器
Lora接收器不需要USB轉(zhuǎn)UART模塊,因?yàn)樗梢允褂肕icro-USB數(shù)據(jù)線直接編程。
該板使用相同的電路板型號(hào)進(jìn)行編程。所以在Arduino IDE中選擇Arduino Pro 或 Pro mini以及ATmega328P (3.3V,8Mhz) 處理器。
5 軟件說明
發(fā)射器代碼
使用Lora發(fā)射傳感器數(shù)據(jù)的代碼共分為3個(gè)文件:Main.ino、I2C_AHT10.cpp和I2C_AHT10.h文件
在編譯代碼之前需要將RFM95庫添加到Arduino IDE中。因此,從下面的鏈接下載RFM95庫并將其添加到庫文件夾中。
根據(jù)您使用的電路板修改Lora頻率的宏定義是433Mhz還是868Mhz還是915Mhz。
如果你的Lora電路板是433MHz:
#define RF95_FREQ 433.0Main.ino
#include <SPI.h> #include "RH_RF95.h"#include "I2C_AHT10.h" #include <Wire.h> AHT10 humiditySensor;int sensorPin = A2; // select the input pin for the potentiometer int sensorValue = 0; // variable to store the value coming from the sensor int sensorPowerCtrlPin = 5;void sensorPowerOn(void) {digitalWrite(sensorPowerCtrlPin, HIGH);//Sensor power on } void sensorPowerOff(void) {digitalWrite(sensorPowerCtrlPin, LOW);//Sensor power on }#define RFM95_CS 10 #define RFM95_RST 4 #define RFM95_INT 2// Change to 434.0 or other frequency, must match RX's freq! #define RF95_FREQ 433.0// Singleton instance of the radio driver RH_RF95 rf95(RFM95_CS, RFM95_INT);void setup() {pinMode(RFM95_RST, OUTPUT);digitalWrite(RFM95_RST, LOW);delay(100);digitalWrite(RFM95_RST, HIGH);pinMode(sensorPowerCtrlPin, OUTPUT);//digitalWrite(sensorPowerCtrlPin, LOW);//Sensor power on sensorPowerOn();//pinMode(sensorPin, INPUT);//while (!Serial);Serial.begin(115200);delay(100);Wire.begin(); //Join I2C bus//Check if the AHT10 will acknowledgeif (humiditySensor.begin() == false){Serial.println("AHT10 not detected. Please check wiring. Freezing.");//while (1);}elseSerial.println("AHT10 acknowledged.");Serial.println("Marduino LoRa TX Test!");// manual resetdigitalWrite(RFM95_RST, LOW);delay(10);digitalWrite(RFM95_RST, HIGH);delay(10);while(!rf95.init()) {Serial.println("LoRa radio init failed");while (1);}Serial.println("LoRa radio init OK!");//rf95.setModemConfig(Bw125Cr48Sf4096);//Defaults after init are 434.0MHz, modulation GFSK_Rb250Fd250, +13dbMif (!rf95.setFrequency(RF95_FREQ)) {Serial.println("setFrequency failed");while (1);}Serial.print("Set Freq to: "); Serial.println(RF95_FREQ);// Defaults after init are 434.0MHz, 13dBm, Bw = 125 kHz, Cr = 4/5, Sf = 128chips/symbol, CRC on// The default transmitter power is 13dBm, using PA_BOOST.// If you are using RFM95/96/97/98 modules which uses the PA_BOOST transmitter pin, then // you can set transmitter powers from 5 to 23 dBm:rf95.setTxPower(23, false);//dht.begin(); }int16_t packetnum = 0; // packet counter, we increment per xmission float temperature=0.0;// float humidity=0.0;void loop() {// Reading temperature or humidity takes about 250 milliseconds!// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)//float humidity = 6.18;//dht.readHumidity();// Read temperature as Celsius (the default)sensorPowerOn();//delay(100);sensorValue = analogRead(sensorPin);delay(200);if (humiditySensor.available() == true){//Get the new temperature and humidity valuetemperature = humiditySensor.getTemperature();humidity = humiditySensor.getHumidity();//Print the resultsSerial.print("Temperature: ");Serial.print(temperature, 2);Serial.print(" C\t");Serial.print("Humidity: ");Serial.print(humidity, 2);Serial.println("% RH");}// Check if any reads failed and exit early (to try again).if (isnan(humidity) || isnan(temperature)) {Serial.println(F("Failed to read from AHT sensor!"));//return;}delay(100);//sensorPowerOff();Serial.print(F("Moisture ADC : "));Serial.println(sensorValue);//Serial.print(F("Humidity: "));//Serial.print(humidity);//Serial.print(F("% Temperature: "));//Serial.print(temperature);//Serial.println("Humidity is " + (String)humidity);//Serial.println("Temperature is " + (String)temperature);String message = "#"+(String)packetnum+" Humidity:"+(String)humidity+"% Temperature:"+(String)temperature+"C"+" ADC:"+(String)sensorValue;Serial.println(message);packetnum++;Serial.println("Transmit: Sending to rf95_server");// Send a message to rf95_serveruint8_t radioPacket[message.length()+1];message.toCharArray(radioPacket, message.length()+1);radioPacket[message.length()+1]= '\0';Serial.println("Sending..."); delay(10);rf95.send((uint8_t *)radioPacket, message.length()+1); Serial.println("Waiting for packet to complete..."); delay(10);rf95.waitPacketSent();// Now wait for a replyuint8_t buf[RH_RF95_MAX_MESSAGE_LEN];uint8_t len = sizeof(buf);Serial.println("Waiting for reply..."); delay(10);if(rf95.waitAvailableTimeout(8000)){// Should be a reply message for us now if (rf95.recv(buf, &len)){Serial.print("Got reply: ");Serial.println((char*)buf);Serial.print("RSSI: ");Serial.println(rf95.lastRssi(), DEC); }else{Serial.println("Receive failed");}}else{Serial.println("No reply, is there a listener around?");}delay(1000); }接收器的代碼
#include <SPI.h> #include <RH_RF95.h>#define RFM95_CS 10 #define RFM95_RST 9 #define RFM95_INT 2// Change to 434.0 or other frequency, must match RX's freq! #define RF95_FREQ 433.0// Singleton instance of the radio driver RH_RF95 rf95(RFM95_CS, RFM95_INT);int count=0;void setup() { pinMode(RFM95_RST, OUTPUT);digitalWrite(RFM95_RST, HIGH);//while (!Serial);Serial.begin(115200);delay(100);Serial.println("Arduino LoRa RX Test!");// manual resetdigitalWrite(RFM95_RST, LOW);delay(10);digitalWrite(RFM95_RST, HIGH);delay(10);while (!rf95.init()) {Serial.println("LoRa radio init failed");while (1);}Serial.println("LoRa radio init OK!");// Defaults after init are 434.0MHz, modulation GFSK_Rb250Fd250, +13dbMif (!rf95.setFrequency(RF95_FREQ)) {Serial.println("setFrequency failed");while (1);}Serial.print("Set Freq to: "); Serial.println(RF95_FREQ);// Defaults after init are 434.0MHz, 13dBm, Bw = 125 kHz, Cr = 4/5, Sf = 128chips/symbol, CRC on// The default transmitter power is 13dBm, using PA_BOOST.// If you are using RFM95/96/97/98 modules which uses the PA_BOOST transmitter pin, then // you can set transmitter powers from 5 to 23 dBm:rf95.setTxPower(23, false); }void loop() {if (rf95.available()){// Should be a message for us now uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];uint8_t len = sizeof(buf);if (rf95.recv(buf, &len)){count++; RH_RF95::printBuffer("Received: ", buf, len);Serial.print("Got: ");Serial.println((char*)buf);Serial.print("RSSI: ");Serial.println(rf95.lastRssi(), DEC);// Send a replyuint8_t data[] = "And hello back to you";rf95.send(data, sizeof(data));rf95.waitPacketSent();Serial.println("Sent a reply");}else{Serial.println("Receive failed");}} }5 最后
總結(jié)
以上是生活随笔為你收集整理的毕业设计 单片机智慧农业管理系统 -大棚管理系统 自动灌溉系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IP与MAC地址绑定
- 下一篇: 服务器kvm虚拟机安装uos系统,qem