
โครงการนี้มีจุดมุ่งหมายเพื่อสร้างสถานีพลังงานแสงอาทิตย์ทางการเกษตรที่เป็นอิสระสำหรับการใช้งานทางการเกษตรที่แม่นยำอุปกรณ์นี้มีพื้นฐานมาจาก Raspberry Pi & Arduino ด้วยเครื่องวัดความเร็วลมอัลตราโซนิกและเซ็นเซอร์ดินต้านทานและ DHT22 สำหรับอุณหภูมิอากาศและความชื้นอื่น ๆ Farmos ช่วยให้คุณจัดการข้อมูลเซ็นเซอร์ขนาดใหญ่ได้อย่างง่ายดายในขณะที่ตรวจสอบเซ็นเซอร์ฟาร์มและรายงานทั้งหมดในแพลตฟอร์มเดียวนอกจากนี้ยังสามารถทำหน้าที่เป็น DAAs สำหรับแอปพลิเคชันอื่น ๆ ผลิตภัณฑ์นี้เป็นสายแรกของ FarmTopia IOF (Internet of Farm) และเป็นที่รู้จักกันดีในการสนับสนุนภารกิจ Godan สำหรับข้อมูลการเกษตรที่ง่ายและเปิด
| ข้อมูลที่วัดได้ | ยังไง |
|---|---|
| ความเร็วลมและความถี่ในทิศทาง 3 มิติ | โดยการคำนวณข้อผิดพลาดอัลตราโซนิก |
| อุณหภูมิอากาศและความชื้น | เซ็นเซอร์ AM2301 |
| ตำแหน่ง GPS | ดองเกิล USB GBS |
| ความชื้นในดิน | เซ็นเซอร์ดินต้าน |
| ส่วนเสริมเสริม | - |
Raspberry Pi Set: ซึ่งเป็นคอมพิวเตอร์ RP ที่มี SD preloaded กับ Raspberry OS และกล้อง pinoir (เสริม) เครื่องวัดความเร็วสูง 6xultrasonic: วางในทิศทางตั้งฉากหันหน้าเข้าหากัน (XYZ) เป็นเครือข่ายที่มีทริกเกอร์ที่แตกต่างกัน Dongles: GPS Dongle (เป็นทางเลือก/คุณสามารถอินพุตพิกัด GPS ด้วยตนเอง), ดองเกิล 4G (เป็นทางเลือก) หากไม่มีการครอบคลุมระบบสุริยจักรวาล WiFi: แผงเซลล์แสงอาทิตย์ 30W พื้นฐานที่ชาร์จแบตเตอรี่ซูเปอร์พอลิเมอร์หลักผ่านการชาร์จพลังงานแสงอาทิตย์ MPPT การกำหนดค่ามีจุดมุ่งหมายเพื่อรักษาเสถียรภาพของ RPI Power Supply Farmos: ซึ่งเป็นระบบการจัดการโอเพนซอร์ซฟาร์มที่จะทำหน้าที่เป็นส่วนต่อประสานกับระบบเพื่อดูและวิเคราะห์ข้อมูลเซ็นเซอร์
| ตัวเลข | อุปกรณ์ |
|---|---|
| 1 | Raspberry Pi 4, 8GB |
| 1 | การ์ด SD 128 |
| 1 | Arduino Mega 2560 |
| 1 | สายเคเบิล arduino usb |
| 6 | JSNR04T ultrasonics (วางห่างกัน 40 ซม.) |
| 1 | เซ็นเซอร์อุณหภูมิและความชื้น AM2301 |
| 1 | โมดูลเซ็นเซอร์ความชื้นในดิน Arduino |
| 1 | แพ็คแบตเตอรี่ Raspberry Pi 4 |
| 1 | MINI-USB ถึง USB Cable |
| 1 | MPPT Solar Charger Controller 20A 12/24VDC พร้อมเอาต์พุต USB |
| 1 | 12V super polymer li-ion battery-6800 mah |
| 1 | แผงโซลาร์เซลล์ 18V 30W |
| 1 | Frame Station Frame 3D พิมพ์หรือ Stanlesteel |
| ตัวเลข | อุปกรณ์ |
|---|---|
| 1 | หน้าจอสัมผัส |
| 1 | กล้อง Raspberry Pinoir 2 |
| 1 | Raspberry USB GPS Dongle |
| 1 | เซ็นเซอร์ MLX9046 IR |

