Სარჩევი:

ადგილობრივი ამინდის სადგური: 8 ნაბიჯი (სურათებით)
ადგილობრივი ამინდის სადგური: 8 ნაბიჯი (სურათებით)

ვიდეო: ადგილობრივი ამინდის სადგური: 8 ნაბიჯი (სურათებით)

ვიდეო: ადგილობრივი ამინდის სადგური: 8 ნაბიჯი (სურათებით)
ვიდეო: ლუკა და მარიამი 2024, ივლისი
Anonim
ადგილობრივი ამინდის სადგური
ადგილობრივი ამინდის სადგური

როდესაც ვეძებდი დიდ პროექტს, რომ შემექმნა ჩემი პირველი სასკოლო პროექტი, მე მქონდა ბევრი იდეა, თუ რა უნდა გამეკეთებინა, მაგრამ არცერთი მათგანი არ გამიჩნდა რთული.

მოგვიანებით მე ვიფიქრე ისეთი ამინდის სადგურის შექმნაზე, რომელსაც რაიმე განსაკუთრებული ჰქონდა. მინდოდა შემეძლო ჩემი ყველა მონაცემის შენახვა და შემდგომში გამომეყენებინა ეს სტატისტიკისათვის. ეს პროექტი იქნება სპეციალურად მათთვის, ვისაც მეტეოროლოგია აქვს დაინტერესებული და სურს, რომ შეიქმნას მეტეოროლოგიურ სადგური სახლში, რომელიც არ დაჯდება ისე, როგორც ბაზარზე არსებული. პროექტი ასევე შექმნილია სენსორების დამატების ან ამოღების შესაძლებლობის შესანარჩუნებლად ნებისმიერ დროს.

მე ნამდვილად ბედნიერი ვიყავი, როდესაც დავინახე ჩემი საბოლოო შედეგი, რომელიც მოსალოდნელზე უკეთესი აღმოჩნდა.

იგი დამზადებულია Raspberry Pi 4 გაშვებული ლინუქსისგან.

  • Apache ვებსაიტი (html css js)
  • Eventlet (უკანა სერვერის ვებ გვერდი)
  • MariaDB (მონაცემთა ბაზის სერვერი)

