
يهدف هذا المشروع إلى بناء محطة مستقلة تعمل بالطاقة الشمسية بالطاقة الشمسية للتطبيق الزراعي الدقيق ، ويستند الجهاز إلى Raspberry Pi & Arduino مع مقياس شدة الجنفات بالموجات فوق الصوتية ومستشعر التربة المقاوم و DHT22 لدرجة حرارة الهواء والرطوبة وغيرها من الوظائف الإضافية المتاحة وفقًا لتطبيقك ، يتم إرسال البيانات والمعلومات التحليلية إلى حزم json ( Dongle) ، تساعدك Farmos على إدارة بيانات المستشعرات الكبيرة بسهولة أثناء مراقبة جميع أجهزة استشعار المزرعة والتقارير في منصة واحدة ، ويمكنها أيضًا أن تعمل كـ DAAs لتطبيقات أخرى. هذا المنتج هو الأول من خط Farmtopia IOF (Internet of Farm) ، ويتم فتحه لدعم Mission Godan للبيانات الزراعية السهلة والمفتوحة ، ويمكنه العمل على حد سواء الثابتة والهاتف المحمول ويمكن تكرارها في المنزل كما هو موضح هنا
| البيانات المقاسة | كيف |
|---|---|
| سرعة الرياح وتواترها في اتجاه ثلاثي الأبعاد | عن طريق حساب الخطأ بالموجات فوق الصوتية |
| درجة حرارة الهواء والرطوبة | مستشعر AM2301 |
| موقع GPS | USB GBS Dongle |
| رطوبة التربة | مستشعر التربة المقاوم |
| الوظائف الإضافية الاختيارية | / |
مجموعة Raspberry PI: وهو جهاز كمبيوتر RP مع SD تم تحميله مسبقًا مع Raspberry OS ، وكاميرا Pinoir (اختيارية) مقياس شدة 6Xultrasonic: موضوعة في اتجاهات عمودية تواجه بعضها البعض (XYZ) كشبكة ذات تمكين مختلف أو مشغلات مختلفة. Dongles: GPS Dongle (اختياري/يمكنك إدخال تنسيق GPS يدويًا) ، 4G دونجل (اختياري) إذا لم يكن هناك نظام شمسي لتغطية WiFi: لوحة شمسية أساسية 30W تتقاضى بطارية البوليمر الرئيسية عبر الشاحن الشمسي MPPT الذي يعمل أيضًا على تشغيل بطارية UPS عبر كابل USB المسؤول عن تشغيل Raspberry Pi الذي يتنقل عبر هذا. يهدف التكوين إلى استقرار RPI Power Supply Farmos: وهو نظام إدارة المصادر المفتوحة للزراعة والذي سيكون بمثابة واجهة للنظام لعرض بيانات المستشعرات وتحليلها.
| رقم | جهاز |
|---|---|
| 1 | Raspberry Pi 4 ، إصدار 8 جيجابايت |
| 1 | بطاقة SD 128 |
| 1 | Arduino Mega 2560 |
| 1 | Arduino USB كابل |
| 6 | jsnr04t الموجات فوق الصوتية (وضعت 40 سم على بعضها) |
| 1 | AM2301 مستشعر درجة الحرارة والرطوبة |
| 1 | وحدة استشعار رطوبة تربة أردوينو |
| 1 | Raspberry Pi 4 حزم البطارية |
| 1 | Mini-USB إلى كابل USB |
| 1 | MPPT Colar Charger Controller 20a 12/222VDC مع إخراج USB |
| 1 | 12V Super Polymer Li-ion Battery-6800 MAH |
| 1 | لوحة الطاقة الشمسية 18V 30W |
| 1 | إطار محطة الطقس ثلاثية المطبوعة أو العلبة stanlesteel |
| رقم | جهاز |
|---|---|
| 1 | شاشة تعمل باللمس |
| 1 | التوت بينوار 2 كاميرا |
| 1 | Raspberry USB GPS Dongle |
| 1 | MLX9046 مستشعر الأشعة تحت الحمراء |

| اسم الملف | وصف |
|---|---|
| readme.md | مقدمة المشروع |
| Arduino_weather.ino | تطبيق الطقس الرئيسي استشعار Arduino |
| DHT.CPP | DHT Driver و Class Functionalites لـ AM2301 |
| DHT.H | ملف الرأس لفئة DHT ووثائق الوظائف |
| Special_debug_functions.ino | حالات اختبار الوحدة كبرنامج تصحيح |
| Wind_auto.cpp | وظائف قياس الطقس |
| Wind_auto.h | ملف الرأس لتوثيق فئة الرياح ودالة |
| Accregator.sh | برنامج RPI Bash Script للقبض على Arduino Serial و Comphregate JSON إلى خادم Farmos |
-قم بتثبيت RPI OS (الإصدار الكامل) على بطاقة SD 128GB ، ينصح أن يكون 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
-install Docker مع CLI
sudo curl -sSL https://get.docker.com | sudo sh
sudo pip3 install docker-compose
sudo systemctl enable docker
-install 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
أولاً ، تأكد من تمكين وحدة Sensor على Farmos ، يمكنك تمكين وإضافة وحدة النمط عبر فرع التطوير (مجرد مستخدم رائع على النظام الأساسي المحلي) ، إذا كنت تستخدم خدمة استضافة ، تأكد من مطالبتهم بتمكين وحدة المستشعرات.
قم بتثبيت المكتبات التالية مع مدير مكتبة Arduino الخاص بك في Sketch> تضمين مكتبة> إدارة المكتبات ... البرمجية
يمكنك الرجوع إلى مكتبة ADAFRUIT DHT من أجل DHT DoCmentation ، ولكن لسبب ما لا يقرؤون درجة الحرارة والرطوبة معًا ، لذلك سوف نستخدم وظيفة DHT.Read مع البيانات [] المخزن المؤقت في وظيفة جديدة تسمى REDINT_TEMP_HU (DHT ، Float* ، float*).
تم تصميمه على فئتين ، JSNR04T وهو فئة واجهة توفر مثيلًا من رقاقة الموجات فوق الصوتية JSNR04T في وضع السيارات ، مع الوظائف المطلوبة لاستخدام الجهاز كأداة لقياس الرياح باستخدام الاختلاف في قراءة القياسات بالموجات فوق الصوتية مع سرعة الصوت التي تم تصنيفها ذاتيًا محسوبة من درجة حرارة الهواء والرطوبة. وفئة الرياح التي تسبق الشكل للمنطق الرياضي على البيانات المسجلة لإخراج تفاصيل الطقس المطلوبة.
| اسم الوظيفة | مدخل | يعود | وصف |
|---|---|---|---|
| JSNR04T (مُنشئ) | uint8_t enpin ، uint8_t rxpin ، uint8_t type ، uint16_t max_range) | فارغ | يقوم بإنشاء كائن جديد من نوع JSNR0RT الذي يتصرف كمثيل للسائق بالموجات فوق الصوتية مع ENPIN لتمكين الأرض ، RXPIN لنوع التشغيل ونوع التشغيل. |
| JSNR04T.Begin | فارغ | فارغ | يمكّن (المشغلات) الموجات فوق الصوتية ثم يحدد وبدء اتصال تسلسلي جديد معه. |
| jsnr04t.virtual_trigger | فارغ | فارغ | اضبط الدبوس الأرضي على ارتفاع الموجات فوق الصوتية حتى يبدأ تشغيله العادي. |
| JSNR04T.RESETTETIMEOUT | uint8_t timeout | فارغ | قم بتغيير مهلة Millisecond لقياس الموجات فوق الصوتية لتغيير النطاق. |
| JSNR04T.Normalize | فارغ | فارغ | قم بإعادة تخصيص المسافة بين اثنين من الموجات فوق الصوتية في حالة عدم وجود حالة الرياح لتحديث NowInd_Distance. |
| JSNR04T.Readjsnr04tserial | فارغ | int | يقرأ إخراج الصدى التسلسلي للموجات فوق الصوتية ويحوله إلى int/nan في حالة القراءة غير الصالحة. |
| JSNR04T.GET_SESHELECHO | فارغ | uint16_t | إعادة تعيين المهلة لتغيير النطاق حتى يقرأ المستشعر فقط صدى. |
| jsnr04t.get_selfwindspeed | فارغ | int | يقرأ الوقت اللازم للموجات فوق الصوتية لقراءة صدىه (رحلة ذهابًا وإيابًا) ويحوله إلى سرعة الرياح. |
| JSNR04T.Transform_Read | uint16_t x | يطفو | يحول المسافة المقاسة بالموجات فوق الصوتية من MM إلى سرعة الرياح (نسبة إلى سرعة الصوت). |
| الرياح (مُنشئ) | JSNR04T* ، JSNR04T* | فارغ | يبني كائن من نوع الرياح الذي يستخدم زوجًا من الموجات فوق الصوتية لقياس سرعة الرياح بينهما. |
| Wind.update | فارغ | فارغ | تحديث قيم الفئة لسرعات الرياح من خلال أخذ قراءة جديدة ، كما يحسب معدل التغيير في سرعان ما. |
| wind.get_avergewind | فارغ | يطفو | يحسب متوسط 4 قياسات بين الزوج بالموجات فوق الصوتية وفقًا لوضع العمل. |
| Wind.get_echofromahead | فارغ | uint16_t | يقرأ صدى مستشعر مواجهة. |
| REAND_TEMP_HU | DHT ، تعويم* درجة الحرارة ، تعويم* همهمة | فارغ | يقوم بتحديث قيمة درجة الحرارة والرطوبة لمستشعر DHT معين |
| get_speedofsound | تعويم TC ، تعويم RH | يطفو | يقدر سرعة الصوت في درجة حرارة الهواء المعينة والرطوبة حسب |
| set_windsensor | DHT | فارغ | يمر مؤشر DHT إلى فئة الرياح |
| get_echofromahead | JSNR04T U1 ، JSNR04T U2 | int | وظيفة Indpedandt لقراءة صدى مستشعر مواجهة (للاختبار). |
| Wind_cycle | الرياح* Windx ، الرياح* الرياح ، الرياح* Windz | فارغ | يحسب وتحديث سرعة الرياح ومتوسط (متوسط 50 قياس) سرعة الرياح من 3 كائنات الرياح التي تمثل الرياح في ثلاثية الأبعاد. |
حدد قيم الدبوس المطلوبة والتكوين ، وقم بإنشاء كائنات الدورة وفقًا لتكوين الدبوس ونوع المستشعرات ، وتحديد متغيرات الدورة
#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);
أو فقط اتصل بالرياح.
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 Packet ويتوقف عن القوس القريب بينما يستغرق الأمر معدل Arduino 10 ثوانٍ (100 عينة من عينة) لتسجيل قراءات جديدة ، يمكن تبني الحد الأقصى للسيارة عن طريق تخفيض معدل sampling. استخدام البرنامج النصي (استبدل! 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 تستخدم أجهزة مماثلة لإنشاء النسخة التجارية من محطة الطقس هذه ، فإنها لا تستخدم بالضرورة نفس المكونات المنطقية أو المنطق أو الأجهزة ولا هي المسؤولة عن صحة أو تطبيق مشروع OpenSource هذا.
رخصة معهد ماساتشوستس للتكنولوجيا