| ชื่อไฟล์ | คำอธิบาย |
|---|---|
| readme.md | การแนะนำโครงการ |
| arduino_weather.ino | แอปพลิเคชั่นตรวจจับสภาพอากาศหลัก |
| dht.cpp | DHT Driver & Class Functionalites สำหรับ AM2301 |
| dht.h | ไฟล์ส่วนหัวสำหรับเอกสารระดับ DHT คลาสและฟังก์ชั่น |
| Special_debug_functions.ino | กรณีทดสอบหน่วยเป็นโปรแกรมการดีบัก |
| wind_auto.cpp | ฟังก์ชั่นการวัดสภาพอากาศ |
| wind_auto.h | ไฟล์ส่วนหัวสำหรับเอกสารระดับลมและฟังก์ชั่น |
| aggregator.sh | สคริปต์ RPI Bash เพื่อจับ Arduino Serial และ Package JSON รวมไปยังเซิร์ฟเวอร์ FarmOS |
-First ติดตั้ง RPI OS (เวอร์ชันเต็ม) บนการ์ด 128GB SD ขอแนะนำว่า SD นั้นเร็วที่สุดเท่าที่จะทำได้เพื่อเพิ่มประสิทธิภาพโดยรวมของ PI หากคุณใช้หัว PI แบบไม่มีหัวเปิดใช้งาน SSH บนไฟล์การกำหนดค่าคุณสามารถค้นหาได้ในพาร์ติชันบูต
-ส่วนใหญ่ของการพึ่งพานี้อาจติดตั้งไว้ล่วงหน้า แต่ก็เป็นความคิดที่ดีที่จะตรวจสอบอีกครั้ง:
sudo apt-get update && sudo apt-get upgrade
sudo apt-get install libffi-dev libssl-dev
sudo apt install python3-dev
sudo apt-get install -y python3 python3-pip
sudo apt-get install php5 -y
sudo apt install php-gd php-xml php-xmlrpc
sudo apt install mariadb-server
sudo apt-get install apache2 -y
sudo apt-get install gpsd gpsd-clients python-gps
sudo apt-get install arduino
git clone https://github.com/tbird20d/grabserial
-ติดตั้ง Docker กับ CLI
sudo curl -sSL https://get.docker.com | sudo sh
sudo pip3 install docker-compose
sudo systemctl enable docker
-ติดตั้ง Farmos ในท้องถิ่นบน Docker
Farmos เป็นแอปพลิเคชั่นบนเว็บสำหรับการจัดการฟาร์มการวางแผนและการเก็บบันทึก ได้รับการพัฒนาโดยชุมชนของเกษตรกรนักพัฒนานักวิจัยและองค์กรโดยมีจุดประสงค์เพื่อจัดหาแพลตฟอร์มมาตรฐานสำหรับการรวบรวมและจัดการข้อมูลการเกษตร
เราใช้ FarmOS เพื่อเชื่อมต่อกับเซ็นเซอร์อย่างรวดเร็วและวิเคราะห์ข้อมูลขนาดใหญ่ของพวกเขา
git clone https://github.com/farmOS/farmOS.git
cd farmOS
sudo docker build -t farmos .
sudo docker run -p 80:80 -v ${PWD}/.data/www:/var/www/html farmos
คุณควรอ้างถึงคู่มือนี้บนเว็บไซต์ทางการของ Farmos สำหรับรายละเอียดเพิ่มเติม
คุณสามารถอ้างถึงคู่มือออนไลน์นี้เพื่อช่วยคุณกำหนดค่าการติดตั้ง FarmOS
ก่อนอื่นตรวจสอบให้แน่ใจว่ามีการเปิดใช้งานโมดูลเซ็นเซอร์บน FarmOS คุณสามารถเปิดใช้งานและเพิ่มโมดูลผ่านสาขาการพัฒนา (เพียงแค่ผู้ใช้สุดยอดบนแพลตฟอร์มท้องถิ่น) หากคุณใช้บริการโฮสติ้งให้แน่ใจว่าขอให้พวกเขาเปิดใช้งานโมดูลเซ็นเซอร์
ติดตั้งไลบรารีต่อไปนี้ด้วย Arduino Library Manager ของคุณใน Sketch> รวมไลบรารี> จัดการไลบรารี ... SoftWareserial
คุณสามารถอ้างถึง Adafruit DHT Library สำหรับ DHT doucmentation อย่างไรก็ตามด้วยเหตุผลบางอย่างที่พวกเขาไม่อ่านอุณหภูมิและความชื้นร่วมกันดังนั้นเราจะใช้ฟังก์ชั่น DHT.Read กับข้อมูล [] บัฟเฟอร์ในฟังก์ชั่นใหม่ที่เรียกว่า RENED_TEMP_HU (DHT, ลอย*, ลอย*)
สร้างขึ้นในสองคลาส JSNR04T ซึ่งเป็นคลาสอินเตอร์เฟสที่ให้อินสแตนซ์ของชิปอัลตราโซนิก JSNR04T ใน โหมดอัตโนมัติ โดยมีฟังก์ชั่นที่จำเป็นในการใช้อุปกรณ์เป็นเครื่องมือวัดลมโดยใช้ความแตกต่างในการวัดอัลตราโซนิก และระดับลมซึ่ง preforms ตรรกะทางคณิตศาสตร์บนข้อมูลที่บันทึกไว้เพื่อส่งออกรายละเอียดสภาพอากาศที่จำเป็น
| ชื่อฟังก์ชั่น | ป้อนข้อมูล | กลับ | คำอธิบาย |
|---|---|---|---|
| JSNR04T (ตัวสร้าง) | uint8_t enpin, uint8_t rxpin, uint8_t type, uint16_t max_range) | โมฆะ | สร้างวัตถุใหม่ของประเภท JSNR0RT ที่ทำหน้าที่เป็นอินสแตนซ์ของไดรเวอร์อัลตราโซนิกที่มี ENPIN สำหรับการเปิดใช้งานพื้นดิน RXPIN สำหรับ Echo & Type สำหรับประเภทการทำงาน |
| jsnr04t.begin | โมฆะ | โมฆะ | เปิดใช้งาน (ทริกเกอร์) อัลตราโซนิกจากนั้นระบุและเริ่มการสื่อสารแบบอนุกรมใหม่ด้วย |
| jsnr04t.virtual_trigger | โมฆะ | โมฆะ | ตั้งค่าพินภาคพื้นดินสำหรับอัลตราโซนิกต่ำดังนั้นจึงเริ่มต้นการทำงานปกติ |
| jsnr04t.resettimeout | uint8_t หมดเวลา | โมฆะ | เปลี่ยนการหมดเวลามิลลิวินาทีของการวัดอัลตราโซนิกเพื่อเปลี่ยนช่วง |
| jsnr04t.normalize | โมฆะ | โมฆะ | ระยะห่างระหว่าง ultrasonics สองตัวในสภาพที่ไม่มีลมเพื่ออัปเดต Nowind_distance |
| jsnr04t.readjsnr04tserial | โมฆะ | int | อ่านเอาต์พุตเสียงสะท้อนแบบอนุกรมของอัลตราโซนิกและแปลงเป็น int/nan ในกรณีที่อ่านไม่ถูกต้อง |
| jsnr04t.get_selfecho | โมฆะ | uint16_t | รีเซ็ตการหมดเวลาเพื่อเปลี่ยนช่วงเพื่อให้เซ็นเซอร์อ่านเฉพาะเสียงสะท้อน |
| jsnr04t.get_selfwindspeed | โมฆะ | int | อ่านเวลาที่จำเป็นสำหรับอัลตราโซนิกเพื่ออ่านเสียงสะท้อนของตัวเอง (ไปกลับ) และเปลี่ยนเป็น Windspeed |
| jsnr04t.transform_read | uint16_t x | ลอย | แปลงระยะทางที่วัดได้ด้วยอัลตราโซนิกจาก MM เป็นความเร็วลม (เทียบกับความเร็วเสียง) |
| ลม (ตัวสร้าง) | JSNR04T*, JSNR04T* | โมฆะ | สร้างวัตถุประเภทลมซึ่งใช้อัลตราโซนิกคู่หนึ่งเพื่อวัดความเร็วลมระหว่างพวกเขา |
| wind.update | โมฆะ | โมฆะ | อัปเดตค่าคลาสของความเร็วลมโดยการอ่านใหม่และคำนวณอัตราการเปลี่ยนแปลงของ Windspeed |
| wind.get_avergewind | โมฆะ | ลอย | คำนวณค่าเฉลี่ยของ 4 การวัดระหว่างคู่อัลตราโซนิกตามโหมดการทำงาน |
| wind.get_echofromahead | โมฆะ | uint16_t | อ่านเสียงสะท้อนของเซ็นเซอร์หันหน้าไปทาง |
| Renew_temp_hu | dht, ลอย* อุณหภูมิ, ลอย* ฮัม | โมฆะ | อัปเดตค่าอุณหภูมิและความชื้นสำหรับเซ็นเซอร์ DHT ที่กำหนด |
| get_speedofsound | ลอย TC, ลอย RH | ลอย | ประมาณความเร็วของเสียงในอุณหภูมิอากาศและความชื้นตาม |
| set_windsensor | DHT | โมฆะ | ผ่านตัวชี้ของ DHT ไปยังระดับลม |
| get_echofromahead | JSNR04T U1, JSNR04T U2 | int | ฟังก์ชั่น indpedandt เพื่ออ่านเสียงสะท้อนของเซ็นเซอร์หันหน้าไปทาง (สำหรับการทดสอบ) |
| wind_cycle | Wind* Windx, Wind* Windy, Wind* Windz | โมฆะ | คำนวณและปรับปรุงความเร็วลมและค่าเฉลี่ย (50 ค่าเฉลี่ย) ความเร็วลมของวัตถุลม 3 ชนิดที่แสดงถึงลมใน 3D |
กำหนดค่าพินและการกำหนดค่าที่ต้องการสร้างวัตถุรอบตามประเภทการกำหนดค่าพินและประเภทเซ็นเซอร์ระบุตัวแปรวัฏจักร
#define DHTPIN 53
#define mutual 0
#define soil_analog A0
#define soil_max 550
#define soil_min 10
#define Cycle_offset 10
#define DHTTYPE DHT21
DHT dht(DHTPIN, DHTTYPE);
JSNR04T Ux1(45,10,mutual,2000) ,Ux2(37,13,mutual,2000),Uy1(47,50,mutual,2000),Uy2(31,10,mutual,2000) ,Uz1(41,12,mutual,2000),Uz2(39,11,mutual,2000);
Wind WindX(&Ux1,&Ux2), WindY(&Uy1,&Uy2) ,WindZ(&Uz1,&Uz2);
float CycTemp , CycHum , _CSS=340 , winspeed;
โทรหา wind_cycle เพื่ออัปเดตค่าทั้งหมด
wind_cycle(&WindX ,&WindY, &WindZ);
หรือเพียงแค่เรียก wind.update เพื่ออัปเดตความเร็วทันทีของมิติใด ๆ
Windx.update();
พิมพ์ค่าเป็นพอร์ตอนุกรมเป็น JSON
"พารามิเตอร์": "ค่า",
Serial.print(""Wind_Speed_x": ");Serial.print(""");Serial.print(WindX.avgwind);Serial.print(""");Serial.print(" , ");
Serial.print(""Maximum_Speed_x": ");Serial.print(""");Serial.print(WindX.maxwind);Serial.print(" , ");
Serial.print(""Minmimum_Speed_x": ");Serial.print(""");Serial.print(WindX.minwind);Serial.print(""");Serial.print(" , ");
Serial.print(""Wind_frequencyofchange_x": ");Serial.print(""");Serial.print(WindX.gust);Serial.print(""");Serial.print(" , ");
ใช้ Allmiss เพื่อปรับความล่าช้าของวัฏจักรให้เข้ากับข้อผิดพลาดในการวัดดังต่อไปนี้
cycledelay=19000; // or as you preferred settings depending on power consumption
allmiss=(WindX._selfmiss+WindY._selfmiss+WindZ._selfmiss)*selfecho_timeout; // adobt self cycle delay into main delay
allmiss+=(WindX._aheadmiss+WindY._aheadmiss+WindZ._aheadmiss)*headecho_timeout;
allmiss+= _tempmiss;
_tempmiss=0;
cycledelay-=allmiss;
delay(cycledelay);
ใช้ special_debug_functions.ino เพื่อวินิจฉัยแอปพลิเคชันด้วยการทดสอบหน่วยขั้นตอน
if(dht.working) //doesn't update before 2 seconds
delay(10);
ultradis=Uz1.get_selfecho();
Serial.print("ultrasonic z1 is ");Serial.println(ultradis);
winspeed=Uz1.transform_read(ultradis);
Serial.print("ultrasonic z1 windspeed "); Serial.println(winspeed);
ultradis=Uz2.get_selfecho();
Serial.print("ultrasonic z2 is ");Serial.println(ultradis);
winspeed=Uz2.transform_read(ultradis);
Serial.print("average is");Serial.println(winspeed);
delay(1000);
winspeed=WindZ.get_avergewind();
Serial.print("average wind is ");Serial.println(winspeed);
wind_cycle(&WindX ,&WindY, &WindZ);
allmiss=(WindX._selfmiss+WindY._selfmiss+WindZ._selfmiss)*selfecho_timeout;
allmiss+=(WindX._aheadmiss+WindY._aheadmiss+WindZ._aheadmiss)*headecho_timeout;
allmiss+= _tempmiss;
//build the diagnostic or unit test according to your needs
งาน cron เปิดใช้งานสคริปต์ทุก ๆ 10 นาทีสคริปต์ใช้ grabserial เพื่อจับ Arduino serial เป็นเวลา 30 วินาทีและเริ่มนับเมื่อมันจับตัวยึดแพ็คเก็ต JSON และเลิกเมื่อเห็นวงเล็บปิดในขณะที่มันใช้เวลา 10 วินาที (100 ตัวอย่างตัวอย่าง) การใช้สคริปต์ (แทนที่! public_key &! private_key ด้วยการกำหนดค่าเซ็นเซอร์ของคุณ
python3 /home/pi/grabserial/grabserial -d /dev/ttyACM0 -b 9600 -o /home/pi/serialtest.json -e 30 -m "^{.*" -q "}"
curl -H "Content-Type: application/json" -X POST -d "@/home/pi/serialtest.json" https://farmtopia.farmos.net/farm/sensor/listener/!public_key?private_key=!private_key --verbose
โครงการ OpenSource นี้และส่วนประกอบทั้งหมดเป็นความรับผิดชอบ แต่เพียงผู้เดียวของนักพัฒนาและแม้ว่า FarmTopia จะใช้อุปกรณ์ที่คล้ายกันเพื่อสร้างเวอร์ชันเชิงพาณิชย์ของสถานีอากาศนี้ แต่ก็ไม่จำเป็นต้องใช้ sourcecode หรือตรรกะหรือส่วนประกอบฮาร์ดแวร์เดียวกัน
ใบอนุญาต MIT