მარაგები

  • ჟოლო Pi 4:

    sd ბარათი (მინ. 16 გბ)

  • სენსორები:

    1. ქარის სიჩქარის QS-FS სენსორი
    2. ქარის სენსორი ბაღის სიგნალი გამომავალი ალუმინის შენადნობი ქარის მიმართულების სენსორი ქარის ფურცლის სიჩქარე -ზომვითი-ინსტრუმენტი-p-1624988.html? Rmmds = myorder & cur_warehouse = CN
    3. DHT22 (ტენიანობა)
    4. BMP280 (ჰაერის წნევა)
    5. DS18B20 (ტემპერატურა)
  • დენის წყაროს

    • 5 ვ კვების წყარო (RPi)
    • 9 ვ ელექტროენერგიის მიწოდება (გარე დაფის კვების ბლოკზე)
  • პურის დაფა (x2)

    T-cobbler plus RPi 4-ისთვის

  • ჯუმბერის მავთულები
  • IC– ს

    • MCP3008
    • PCF8574AN
  • LCD ეკრანი 16x2
  • LED (წითელი
  • გარსაცმები (ოპტიმალური)

    • ღვინის ყუთები
    • ხის ბოძი (2 მ)
    • ხის ფიცარი (1 მ)

ნაბიჯი 1: ნივთების მომზადება

ყოველთვის დიდი მნიშვნელობა აქვს მიიღოთ ყველა საჭირო ნივთი სანამ ნაბიჯზე დაიწყებთ მუშაობას. ეს დაზოგავს უამრავ დროს მისი მუშაობის დროს.

ასე რომ, ჯერ, Რა გჭირდება:

  • ჟოლო Pi 4:

    sd ბარათი (მინ. 16 გბ)

  • სენსორები:

    1. ქარის სიჩქარის QS-FS სენსორი
    2. ქარის სენსორი ბაღის სიგნალი გამომავალი ალუმინის შენადნობი ქარის მიმართულების სენსორი ქარის ფურცლის სიჩქარის საზომი ინსტრუმენტი
    3. DHT22 (ტენიანობა)
    4. BMP280 (ჰაერის წნევა)
    5. DS18B20 (ტემპერატურა)
  • დენის წყაროს

    • 5 ვ კვების წყარო (RPi)
    • 9 ვ კვების ბლოკი (გარე დაფის კვების ბლოკზე)
  • პურის დაფა (x2)
  • T-cobbler plus RPi 4-ისთვის
  • ჯუმბერის მავთულები
  • IC– ს

    • MCP3008
    • PCF8574AN
  • LCD ეკრანი 16x2
  • LED (წითელი)
  • გარსაცმები (ოპტიმალური)

    • ღვინის კრატის ხე
    • ხის ფიცარი (1 მ)
    • ბოძი (2 მ)

თქვენ შეგიძლიათ იპოვოთ ყველა ბმული, სადაც ეს შევიძინე, შესავლის ქვეშ მარაგის განყოფილებაში.

ნაბიჯი 2: RPi– ს დაყენება

RPi– ს დაყენება
RPi– ს დაყენება

ჩვენი პროექტისთვის ჩვენ გვჭირდება RPi მოცემული პროგრამული უზრუნველყოფით დაინსტალირებული.

  • Apache ვებსაიტი (html css js)
  • Flask Socket-IO (უკანა სერვერის ვებ გვერდი)
  • MariaDB (მონაცემთა ბაზის სერვერი)

ინსტალაციის დაწყებამდე ყოველთვის მოსახერხებელია დარწმუნდეთ, რომ თქვენ გაქვთ უახლესი პროგრამული უზრუნველყოფა დაინსტალირებული თქვენს RPi. ამისათვის უბრალოდ შეასრულეთ შემდეგი ბრძანება:

sudo apt განახლება

Apache:

ჯერ მოდით ვისაუბროთ Apache– ზე. Apache არის ვებ სერვერი, რომელიც გამოიყენება მთელ მსოფლიოში. ის უპრობლემოდ მართავს თქვენს ვებსაიტს. ერთადერთი რაც თქვენ უნდა გააკეთოთ არის დააინსტალიროთ იგი და განათავსოთ თქვენი ვებ გვერდი სწორ საქაღალდეში და იქ არის.

sudo apt დააინსტალირეთ apache2 -y

Ის არის!

დარწმუნდით, რომ ყველაფერი სწორად არის დაინსტალირებული თქვენს ჟოლოს პი IP მისამართზე თქვენს ბრაუზერში და ნახეთ თუ არა ნაგულისხმევი ვებ გვერდი. თუ თქვენ გაქვთ რაიმე პრობლემა ამ ნაბიჯთან დაკავშირებით, შეგიძლიათ გადახედოთ RPi ვებსაიტს აქ.

ივენთლეტი:

ახლა მოდით დავაინსტალიროთ Eventlet. ის გაუშვებს ჩვენს უკანა სერვერს და დაამყარებს კავშირს ჩვენი სენსორებიდან ჩვენს ვებ – გვერდზე. ამისათვის ჩვენ გვჭირდება რამდენიმე პაკეტი.

Flask-socketIO:

pip3 დააინსტალირეთ flask-socketio

ივენთლეტი:

pip3 დააინსტალირეთ eventlet

გევენტი:

pip3 დააინსტალირეთ gevent

მარიადბ:

Mariadb არის MySQL დაფუძნებული მონაცემთა ბაზა, რომელიც ქმნის ურთიერთობის მონაცემთა ბაზებს. ის ხშირად გამოიყენება RPi– ზე და, შესაბამისად, ბევრი დახმარება შეგიძლიათ იპოვოთ ინტერნეტში. დამატებითი ინფორმაციისთვის შეგიძლიათ გადახვიდეთ ამ ბმულზე.

apt install mariadb-server

ნაბიჯი 3: სენსორების დაკავშირება და კოდის დამატება

სენსორების დაკავშირება და კოდის დამატება
სენსორების დაკავშირება და კოდის დამატება
სენსორების დაკავშირება და კოდის დამატება
სენსორების დაკავშირება და კოდის დამატება
სენსორების დაკავშირება და კოდის დამატება
სენსორების დაკავშირება და კოდის დამატება

სენსორების ჩვენს RPi– ს დასაკავშირებლად ჩვენ შეგვიძლია გამოვიყენოთ T-Cobbler plus. ეს არის მოსახერხებელი პატარა ინსტრუმენტი, რომლის საშუალებითაც შეგიძლიათ გამოიყენოთ თქვენი ყველა ქინძისთავი თქვენს RPi– ზე პურის დაფაზე.

ჩემს პროექტში მაქვს 5 სენსორი:

  1. ქარის სიჩქარის QS-FS სენსორი
  2. ქარის სენსორი ბაღის სიგნალი გამომავალი ალუმინის შენადნობი ქარის მიმართულების სენსორი ქარის ფურცლის სიჩქარის საზომი ინსტრუმენტი
  3. DHT22 (ტენიანობა)
  4. BMP280 (ჰაერის წნევა)
  5. DS18B20 (ტემპერატურა)

ქარის სიჩქარის სენსორი:

უპირველეს ყოვლისა, დავიწყე ქარის სიჩქარის სენსორით, რადგან ძირითადად აღფრთოვანებული ვიყავი ამ სენსორით. ეს არის სენსორი ანალოგური სიგნალით 0-5 ვ გამომავალი და სჭირდება ძაბვა მინიმუმ 7 ვოლტის მუშაობისთვის. მე ვირჩევ 9 ვოლტიანი ადაპტერს მის გასაძლიერებლად.

ამ სენსორში წასაკითხად მე გამოვიყენე MCP3008, რომელიც არის IC ანალოგურ სიგნალებში წასაკითხად. IC– ს შეუძლია იმუშაოს 3.3V ან 5V– ზე, მაგრამ მე ვირჩევ 3.3V– ს, რათა ის თავსებადი იყოს RPi– სთან. ეს იმას ნიშნავდა, რომ მე მჭირდებოდა გამომავალი ძაბვის შეცვლა 5V– დან 3.3V– მდე, მე ეს გავაკეთე ძაბვის გამყოფის დამატებით, რომელიც შეიქმნა 2 რეზისტორის მიერ (2k და 1k ohm).

ქარის მიმართულების სენსორი:

ქარის მიმართულება ისეთივე მნიშვნელოვანია, როგორც ქარის სიჩქარე, ამიტომ ამას შემდეგში დავუკავშირებ.

ამ სენსორს აქვს იგივე სპეციფიკა, როგორც ქარის სიჩქარის სენსორს. ის ასევე იმუშავებს 9V– ზე და აქვს გამომავალი ძაბვა 5 ვოლტი. ასევე ამ სენსორს ჩვენ დავუკავშირდებით MCP3008 ძაბვის გამყოფის საშუალებით.

DHT22 (ტენიანობა):

DHT22 კითხულობს ტენიანობას. ის გაძლევთ პროცენტულ მნიშვნელობას და მისი მნიშვნელობის წაკითხვა შესაძლებელია RPi– ზე I2C პროტოკოლის გამოყენებით. ამიტომ თქვენ უნდა ჩართოთ I2C პორტები Raspi- კონფიგურაციაში. მეტი ინფორმაცია აქ.

BMP280 (ჰაერის წნევა):

BMP280 გამოიყენება ჰაერის წნევის წასაკითხად. მისი მნიშვნელობა იკითხება SPI ავტობუსის საშუალებით RPi– ზე. ეს პროტოკოლი ასევე უნდა იყოს ჩართული Raspi- კონფიგურაციაში. ჩემი კოდისთვის გამოვიყენე ადაფრუტის ბიბლიოთეკა.

DS18B20 (ტემპერატურა):

ბოლო სენსორი ზომავს ტემპერატურას. ეს სენსორი არის დალასიდან და თუ თქვენ გქონიათ მცირე გამოცდილება დალასთან, თქვენ ალბათ უკვე უნდა იცოდეთ, რომ ისინი იყენებენ 1Wire ავტობუსს. ნუ გაგიკვირდებათ, თუ ვიტყვი, რომ ეს პროტოკოლი ასევე უნდა იყოს ჩართული Raspi- კონფიგურაციაში.

როგორ დავუკავშირე სენსორები:

როგორც pdf ავტვირთე ელექტრული და პურის დაფის სქემა, რომ ცოტა გამიადვილდეს.

მას შემდეგ რაც შეძელით სენსორების წარმატებით დაკავშირება და თქვენ დაამატეთ კოდი, რომელიც საჭიროა ყველა სენსორის წასაკითხად, შეგიძლიათ გააგრძელოთ ნაბიჯი და გადადით შემდეგ საფეხურზე. თუ გსურთ სენსორის უკან დატოვება ან გსურთ მეტი დაამატოთ, შეგიძლიათ ამის გაკეთება.

ნაბიჯი 4: ვებ Ui დიზაინის შემუშავება

ვებ Ui დიზაინის შექმნა
ვებ Ui დიზაინის შექმნა
ვებ Ui დიზაინის შექმნა
ვებ Ui დიზაინის შექმნა
ვებ Ui დიზაინის შექმნა
ვებ Ui დიზაინის შექმნა

ახლა ჩვენ დავუკავშირდით სენსორებს, რომლებიც გვჭირდება დიზაინი ჩვენი ვებსაიტისთვის.

ჩვენ გვსურს, რომ ვებსაიტმა შექმნას მარტივი სახე სენსორების ყველა რეალურ დროში მონაცემების ჩვენებისას.

ჩვენ ასევე გვინდა, რომ შევძლოთ ამ გაზომილი მნიშვნელობების ისტორიის დანახვა დროის ინტერვალში.

ასე რომ, პირველად დავიწყე ინტერნეტში შთაგონების ძებნა. უპირველეს ყოვლისა, სადაც მხოლოდ წყლის ინფორმაციის საიტებია, დიზაინის გარეშე, რომელსაც ვეძებდი. მეტეოროლოგიურ სადგურებს, რომლებიც უკვე ბაზარზე იყვნენ, სავარაუდოდ ჰქონდათ ჩვენება. და ამ ჩვენებიდან ჩემი შთაგონება მოვიდა. ეკრანების უმეტესობას აქვს დიზაინი ბადისებრი გარეგნობით. ამან მომცა იდეა შევქმნა საწყისი გვერდი, სადაც ყველა სენსორი იქნებოდა ნაჩვენები.

მაგრამ, მე ასევე ვთქვი, რომ მინდოდა გამეკეთებინა გვერდი, სადაც თქვენ ნახავთ თითოეული სენსორის ისტორიას მისი ღირებულებების შესახებ.

ამ მიზეზით, მე ასევე გავაკეთე მეორე გვერდი ჩემს დიზაინში, რომელიც შეიცავს ამას. ამ გვერდზე მე ვნახე დამატებითი ინფორმაცია ჩემი სენსორის შესახებ, რომელიც არ იქნება ნაჩვენები ჩემს წინა გვერდზე და რა თქმა უნდა, ისტორიის ნაწილში.

რამდენიმე საათის შემდეგ მე შემუშავდა ჩემი სრული დიზაინი!

დიზაინი დამზადებულია Adobe XD– ის გამოყენებით.

ნაბიჯი 5: მონაცემთა ბაზის შექმნა

მონაცემთა ბაზის შექმნა
მონაცემთა ბაზის შექმნა

დიზაინის ნაწილისგან შესვენების მიზნით დავიწყე ჩემი მონაცემთა ბაზა.

ეს მონაცემთა ბაზა შეიცავდა ყველა სენსორს (5), ყველა გამტარებელს (2) და მნიშვნელობებს, რაც ჰქონდათ ამ სენსორებს.

მონაცემთა ბაზა საკმაოდ მარტივია და რამდენიმე ურთიერთობა აქვს.

თქვენ შეგიძლიათ ნახოთ მონაცემთა ბაზის მოდელი ფოტოში.

ნაბიჯი 6: ვებსაიტის კოდირება: Frontend (html Css)

დაუბრუნდით ვებგვერდს!

ახლა მე მაქვს დიზაინი, რომლითაც შემიძლია დავიწყო მისი კოდირება, როგორც html css, რომ ნამდვილად გამოვიყენო.

მთავარ გვერდზე:

დავიწყე თითოეული სენსორის განხილვით, როგორც ელემენტი ჩემს ვებგვერდზე. რათა შემდგომში შემეძლოს ამ ნაწილის გენერირება ჩემი Javascript კოდით.

მე ასევე ჩავსვი შემთხვევითი JS- მფლობელის კლასები ელემენტებში. ეს შესაძლებელს გახდის ამ ელემენტის შინაარსის შეცვლას

ამან ბევრი დრო დამჭირდა, რადგან მე არ ვარ კარგი ამ კონკრეტულ ენაზე.

მთავარი გვერდის გაკეთების შემდეგ დრო იყო დავიწყოთ ისტორიის გვერდზე.

ისტორიის გვერდზე:

ამ გვერდის ხელახლა შექმნა ადვილი იყო. ამ გვერდზე ასევე იყო js- მფლობელები, რომ მიიღონ ინფორმაცია სენსორის შესახებ, რეალურ დროში მნიშვნელობის სლოტი და ცხრილი აჩვენონ გაზომილი მნიშვნელობებით.

ჩემს ვებსაიტზე ჩანართის ვარიანტის შესაქმნელად ცხრილსა თუ დიაგრამას შორის არჩევანის გაკეთების მიზნით, მე უნდა დავამატო Javascript, რათა ელემენტები არ გამოჩნდეს ან არ გამოჩნდეს.

ახლა ჩვენ გვაქვს განსაცვიფრებელი ვებსაიტი, მაგრამ ვერაფერს ვაჩვენებთ მასზე? მოდით გავასწოროთ ის.

თქვენ შეგიძლიათ იპოვოთ ჩემი კოდი ჩემს github საცავში:

ნაბიჯი 7: ვებსაიტის კოდირება: Backend (eventlet) + Coding Frontend (javascript)

უკანა მხარე:

სანამ უკანა სერვერი უკვე დამონტაჟებულია, ჩვენ მაინც გვჭირდება ამის განხორციელება ჩვენს პროექტში. პირველ რიგში, ჩვენ უნდა დავამატოთ რამდენიმე იმპორტი, რომ ყველაფერი სწორად იმუშაოს.

ბოთლის იმპორტიდან ბოთლი, მოთხოვნა, jsonify საწყისი flask_socketio იმპორტი SocketIO საწყისი flask_cors იმპორტი CORS

სერვერის გაშვების მიზნით, ჩვენ უნდა დავამატოთ შემდეგი:

socketio.run (აპლიკაცია, გამართვა = ყალბი, მასპინძელი = '0.0.0.0')

ახლა სერვერი ონლაინ რეჟიმშია, მაგრამ ის ვერ შეძლებს ფრონტონდთან საუბარს.

ის არაფერს იღებს და არც აბრუნებს. მოდით შევცვალოთ ეს.

მონაცემთა ბაზაში არსებული ყველა სენსორის მოთხოვნით, თქვენ დაამატებთ მარშრუტს:

@app.route (ბოლო წერტილი + '/სენსორები', მეთოდები = ['GET']) def get_sensors (): if request.method == 'GET': s = DataRepository.get_sensors () return jsonify (sensors = s), 200

ეს კოდი იყენებს კლასს სახელწოდებით DataRepository და ესაუბრება მონაცემთა ბაზას. აქ ის გვაბრუნებს ჩვენს მიერ მოთხოვნილი სენსორებს.

ჩვენ ასევე გვჭირდება მარშრუტი, რომ ვიკითხოთ ინფორმაცია 1 კონკრეტული სენსორის შესახებ და მეორე სენსორის მნიშვნელობების შესახებ.

ეს ყველაფერი მარშრუტებია, მაგრამ რეალურ დროში მონაცემების შესაძლებლობის შესაქმნელად. ჩვენ უნდა გავაგზავნოთ სენსორების მიერ წაკითხული მონაცემები ყოველ ინტერვალში. ამისათვის ჩვენ ვიყენებთ Socket-IO კავშირს. ეს არის კავშირი, რომელიც დამყარებულია იმ მომენტიდან, როდესაც ვინმე იტვირთავს ვებგვერდს JS– ით და ის ინარჩუნებს ამ კავშირს ღია. ეს არის სრული დუპლექსის კავშირი, რაც იმას ნიშნავს, რომ ეს არის კავშირი, რომელიც მუშაობს ორივე გზით (გაგზავნა და მიღება) ერთდროულად. ამის გამოსაყენებლად ჩვენ უნდა დავამატოთ შემდეგი კოდი.

@socketio.on ('დაკავშირება') def initial_connection (): print ('new client connect') socketio.send ("U bent geconnecteerd") # # გაუგზავნე კლიენტს!

კოდის ეს სიმშვიდე იმუშავებს, როდესაც კლიენტი აკავშირებს.

Frontend– დან რაიმე შეტყობინების მისაღებად შეგიძლიათ გამოიყენოთ ეს კოდი.

@socketio.on ('შეტყობინება') def message_recived (): pass

ასევე შეგიძლიათ შეტყობინებების გაგზავნა. ეს ხდება შემდეგით.

socketio.emit ('Update_RTD', dict_results, broadcast = True)

პირველი არგუმენტი შეიძლება იყოს ის, რაც გსურთ, მაგრამ შეესაბამება იმას, რასაც თქვენ შეიყვანთ თქვენს JS– ში და თქვენ ასევე შეგიძლიათ გააგზავნოთ საგნები მასთან ერთად. ეს არჩევითია.

Javascript:

მნიშვნელოვანია დაამატოთ ცოტა JS, რომ სერვერი დაუკავშირდეს უკანა სერვერს, რათა შეძლოს მიმდინარე მონაცემების ჩვენება და ინფორმაციის მიღება მონაცემთა ბაზიდან.

ჩვენ გამოვიძახებთ socketIO ფუნქციებს, რომლებიც ჩვენ გავაკეთეთ მონაცემების მისაღებად და გასაგზავნად.

როდესაც ჩვენ ვიღებთ მონაცემებს, როგორც Json ობიექტი, ჩვენ გავანადგურებთ მას, რომ მივიღოთ საჭირო ინფორმაცია და შემდეგ ჩავდოთ JS მფლობელებში, რომლებსაც ჩვენ ვდებთ ჩვენს ვებგვერდზე.

თქვენ შეგიძლიათ იპოვოთ ჩემი კოდი ჩემს github საცავში:

ნაბიჯი 8: გარსაცმის დამზადება

გარსაცმის დამზადება
გარსაცმის დამზადება
გარსაცმის დამზადება
გარსაცმის დამზადება
გარსაცმის დამზადება
გარსაცმის დამზადება
გარსაცმის დამზადება
გარსაცმის დამზადება

გარსაცმას ბევრი შრომა დასჭირდა და შეიძლება გაკეთდეს ისე, როგორც გსურთ. ეს ასე გავაკეთე.

რამდენიმე ღვინის ყუთი ავიღე.

ერთ მათგანს გამოვიყენებ ყუთში, რომ შევინახო ჩემი RPi და ჩემი სენსორების უმეტესობა.

ქარის სიჩქარის სენსორი და ქარის მიმართულების სენსორი, რა თქმა უნდა, არ იყო განთავსებული შიგნით, არამედ ბოძზე მოთავსებული ჯვრის თავზე. ამ ბოძზე ჩამოვკიდე ღვინის კოლოფი, სადაც მეც კარი გავაღე.

თქვენ ხედავთ, როგორ დავასრულე ჩემი პროექტი ფოტოების გადახედვით.

ეს, რა თქმა უნდა, არის მაგალითი იმისა, თუ როგორ შეგიძლიათ ამის გაკეთება. ამის გაკეთება შეგიძლია რაც გინდა.

გირჩევთ: