रास्पबेरी पाई के माध्यम से "चायदानी" और DS18B20 की बातचीत का इतिहास narodmon.ru को डेटा भेजने के साथ

शुभ दिन, प्रिय प्रभामंडल!
एक हफ्ते पहले, मैंने आखिरकार अपने मलिंका का इंतजार किया। यह पोस्ट इस तरह के एक सरल कार्य में तापमान संवेदक के साथ काम करने के तरीके के बारे में है।
कौन परवाह करता है - बिल्ली में आपका स्वागत है।

इसलिए, बोर्ड पर 512 एमबी रैम के साथ रास्पबेरी खुशी के मालिक बनने के बाद, मैंने स्मार्ट होम बनाने के संभावित विकल्पों के बारे में, हैबे सहित कई पोस्टों को संशोधित करना शुरू कर दिया। लेकिन चूंकि मेरी शिक्षा आईटी से दूर है, इसलिए मैंने एलिस को तुरंत नहीं करने का फैसला किया, लेकिन एक साधारण तापमान नियंत्रण के साथ शुरू किया।
मैं मलिंका पर प्रणाली की स्थापना को छोड़ दूंगा, इस विषय को यहां और यहां पर्याप्त विवरण में वर्णित किया गया है । मैं वेब के माध्यम से परिणामों को संग्रहीत और प्रदर्शित करने के साथ तापमान नियंत्रण को स्वचालित करने के लिए मलिंकी को स्थापित करने के लिए सीधे जाता हूं।
मैंने सबसे आसान और सबसे किफायती विकल्प के रूप में 1-तार, ds18b20 और rrdtool के एक गुच्छा पर ध्यान केंद्रित किया।

1. सॉफ्टवेयर स्थापना

1-तार के लिए कर्नेल पैच
सीडी / बूट
wget www.frank-buss.de/raspberrypi/kernel-rpi-w1.tgz
tar -xzf कर्नेल- rpi-w1.tgz
rm -f कर्नेल- rpi-w1.tgz
cd / lib / मॉड्यूल
wget www.frank-buss.de/raspberrypi/modules-rpi-w1.tgz
टार -xzf मॉड्यूल-आरपीआई-w1.tgz
rm -f मॉड्यूल-rpi-w1.tgz
सिंक
रिबूट

Libwww-perl और rrdtool स्थापित करें
sudo apt-get install libwww-perl rrdtool

2. आवश्यक स्क्रिप्ट बनाना

डेटाबेस स्क्रिप्ट create_db.sh बनाएँ
#! / बिन / बैश
rrdtool बनाएँ multirPItemp.rrd --step 300 \
DS: in_temp: GAUGE: 600: 0: 50 \
DS: out_temp: GAUGE: 600: -30: 50 \
RRA: AVERAGE: 0.5: 1: 12 \
RRA: AVERAGE: 0.5: 1: 288 \
RRA: AVERAGE: 0.5: 12: 168 \
RRA: AVERAGE: 0.5: 12: 720 \
RRA: AVERAGE: 0.5: 288: 365

डेटाबेस निर्माण स्क्रिप्ट के लिए एक छोटी टिप्पणी। स्क्रिप्ट में, मैंने सड़क पर और अपार्टमेंट में सेंसर के लिए तापमान सीमा निर्धारित की है। -स्टेप 300 - तापमान डेटा भंडारण अंतराल - 300 सेकंड (5 मिनट)। 600 - सेकंड में पैरामीटर, अनुपस्थिति में जिसके दौरान तापमान मान इसका मान "UNKNOWN" हो जाता है।

सेंसर से तापमान प्राप्त करने के लिए स्क्रिप्ट get_temp.pl
#! / usr / बिन / पर्ल
चेतावनी का उपयोग करें;
& check_modules;
& get_device_IDs;

फॉरच $ डिवाइस (@deviceIDs)
{
$ पठन = & read_device ($ उपकरण);
अगर ($ पढ़ने! = "9999")
{
धक्का (@ temp_readings, $ रीडिंग);
}
}

# डेटाबेस को पूरा करें
`/ usr / bin / rrdtool अपडेट /home/pi/tENS/multirPItemp.rrd N: $ temp_readings [0]: $ temp_readings [1]`;

"Temp 1 = $ temp_readings [0] Temp 2 = $ temp_readings [1] \ n" प्रिंट करें;

################################################## #####################
Narodmon.ru के लिए ऐड-ऑन। सामग्री के आधार पर habrahabr.ru/post/166373
खुला (फ़ाइल, "> / घर / पीआई / तापमान / temp_out");
प्रिंट "$ temp_readings [0]";
बंद (फ़ाइल);
खुला (फ़ाइल, "> / घर / पीआई / तापमान / temp_in");
प्रिंट "$ temp_readings [1]";
बंद (फ़ाइल);
################################################## #####################

उप check_modules
{
$ mods = `cat / proc / मॉड्यूल`;
अगर ($ mods = ~ / w1_gpio / && $ mods = ~ / w1_therm /)
{
"w1 मॉड्यूल पहले से लोड \ n" प्रिंट करें;
}
अन्यथा
{
"लोडिंग w1 मॉड्यूल \ n" प्रिंट करें;
`सूदो modprobe w1-gpio`;
`sudo modprobe w1-therm`;
}
}

उप get_device_IDs
{
# हेक्स आईडी से पता चला कि बस में मौजूद सभी 1-वायर डिवाइस फाइल में स्टोर हो गए हैं
# "W1_master_slaves"

# खुली हुई फ़ाइल
खुला (फ़ाइल, "/ sys / बस / w1 / उपकरणों / w1_bus_master1 / w1_master_slaves") या मर ("फ़ाइल खोलने में असमर्थ");

# एक सरणी में फ़ाइल पढ़ें
@deviceIDs =;

# बंद फ़ाइल
बंद (फ़ाइल);
}

उप पठन_देवी
{
#takes एक पैरामीटर - एक डिवाइस आईडी
# तापमान को बढ़ाता है अगर हमारे पास वैध परिस्थितियों की तरह कुछ है
# यदि हम अपरिभाषित के लिए "9999" वापस करते हैं

$ readcommand = "cat /sys/bus/w1/devices/>.$_ Did0†." /w1_slave 2> & 1";
$ readcommand = ~ s / \ R // g;
$ Sens_temp = `$ readcommand`;

अगर ($ Sens_temp! ~ / ऐसी कोई फ़ाइल या निर्देशिका /)
{
अगर ($ Sens_temp! ~ / NO /)
{
$ Sens_temp = ~ / t = (\ d +) / i;
$ तापमान = (($ 1/1000));
}
अन्यथा
{
$ रिट = "9999";
}
}
अन्यथा
{
$ रिट = "9999"
}
}

यह मूल प्रकार की स्क्रिप्ट है, जैसा कि मैंने इसे इंटरनेट पर पाया। कमरे में जुड़े संवेदकों ने पर्याप्त परिणाम दिखाए, लेकिन जब मैंने एक सेंसर को स्थायी निवास के लिए सड़क पर ले लिया, तो मुझे निराशा हुई कि तापमान बिल्कुल 0 डिग्री सेल्सियस दिखा, इससे कोई फर्क नहीं पड़ता कि मैंने क्या किया (और अब हमारे पास सड़क पर -5 है। ..- 10)।
जैसा कि यह निकला, पूरी बात इस पंक्ति में है:
$:sensor_temp =~ /t=(\d+)/i;
जिसमें नकारात्मक तापमान को ध्यान में रखे बिना सेंसर से तापमान प्राप्त करना शामिल है। प्रासंगिक ज्ञान की कमी के कारण, मैंने स्ट्रिंग को फॉर्म में लाने के लिए आधे घंटे और कुछ कप कॉफी का खर्च किया:
$:sensor_temp =~ /t=(\D*\d+)/i;
जो सामान्य रूप से डेटाबेस में नकारात्मक तापमान दर्ज करने की अनुमति देता है।

चार्ट स्क्रिप्ट create_graphs.sh
 #!/bin/bash RRDPATH="/home/pi/temperature/" INCOLOUR="#990000" OUTCOLOUR="#009900" TRENDCOLOUR1="#FF0000" TRENDCOLOUR2="#00FF00" #hour rrdtool graph $RRDPATH/mhour_in.png --start -6h --alt-autoscale \ DEF:intemp=$RRDPATH/multirPItemp.rrd:in_temp:AVERAGE \ DEF:outtemp=$RRDPATH/multirPItemp.rrd:out_temp:AVERAGE \ CDEF:intrend=intemp,1200,TREND \ CDEF:outtrend=outtemp,1200,TREND \ LINE2:intemp$INCOLOUR:"Inside" \ LINE1:intrend$TRENDCOLOUR1:"20 min AVG" \ #LINE2:outtemp$OUTCOLOUR:"Outside" \ #LINE1:outtrend$TRENDCOLOUR2:"20 min AVG" #hour outside rrdtool graph $RRDPATH/mhour_out.png --start -6h --alt-autoscale \ DEF:intemp=$RRDPATH/multirPItemp.rrd:in_temp:AVERAGE \ DEF:outtemp=$RRDPATH/multirPItemp.rrd:out_temp:AVERAGE \ CDEF:intrend=intemp,1200,TREND \ CDEF:outtrend=outtemp,1200,TREND \ LINE2:outtemp$OUTCOLOUR:"Outside" \ LINE1:outtrend$TRENDCOLOUR2:"20 min AVG" #day rrdtool graph $RRDPATH/mday.png --start -1d --alt-autoscale \ DEF:intemp=$RRDPATH/multirPItemp.rrd:in_temp:AVERAGE \ DEF:outtemp=$RRDPATH/multirPItemp.rrd:out_temp:AVERAGE \ CDEF:intrend=intemp,1800,TREND \ CDEF:outtrend=outtemp,1800,TREND \ LINE2:intemp$INCOLOUR:"Inside" \ LINE1:intrend$TRENDCOLOUR1:"1h min AVG" \ LINE2:outtemp$OUTCOLOUR:"Outside" \ LINE1:outtrend$TRENDCOLOUR2:"1h min AVG" #week rrdtool graph $RRDPATH/mweek.png --start -1w --alt-autoscale \ DEF:intemp=$RRDPATH/multirPItemp.rrd:in_temp:AVERAGE \ DEF:outtemp=$RRDPATH/multirPItemp.rrd:out_temp:AVERAGE \ LINE2:intemp$INCOLOUR:"Inside temperature" \ LINE2:outtemp$OUTCOLOUR:"Outside temperature" \ #month rrdtool graph $RRDPATH/mmonth.png --start -1m --alt-autoscale \ DEF:intemp=$RRDPATH/multirPItemp.rrd:in_temp:AVERAGE \ DEF:outtemp=$RRDPATH/multirPItemp.rrd:out_temp:AVERAGE \ LINE2:intemp$INCOLOUR:"Inside temperature" \ LINE2:outtemp$OUTCOLOUR:"Outside temperature" \ #year rrdtool graph $RRDPATH/myear.png --start -1y --alt-autoscale \ DEF:intemp=$RRDPATH/multirPItemp.rrd:in_temp:AVERAGE \ DEF:outtemp=$RRDPATH/multirPItemp.rrd:out_temp:AVERAGE \ LINE2:intemp$INCOLOUR:"Inside temperature" \ LINE2:outtemp$OUTCOLOUR:"Outside temperature" \ 

इस स्क्रिप्ट में, मैंने अपार्टमेंट में और सड़क पर तापमान के प्रति घंटा चार्ट पोस्ट किए, क्योंकि तापमान के बीच बड़ी भिन्नता ग्राफिक्स को बहुत पठनीय नहीं बनाती है। चार्ट के लिए रंगों और कैप्शन को भी ट्विक किया।

उसके बाद, मैंने क्रमिक रूप से सेंसर से तापमान प्राप्त करना शुरू कर दिया और get.sh रेखांकन उत्पन्न करने के लिए एक स्क्रिप्ट बनाई
 #!/bin/bash /home/pi/temperature/get_temp.pl /home/pi/temperature/create_graphs.sh 

और crontab में जोड़ा गया-अपनी लॉन्च लाइन:
 */5 * * * * /home/pi/temperature/get.sh 

जो आपको स्क्रिप्ट को हर 5 मिनट में स्वचालित रूप से चलाने की अनुमति देता है।
यह सब एक साधारण वेब पेज पर प्रदर्शित होता है।

2.1। Narodmon.ru से कनेक्शन

श्रमिकों के अनुरोध पर, मैं इस पूरी अर्थव्यवस्था को narodmon.ru पर डेटा भेजने के लिए जोड़ने के बारे में जानकारी जोड़ रहा हूं। यहां से सामग्री से बनाया गया है
तो:
1. हम वर्तमान परिणामों को रिकॉर्ड करने के लिए सेंसर से डेटा प्राप्त करने के लिए स्क्रिप्ट में बदलाव करते हैं, प्रत्येक अपनी खुद की फ़ाइल (स्क्रिप्ट में जोड़ा कोड, ऊपर देखें)।
2. स्थापित करें (यदि पहले से स्थापित नहीं है)
sudo apt-get install php5-cgi
3. साइट narodmon.ru पर रीडिंग के साथ फाइलों से डेटा भेजने के लिए एक स्क्रिप्ट बनाएं
Narodmon.ru पर डेटा भेजने की स्क्रिप्ट - send.php
 #!/usr/bin/php-cgi -q <? $file_name="/home/pi/temperature/temp_out"; $file=fopen("$file_name", «r»); $gradus_out=fread($file, filesize($file_name)); echo "$gradus_out\n"; fclose($file); $file_name="/home/pi/temperature/temp_in"; $file=fopen("$file_name", «r»); $gradus_in=fread($file, filesize($file_name)); echo "$gradus_in\n"; fclose($file); $fp = @fsockopen(«tcp://narodmon.ru», 8283, $errno, $errstr); if(!$fp) exit(«ERROR(».$errno."): ".$errstr); fwrite($fp, "#01-23-45-67-89-AF\n#0123456789ABCDEF#$gradus_out\n#0123456789ABCDEF#$gradus_in\n##"); fclose($fp); ?> 

01-23-45-67-89-AF - मालिंकी नेटवर्क कार्ड का मैक पता, 0123456789ABCDEF - तापमान सेंसरों की क्रम संख्या।
4. नियमित रूप से सूचना भेजने के लिए crontab पर एक पंक्ति जोड़ें (साइट में सूचना प्राप्त करने की आवृत्ति पर एक सीमा है - हर 5 मिनट में एक बार से अधिक नहीं, इसलिए मैंने इसे हर 10 मिनट में भेजा है):
 */10 * * * * /home/pi/temperature/send.php 

5. प्रोजेक्ट narodmon.ru पर रजिस्टर करें और Malinki MAC एड्रेस जोड़ें। अब आंकड़े रखे गए हैं और वे :)

3. अब हम लोहे को पास करते हैं

पेंट्री के डिब्बे में रम होने के बाद, मुझे टाइप "मदर" और टेलीफोन एक्सटेंशन कॉर्ड की दो-पंक्ति कनेक्टर मिली। मैं कनेक्टर से थोड़ा 2x4 और लेग 1 और लेग 7 (लेग 1 पर हमारे पास + 3 वी है, लेग 6 ग्राउंड है, लेग 7 पिन 4 है, जो आपको 1-वायर प्रोटोकॉल का उपयोग करके संवाद करने की अनुमति देता है) के बीच 4k7 रोकनेवाला मिलाया।

पहले ds18b20 सेंसर को एक्सटेंशन कॉर्ड में मिलाया गया था, और मैंने दूसरे सेंसर को सीधे टेलीफोन केबल में मिलाया, इसे ब्लैक (ब्लू नहीं) इलेक्ट्रिकल टेप से लपेटा और अपार्टमेंट के बाहर सैटेलाइट एंटीना केबल के लिए पूर्व छेद के माध्यम से सड़क पर ले गया।
इकट्ठे रूप में, परिवहन मामले में मलिंका की नियुक्ति को ध्यान में रखते हुए, निम्नलिखित चित्र प्राप्त किया गया था:

जैसा कि यह निकला, माइक्रोट्रोजनी का उपयोग करना एक बहुत ही सुविधाजनक बात है :)
और अंत में - साइट से एक तस्वीर।

प्रोजेक्ट narodmon.ru पर परिणाम।

एक आफ्टरवर्ड के बजाय

यदि आपको चायदानी से जुड़े तापमान सेंसर को देखने की उम्मीद है - मैं माफी माँगता हूँ :) "चायदानी" इस लेख में मैं हूँ। कम से कम, मैं अपनी क्षमता और ज्ञान का सबसे अच्छा करने के लिए सवाल देखता हूं, Google को देखता हूं और परीक्षण और त्रुटि पद्धति का उपयोग करता हूं।
मैंने अपना लक्ष्य हासिल कर लिया। मैं स्थानीय लक्ष्यों को प्राप्त करने में सुधार या सही दृष्टिकोण के सुझावों के लिए सभी का आभारी रहूंगा। आपका ध्यान के लिए धन्यवाद :)

ZY मुझे ग्राफ़ के साथ एक पृष्ठ का लिंक नहीं दिया जाएगा - "मलिंका" "गिर जाएगी";)

Source: https://habr.com/ru/post/In163575/


All Articles