Სარჩევი:
- ნაბიჯი 1: ზევით და ქვევით
- ნაბიჯი 2: რაც შეეხება მარცხენა და მარჯვენა ?
- ნაბიჯი 3: სხეულის შეკავება … როგორ?
- ნაბიჯი 4: მაგრამ ეს ყუთები არც ისე ლამაზია…
- ნაბიჯი 5: უხერხული სათამაშოები? ოჰ, ჩემო
- ნაბიჯი 6: დაბეჭდეთ თქვენი დრაკონი
- ნაბიჯი 7: დროა გააძლიეროთ თქვენი დრაკონი ნეოპიქსელებით
- ნაბიჯი 8: პროგრამირების დრო
- ნაბიჯი 9: პროგრამირება გრძელდება
- ნაბიჯი 10: ისიამოვნე შენი დრაკონით
ვიდეო: Sine-ese Dragon: 10 ნაბიჯი (სურათებით)
2024 ავტორი: John Day | [email protected]. ბოლოს შეცვლილი: 2024-01-30 10:20
Sine-ese Dragon არის სახლის დეკორაციის ელემენტი, რომელიც იყენებს მექანიკურ მოძრაობებს და შუქებს, რათა გითხრათ ამინდის პროგნოზი მომდევნო სამი სამსაათიანი ინტერვალით. განმარტებით, გარემო აღწერს რაიმეს უშუალო გარემოს; ამიტომ გადაწყდა, რომ მიზანშეწონილი იყოს ამინდის მონაცემების ჩართვა გარე ეკრანზე. ამინდი არის ასპექტი, რომელიც უნებლიედ ცვლის ადამიანების დღეს და არის ინფორმაციის ნაწილი, რომელიც მუდმივად იცვლება ყოველ წუთში, ან თუნდაც მეორეზე.
ჩინური დრაკონი არის "ძალაუფლების, სიძლიერის და წარმატების სიმბოლო" და ის ხშირად იმართება მაღალი კულტურული და ტრადიციული ღირებულებით აზიის ქვეკონტინენტზე. გარდა იმისა, რომ ჩინურ დრაკონს მოაქვს კეთილდღეობა, მას ასევე აქვს ძლიერი ძალა, რომელიც აკონტროლებს „წყალს, ნალექებს, ტაიფუნებს და წყალდიდობას“. საბოლოო ჯამში, ჩინური დრაკონი მიზანშეწონილად იქნა მიჩნეული ამინდის მონაცემების წარმოსაჩენად.
ვიზუალიზაცია
Sine-ese Dragon მანიპულირდება ექვს მთავარ წერტილში სამ ცალკეულ მონაკვეთზე, რომელიც წარმოადგენს ამინდის პროგნოზს სამი 3 საათის ინტერვალით. თითოეული 3 საათიანი ინტერვალისთვის, იქნება შემდეგი ინფორმაცია:
- ამინდის აღწერა - განსაზღვრავს მიმდინარე ამინდის ინფორმაციის ფერს.
- ტემპერატურა - განსაზღვრავს სხეულის სიმაღლეს
- ტენიანობა - LED სეგმენტების მოციმციმე
- ქარის სიჩქარე - აკონტროლებს სხეულის სიჩქარეს მარცხნივ და მარჯვნივ.
საჭირო მასალები
- 3 მმ პლაივუდი/მუყაო
- 5 მმ ხის ბუდეები ან ჩხირები
- 2 ნაწილაკების ფოტონები
- 3 სლინკი სათამაშოები
- 6 სერვო ძრავა
- NeoPixel განათება (ძაფები ან ცალკეული შუქები ერთად შეკერილი)
- ბევრი სუპერ წებო
- გამტარი ძაფი
- Აკრილის საღებავი
- დეკორატიული ქსოვილი
- ლაზერული საჭრელი
- 3D პრინტერი
ნაბიჯი 1: ზევით და ქვევით
თქვენი პირველი ნაბიჯი Sine-ese Dragon– ის შესაქმნელად არის კომპონენტის შექმნა, რომელიც აკონტროლებს სხეულის მოძრაობას ზემოთ და ქვემოთ. რა ამაღელვებელია!
-
ჩამოტვირთეთ Adobe Illustrator ფაილები (.ai) და დაბეჭდეთ ისინი ლაზერული საჭრელი აპარატის გამოყენებით.
upDownBoxWithPlatform.ai უნდა იყოს დაბეჭდილი მუყაოზე
-
ჩამოტვირთეთ 3D ბეჭდვის ფაილები (.stl) და გამოიყენეთ თქვენი საყვარელი 3D პრინტერი მათ დასაბეჭდად.
დისკს და დისკის შემობრუნებას ფერი არ აქვს მნიშვნელობა. მეორე სურათზე, დისკის შემობრუნება ჩასმულია დისკის ხვრელში
-
შეაგროვეთ პირველი ორი კომპონენტი და შეაერთეთ ისინი ისე, როგორც ნაჩვენებია სურათებში 3 -დან 5 -მდე.
- პლატფორმა
- დისკები დისკისთვის
-
ახლა შეაგროვეთ ყუთი ქვემოთ მოცემული რჩევების შესაბამისად.
- სერვოს მავთულები უნდა გაიაროს ყუთის მხარეს ოთხკუთხა ხვრელში.
- დისკის შემობრუნების უმოკლესი ბოლო მიმაგრებულია სერვო თავზე და გრძელი ბოლო გადის ყუთის მეორე მხარის ხვრელში, რომელზეც წრიული ხვრელია. ეს ნაჩვენებია მე -6 სურათზე.
- ახლა, ჩვენ გვჭირდება რაღაც იმის უზრუნველსაყოფად, რომ პლატფორმა დარჩეს თანაბარი, როდესაც დისკი ბრუნდება. მოჭერით ჩოხტი 75 მმ სიგრძის ჯოხებად (სურათი 7) და წებოვანა ყუთის ზედა ნაწილში პლატფორმის ზედა ნაწილში ცხელი წებოს გამოყენებით. დარწმუნდით, რომ ჯოხები 90 გრადუსით არის დაბალანსებული პლატფორმასთან.
- ჩადეთ 212 მმ სიგრძის ჯოხი შუა ხვრელში ყუთის თავზე, პლატფორმაზე.
Ტკბილი! ახლა თქვენ გაქვთ სრული ყუთი (სურათი 8) დრაკონის ზემოთ და ქვემოთ მოძრაობისთვის. ახლა გაიმეორეთ ზემოთ მოყვანილი ნაბიჯები კიდევ ორჯერ!
ნაბიჯი 2: რაც შეეხება მარცხენა და მარჯვენა ?
ახლა ჩვენ არ შეგვიძლია დავივიწყოთ სინესეს დრაკონის მარცხენა და მარჯვენა მოძრაობა, არა? მოდით გადავიდეთ მეორე საფეხურზე!
-
ჩამოტვირთეთ Adobe Illustrator ფაილები (.ai) და დაბეჭდეთ ისინი ლაზერული საჭრელი აპარატის გამოყენებით.
- leftRightBoxWithPlatforms.ai უნდა იყოს დაბეჭდილი მუყაოზე.
- armTurner.ai ფაილი უნდა იყოს დაბეჭდილი 3 მმ სისქის მასალაზე.
-
ჩამოტვირთეთ 3D ბეჭდვის ფაილები (.stl) და გამოიყენეთ თქვენი საყვარელი 3D პრინტერი მათ დასაბეჭდად.
დარწმუნდით, რომ დაბეჭდეთ ორი ხელი! აქ ფერი არ აქვს მნიშვნელობა
- შეაგროვეთ ორი პლატფორმა ერთად, როგორც ნაჩვენებია სურათზე 3 ცხელი წებოს გამოყენებით.
-
დაალაგე ყუთი. მიუხედავად იმისა, რომ ამის გაკეთება რთულია, ამის მიღწევა უფრო ადვილია:
- ჩადეთ ორი პლატფორმა ყუთის ორივე მხარეს ორ დიდ ნაპრალს შორის.
- პირველი მკლავის განთავსება ზედა პლატფორმის თავზე.
- ძაფის შემობრუნება მკლავში და შემდეგ ზედა პლატფორმაზე.
- მეორე მკლავის განთავსება ქვედა პლატფორმის თავზე.
- ძაფის შემობრუნება მეორე მკლავში და შემდეგ ქვედა პლატფორმაზე.
- დაიჭირეთ მბრუნავი მბრუნავი სამგანზომილებიანი ბეჭდვის სამკუთხედის ხვრელი.
- შემობრუნების მეორე ბოლო მიდის სერვო ძრავის თავზე.
- დაამატეთ ზედა, ქვედა და უკანა ნაწილები ყუთში.
თქვენი ბოლო აწყობილი ყუთი უნდა გამოიყურებოდეს მეექვსე სურათზე. ახლა თქვენ უნდა გაიმეოროთ ეს კიდევ ორჯერ!
ამ ნაბიჯის დასასრულს, თქვენ უნდა გქონდეთ ექვსი ყუთი სამი ზევით/ქვევით და მარცხნივ/მარჯვნივ მოძრაობის სისტემით.
ნაბიჯი 3: სხეულის შეკავება … როგორ?
კარგი კითხვა! სწორედ მაშინ შემოდის ის 3D დაბეჭდილი slinky მფლობელები. ჩამოტვირთეთ ჩართული.stl ფაილი და დაბეჭდეთ იგი 3D პრინტერის გამოყენებით. დარწმუნდით, რომ დაბეჭდეთ სულ 6 დამჭერი 6 განსხვავებული ყუთისთვის.
თუ ნანახი გაქვთ ზემოთ მოჭედილი მფლობელის სურათი, სიურპრიზი გაფუჭდა - ეს არის ჩვენი სინესე დრაკონის ფერი!
ნაბიჯი 4: მაგრამ ეს ყუთები არც ისე ლამაზია…
და ვეთანხმები! სწორედ ამიტომ ჩვენ ვაპირებთ გამოვიყენოთ ლაზერული საჭრელი, რომ მოვაჭრათ ბევრად მიმზიდველი ყუთი, რომ შევინახოთ ყველა ეს ყუთი და დავფაროთ ისინი.
ჩამოტვირთეთ Adobe Illustrator ფაილები და ამოჭერით ისინი ლაზერული საჭრელის გამოყენებით. ღრუბლების დიზაინი ხელით დახატა ერთ -ერთმა მონაწილემ. მოგერიდებათ შეცვალოთ ისინი ილუსტრატორის ფაილის შიგნით ამოღებით და თქვენივე დიზაინის დამატებით, როგორც საჭიროდ ჩათვლით! ქვემოთ მოცემულია შემოთავაზებული ნაბიჯები ყველაფრის დასაყენებლად.
- შეიკრიბეთ და შეაწებეთ სამივე ნაწილი პირველი ფაილიდან (outerBoxFinal_1) ერთად.
- ჯერ არ დაამატოთ ნაჭერი მეორე ფაილიდან (outerBoxFinal_2).
- განათავსეთ ნაჭერი მესამე ფაილიდან (outerBoxFinal_3) ყუთის ბოლოში და ის უნდა დაიხუროს ზევით. წებო მხოლოდ ყუთის ბოლოში.
- დაბეჭდეთ შიდა ყუთები ორჯერ. ერთმანეთზე დააწებეთ ორი ცალი, რომლებსაც აქვთ დიდი ოთხკუთხედის ხვრელები. შემდეგ, დარჩენილი სამი ნაჭერი ერთმანეთთან წებო. დაბოლოს, მიამაგრეთ იგი სხვა წებოვან კომპლექტზე, რომელშიც ხვრელებია.
- მოათავსეთ პლატფორმა დიდი ყუთის ბოლოში.
- ჩადეთ 6ვე პატარა ყუთი მათ შესაბამის ადგილებზე პლატფორმაზე.
- ახლა, მოათავსეთ ნაჭერი მეორე ფაილიდან (outerBoxFinal_2) ყუთის თავზე და წაისვით კიდეზე. ზედა ნაჭრის ხვრელები უნდა შეესაბამებოდეს პატარა ყუთების ხვრელებს. თუ არა, გადააკეთეთ თქვენი პატარა ყუთები. საერთოდ არ დაამატოთ წებო პატარა ყუთებს.
- თუ თქვენ იყენებთ პურის დაფას, რომელსაც ბოლოში აქვს წებოვანი ნაჭერი, მოათავსეთ ეს ქვედა ნაწილის ცენტრთან ახლოს იმ ადგილას, სადაც ყუთის დახურვისას პურის დაფა ფოტონებთან ერთად უნდა გაქრეს. ქვედა ნაჭერზე არის პატარა ნაპრალები, რაც გაგიადვილებთ გარედან ფოტონებთან დაკავშირებას.
ნაბიჯი 5: უხერხული სათამაშოები? ოჰ, ჩემო
დრაკონის სხეული:
1. შეუთავსეთ სამი სლიკინი ცხელი წებოს ან ლენტის გამოყენებით.
2. გაზომეთ სლინკების სიგრძე და დიამეტრი და გაჭერით დეკორატიული ქსოვილის ნაჭერი.
3. მოიყვანეთ ქსოვილის ორი ბოლო და შეკერეთ ისინი ერთად.
4. მას შემდეგ რაც დაასრულებთ მათ კერვას, ჩაასრიალეთ წინდებივით წინდები.
5. შეკერეთ სლინკის ბოლოები შეკერილ ქსოვილზე.
ნაბიჯი 6: დაბეჭდეთ თქვენი დრაკონი
დრაკონის 3D ნაბეჭდი ნაწილები:
1. ნაწილები აღებულია
2. ჩვენ გამოვიყენეთ მხოლოდ თავი, ფეხები და თვალები.
3. ნაწილის 3D დაბეჭდვის შემდეგ გაასუფთავეთ იგი ქვიშაქვისა და აცეტონის გამოყენებით.
4. დახატეთ ნაწილები ისე, როგორც გსურთ მისი გაფორმება.
ნაბიჯი 7: დროა გააძლიეროთ თქვენი დრაკონი ნეოპიქსელებით
სინათლის სეგმენტი:
1. თქვენ შეგიძლიათ გამოიყენოთ ნეოპიქსელის ძაფები, თუ გსურთ განათების შექმნა. (ჩვენ ამოვარდით ძაფებიდან).
2. ჩვენ გამოვიყენეთ 20 ნეოპიქსელის ნათურა და დავუკავშირეთ ისინი მავთულის გამოყენებით. ეს მავთულები იყო გადაბმული მათზე და უკავშირდებოდა ფოტონს წითელი გაყვანილობის გამოყენებით ისე, რომ იგი ემთხვეოდა დრაკონის თემას.
3. თქვენ ასევე შეგიძლიათ შეკეროთ თქვენი ნეოპიქსელის შუქები გრძელ ქსოვილზე, მაგრამ ჩვენ არ გამოვიყენეთ ისინი იმიტომ, რომ ჩვენ გვქონდა ლითონისგან დამზადებული სლინკი.
ნაწილების შეკრება: დაიცავით სინათლის სეგმენტი დრაკონის სხეულის შიგნით ძაფების ან მავთულის გამოყენებით. დარწმუნდით, რომ თქვენ შეძლებთ განათების დაკავშირებას ძირითად ყუთში არსებულ ფოტონთან. მიამაგრეთ თავი, ფეხები და კუდი სხეულზე წებოს გამოყენებით. მას შემდეგ რაც ისინი ადგილზე იქნებიან, მიამაგრეთ სხეული ჩვენს მიერ ადრე დაბეჭდილ საყრდენებში. ახლა სხეული მზად არის პროგრამირებისთვის.
ნაბიჯი 8: პროგრამირების დრო
ვინაიდან ჩვენ ვიყენებთ ნაწილაკების ორ ფოტონს ექვსი ცალკეული სერვო ძრავით მუშაობისთვის (ერთ ფოტონს მხოლოდ ოთხზე შეუძლია მუშაობა), ჩვენ დავწერთ ორ ცალკეულ, მაგრამ მსგავს კოდს, რომელიც მიკროკონტროლერებზე უნდა აისახოს.
ახლა, პირველი მიკროკონტროლისთვის …
Arduino ფაილში (.ino) შეიტანეთ შემდეგი ბიბლიოთეკები და განსაზღვრავს:
#მოიცავს "neopixel.h"
#მოიცავს "ArduinoJson.h"
#განსაზღვრეთ PIXEL_PIN D4
#განსაზღვრეთ PIXEL_COUNT 18
შემდეგი, გამოაცხადეთ შემდეგი ცვლადები:
Adafruit_NeoPixel ზოლები = Adafruit_NeoPixel (PIXEL_COUNT, PIXEL_PIN);
Servo servoLeftRight_1; Servo servoUpDown_1; სერვო servoLeftRight_2; სერვო servoUpDown_2; int positionLeftRight_1 = 0; int positionUpDown_1 = 0; int leftRight_1 = 1; int upDown_1 = 1; int positionLeftRight_2 = 100; // უნდა იყოს 0 -დან 180 -მდე (გრადუსში) int positionUpDown_2 = 180; // უნდა იყოს 0 -დან 180 -მდე (გრადუსში) int მარცხენა მარჯვენა_2 = 1; // 0 = მარცხნივ, 1 = მარჯვნივ int upDown_2 = 1; // 0 = ზემოთ, 1 = ქვემოთ const size_t ბუფერული SizeCurrent = JSON_ARRAY_SIZE (1) + JSON_OBJECT_SIZE (1) + 2*JSON_OBJECT_SIZE (2) + JSON_OBJECT_SIZE (4) + JEJS (JS) 390; const size_t bufferSizeForecast = 38 * JSON_ARRAY_SIZE (1) + JSON_ARRAY_SIZE (38) + 2 * JSON_OBJECT_SIZE (0) + 112 * JSON_OBJECT_SIZE (1) + 39 * JSON_OBJECT_SIZE (2) + JSON_OBJECT_SIZE (3) + 38 * JSON_OBJECT_SIZE (4) + JSON_OBJECT_SIZE (5) + 76*JSON_OBJECT_SIZE (8) + 12490; სიმებიანი ამინდირარეი [3]; float temperatureArray [3]; float ტენიანობა მასივი [3]; float windSpeedArray [3]; სიმებიანი დროითი ბეჭედიArray [3]; int upDownMaxDeree [3]; int leftRightSpeed [3]; სიმებიანი allData5DaysForecast;
დააწკაპუნეთ აქ, რომ გაიგოთ, თუ როგორ უნდა დააყენოთ ვებგვერდები. როდესაც დასრულდება, დაამატეთ შემდეგი დეკლარაციები და ფუნქციები და საჭიროების შემთხვევაში განახორციელეთ შესაბამისი ცვლილებები:
void getWeather5DayForecast () {Particle.publish ("get_weather5DayForecast"); allData5DaysForecast = ""; } ტაიმერი timerWeatherForecast (60000, getWeather5DayForecast); void getCurrentWeather () {Particle.publish ("get_currentWeather"); } ტაიმერი timerWeatherCurrent (60000, getCurrentWeather);
შემდეგი ფუნქციები აკონტროლებს დრაკონის ზემოთ/ქვემოთ და მარცხნივ/მარჯვნივ მოძრაობას:
ბათილად ცვლაLeftRight1 () {if (leftRight_1) {positionLeftRight_1 = positionLeftRight_1 + leftRightSpeed [0]; if (positionLeftRight_1> 100) {leftRight_1 = 0; }} else {positionLeftRight_1 = positionLeftRight_1 - leftRightSpeed [0]; if (positionLeftRight_1 <0) {leftRight_1 = 1; }} servoLeftRight_1.write (positionLeftRight_1); }
void changeLeftRight2 () {
if (leftRight_2) {positionLeftRight_2 = positionLeftRight_2 + leftRightSpeed [1]; if (positionLeftRight_2> 100) {leftRight_2 = 0; }} else {positionLeftRight_2 = positionLeftRight_2 - leftRightSpeed [1]; if (positionLeftRight_2 <0) {leftRight_2 = 1; }} servoLeftRight_2.write (positionLeftRight_2); }
void changeUpDown1 () {
if (upDown_1) {positionUpDown_1 ++; if (positionUpDown_1> upDownMaxDegree [0]) {upDown_1 = 0; }} else {positionUpDown_1--; if (positionUpDown_1 <1) {upDown_1 = 1; }} servoUpDown_1.write (positionUpDown_1); }
void changeUpDown2 () {
if (upDown_2) {positionUpDown_2 ++; if (positionUpDown_2> upDownMaxDeree [1]) {upDown_2 = 0; }} else {positionUpDown_2--; if (positionUpDown_2 <1) {upDown_2 = 1; }} servoUpDown_2.write (positionUpDown_2); }
იმისათვის, რომ შეძლოთ მოძრაობების ინტერვალით შეცვლა, იქმნება ტაიმერები.
ტაიმერის ტაიმერიLeftRight1 (100, changeLeftRight1);
ტაიმერის ტაიმერიLeftRight2 (100, changeLeftRight2); ტაიმერი timerUpDown1 (10, changeUpDown1); ტაიმერი timerUpDown2 (10, changeUpDown2);
დაყენების ფუნქცია საბოლოოდ დაემატება შემდეგს. დარწმუნდით, რომ შეიტანეთ შესაბამისი ცვლილებები იმ კოდის ხაზებში, რომელიც ეხება ვებჰუკებს.
void setup () {// ამინდის ქრონომეტრების დაწყება timerWeatherForecast.start (); timerWeatherCurrent.start (); // ნეოპიქსელების ზოლები. დაწყება (); // განათავსეთ ინიციალიზაცია, როგორც pinMode და დაიწყეთ ფუნქციები აქ. // დააყენეთ Micro Servo servoLeftRight_1.attach (D1); servoUpDown_1. დამაგრება (D0); servoLeftRight_2.attach (D3); servoUpDown_2.attach (D2); servoLeftRight_1.write (positionLeftRight_1); // ინიციალიზაცია servo position servoUpDown_1.write (positionUpDown_1); // სერვო პოზიციის ინიციალიზაცია servoLeftRight_2.write (positionLeftRight_2); // ინიციალიზაცია servo position servoUpDown_2.write (positionUpDown_2); // ინიციალიზაცია servo position timerLeftRight1.start (); timerLeftRight2.start (); timerUpDown1.start (); timerUpDown2.start (); // გახსენით კონსოლი Serial.begin (9600); დაგვიანება (2000); Serial.println ("გამარჯობა!"); // გამოიწერეთ get_weather5DayForecast და get_currentWeather webhooks Particle.subscribe ("hook-response/get_weather5DayForecast", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe ("hook-response/get_currentWeather/0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather (); getWeather5DayForecast (); }
ამ პროექტისთვის მარყუჟის ფუნქცია არ გამოიყენება. ჩვენ არ შეგვიძლია დავივიწყოთ ვებგვერდებიდან მიღებული მონაცემების დამუშავების ფუნქციები!
void gotWeather5DayForecast (const char *მოვლენა, const char *მონაცემები) {allData5DaysForecast += მონაცემები; // ინახავს ყველა მონაცემს ერთ სტრიქონში. int allData5DaysForecastLen = allData5DaysForecast.length (); char buffer [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (ბუფერი, allData5DaysForecastLen + 1); // შექმენით ბუფერი სტრიქონის int bufferLength = sizeof (ბუფერი); DynamicJsonBuffer jsonBufferWeather (ბუფერული სიგრძე); JsonObject & root = jsonBufferWeather.parseObject (ბუფერი); // შეამოწმეთ წარმატებულია თუ არა ანალიზი. თუ (! root.success ()) {//Serial.println(" ამინდის პროგნოზირება 5 დღის პროგნოზით … შეცდომა! "); დაბრუნების; } int i = 1; JsonArray & list = root ["სია"]; for (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; float ტემპერატურა = მთავარი ["temp"]; int ტენიანობა = მთავარი ["ტენიანობა"]; JsonObject & weather = currentObject ["ამინდი"] [0]; const char* weatherInfo = ამინდი ["მთავარი"]; float windSpeed = currentObject ["ქარი"] ["სიჩქარე"]; const char* timestamp = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (ტემპერატურა); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDeree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; setColor (weatherInfo, i); ტემპერატურის მასივი = tempFah; ტენიანობა მასივი = ტენიანობა; weatherArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = დროის ნიშნული; მე ++; } სხვა {შესვენება; }}}
void gotCurrentWeatherData (const char *მოვლენა, const char *მონაცემები) {DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (მონაცემები); // შეამოწმეთ წარმატებულია თუ არა ანალიზი. თუ (! root.success ()) {//Serial.println(" მიმდინარე ამინდისთვის გაანალიზება … შეცდომა! "); დაბრუნების; } JsonObject & weather = root ["ამინდი"] [0]; const char* weather_main = ამინდი ["მთავარი"]; JsonObject & main = root ["მთავარი"]; float main_temp = main ["temp"]; int main_humidity = მთავარი ["ტენიანობა"]; float wind_speed = ფესვი ["ქარი"] ["სიჩქარე"]; const char* timestamp = root ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDeree; int servoIncrement = updateleftRight (wind_speed); leftRightSpeed [0] = servoIncrement; setColor (ამინდის_მთავარი, 0); weatherArray [0] = ამინდის მთავარი; ტემპერატურის მასივი [0] = tempFah; ტენიანობა მასივი [0] = მთავარი_ტენიანობა; windSpeedArray [0] = ქარის_ჩქარი; timestampArray [0] = დროის ნიშნული; }
ქვემოთ შეგიძლიათ იხილოთ დამატებითი ფუნქციები, რომლებიც აკონტროლებენ სერვო ძრავების პოზიციების განახლებას, ტემპერატურის გადაყვანას კელვინიდან ფარენჰეიტზე და LED- ების ფერების დაყენებაზე.
int updateUpDown (float temp) {// შეადგინეთ ხარისხი დიაპაზონში [0, 180] float servoMaxDegree = temp * 45 /31 + (990 /31); Serial.print ("ახალი servo ხარისხი:"); Serial.println (servoMaxDeree); დაბრუნება servoMaxDeree; }
int updateleftRight (float windSpeed) {
// შეადგინეთ ქარის სიჩქარე [1, 100] float servoIncrement = windSpeed * 99 /26 + 1; Serial.print ("ახალი სერვისის გაზრდის მნიშვნელობა:"); Serial.println (servoIncrement); დაბრუნების servoIncrement; }
int convertToFahrenheit (float tempKel) {
int tempFah = tempKel * 9.0 / 5.0 - 459.67; დაბრუნების tempFah; }
void setColor (String weatherDesc, int index) {
int ledIndex = 0; if (ინდექსი == 0) {ledIndex = 0; } else if (ინდექსი == 1) {ledIndex = 6; } else if (ინდექსი == 2) {ledIndex = 12; } სხვა {დაბრუნება; } if (weatherDesc == "წმინდა") {// ყვითელი for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (253, 219, 62)); // ყვითელი ზოლები. ჩვენება (); დაგვიანება (20); }} else if (weatherDesc == "ღრუბლები") {// ნაცრისფერი for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (223, 229, 237)); // ნაცრისფერი ზოლები. ჩვენება (); დაგვიანება (20); }} else if (weatherDesc == "თოვლი") {// თეთრი for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (255, 225, 225)); // თეთრი ზოლები. ჩვენება (); დაგვიანება (20); }} else if (weatherDesc == "წვიმა") {// ლურჯი for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (119, 191, 246)); // ლურჯი ზოლები. ჩვენება (); დაგვიანება (20); }} სხვა {// წითელი for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (254, 11, 5)); // წითელი ზოლები. ჩვენება (); დაგვიანება (20); }}}
მას შემდეგ რაც ყველაფერს დაამატებთ თქვენს Arduino ფაილში, შეადგინეთ იგი. თუ შეცდომები არ არის, გააგრძელეთ და ჩაწერეთ კოდი პირველ Photon– ზე. მომდევნო ნაბიჯი მოგაწვდით მსგავს კოდს, რომელიც გამოჩნდება მეორე ფოტონზე.
ნაბიჯი 9: პროგრამირება გრძელდება
ვინაიდან მეორე ფოტონის კოდი თითქმის იდენტურია პირველისთვის, მთელი კოდი კოპირებულია და ჩასმულია ქვემოთ:
#მოიცავს "ArduinoJson.h"
სერვო servoLeftRight_3;
სერვო servoUpDown_3;
int positionLeftRight_3 = 45;
int positionUpDown_3 = 0; int leftRight_3 = 1; int upDown_3 = 1;
const size_t ბუფერიSizeCurrent = JSON_ARRAY_SIZE (1) + JSON_OBJECT_SIZE (1) + 2*JSON_OBJECT_SIZE (2) + JSON_OBJECT_SIZE (4) + JSON_OBJECT_SIZE (JOZE)
const size_t bufferSizeForecast = 38 * JSON_ARRAY_SIZE (1) + JSON_ARRAY_SIZE (38) + 2 * JSON_OBJECT_SIZE (0) + 112 * JSON_OBJECT_SIZE (1) + 39 * JSON_OBJECT_SIZE (2) + JSON_OBJECT_SIZE (3) + 38 * JSON_OBJECT_SIZE (4) + JSON_OBJECT_SIZE (5) + 76*JSON_OBJECT_SIZE (8) + 12490;
სიმებიანი ამინდირარეი [3];
float temperatureArray [3]; float ტენიანობა მასივი [3]; float windSpeedArray [3]; სიმებიანი დროითი ბეჭედიArray [3]; int upDownMaxDeree [3]; int leftRightSpeed [3];
სიმებიანი allData5DaysForecast;
void getWeather5DayForecast ()
{Particle.publish ("get_weather5DayForecast2"); allData5DaysForecast = ""; }
ქრონომეტრი ქრონომეტრი WeatherForecast (60000, getWeather5DayForecast); // 10, 800, 000 ms = 3 დღე
void getCurrentWeather ()
{Particle.publish ("get_currentWeather2"); }
ტაიმერი timerWeatherCurrent (60000, getCurrentWeather);
void changeLeftRight3 () {
if (leftRight_3) {positionLeftRight_3 = positionLeftRight_3 + leftRightSpeed [2]; if (positionLeftRight_3> 100) {leftRight_3 = 0; }} else {positionLeftRight_3 = positionLeftRight_3 - leftRightSpeed [2]; if (positionLeftRight_3 <0) {leftRight_3 = 1; }} servoLeftRight_3.write (positionLeftRight_3); }
void changeUpDown3 () {
if (upDown_3) {positionUpDown_3 ++; if (positionUpDown_3> upDownMaxDeree [2]) {upDown_3 = 0; }} სხვა {positionUpDown_3--; if (positionUpDown_3 <1) {upDown_3 = 1; }} servoUpDown_3.write (positionUpDown_3); }
ტაიმერის ტაიმერიLeftRight3 (100, changeLeftRight3);
ტაიმერი timerUpDown3 (10, changeUpDown3);
void setup () {
// ამინდის ქრონომეტრების დაწყება timerWeatherForecast.start (); timerWeatherCurrent.start (); // განათავსეთ ინიციალიზაცია, როგორც pinMode და დაიწყეთ ფუნქციები აქ. // დააყენეთ Micro Servo servoLeftRight_3.attach (D1); servoUpDown_3. მიმაგრება (D0);
servoLeftRight_3.write (positionLeftRight_3); // სერვო პოზიციის ინიციალიზაცია
servoUpDown_3.write (positionUpDown_3); // სერვო პოზიციის ინიციალიზაცია
timerLeftRight3.start ();
timerUpDown3.start (); // გახსენით კონსოლი Serial.begin (9600); დაგვიანება (2000); Serial.println ("გამარჯობა!"); // გამოიწერეთ get_weather5DayForecast და get_currentWeather webhooks Particle.subscribe ("hook-response/get_weather5DayForecast2", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe ("hook-response/get_currentWeather2/0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather (); getWeather5DayForecast (); }
void gotWeather5DayForecast (const char *მოვლენა, const char *მონაცემები)
{allData5DaysForecast += მონაცემები; // ინახავს ყველა მონაცემს ერთ სტრიქონში. int allData5DaysForecastLen = allData5DaysForecast.length (); char buffer [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (ბუფერი, allData5DaysForecastLen + 1); // შექმენით ბუფერი სტრიქონის int bufferLength = sizeof (ბუფერი); DynamicJsonBuffer jsonBufferWeather (ბუფერული სიგრძე); JsonObject & root = jsonBufferWeather.parseObject (ბუფერი); //Serial.println(allData5DaysForecast); // შეამოწმეთ წარმატებულია თუ არა ანალიზი. თუ (! root.success ()) {//Serial.println(" ამინდის პროგნოზირება 5 დღის პროგნოზით … შეცდომა! "); დაბრუნების; } int i = 1; JsonArray & list = root ["სია"]; for (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; float ტემპერატურა = მთავარი ["temp"]; int ტენიანობა = მთავარი ["ტენიანობა"]; JsonObject & weather = currentObject ["ამინდი"] [0]; const char* weatherInfo = ამინდი ["მთავარი"]; float windSpeed = currentObject ["ქარი"] ["სიჩქარე"]; const char* timestamp = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (ტემპერატურა); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDeree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; ტემპერატურის მასივი = tempFah; ტენიანობა მასივი = ტენიანობა; weatherArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = დროის ნიშნული; მე ++; } სხვა {შესვენება; }}}
void gotCurrentWeatherData (const char *მოვლენა, const char *მონაცემები)
{DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (მონაცემები); //Serial.println (მონაცემები); // შეამოწმეთ წარმატებულია თუ არა ანალიზი. თუ (! root.success ()) {//Serial.println(" მიმდინარე ამინდისთვის გაანალიზება … შეცდომა! "); დაბრუნების; } JsonObject & weather = root ["ამინდი"] [0]; const char* weather_main = ამინდი ["მთავარი"]; JsonObject & main = root ["მთავარი"]; float main_temp = main ["temp"]; int main_humidity = მთავარი ["ტენიანობა"]; float wind_speed = ფესვი ["ქარი"] ["სიჩქარე"]; const char* timestamp = root ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDeree; int servoIncrement = updateleftRight (wind_speed); leftRightSpeed [0] = servoIncrement; weatherArray [0] = ამინდის მთავარი; ტემპერატურის მასივი [0] = tempFah; ტენიანობა მასივი [0] = მთავარი_ტენიანობა; windSpeedArray [0] = ქარის_ჩქარი; timestampArray [0] = დროის ნიშნული; }
int updateUpDown (float temp) {
// შეადგინეთ ხარისხი დიაპაზონში [0, 180] float servoMaxDegree = ტემპერატურა * 45 /31 + (990 /31); Serial.print ("ახალი servo ხარისხი:"); Serial.println (servoMaxDeree); დაბრუნება servoMaxDeree; }
int updateleftRight (float windSpeed) {
// შეადგინეთ ქარის სიჩქარე [1, 100] float servoIncrement = windSpeed * 99 /26 + 1; Serial.print ("ახალი სერვისის გაზრდის მნიშვნელობა:"); Serial.println (servoIncrement); დაბრუნების servoIncrement; }
int convertToFahrenheit (float tempKel) {
int tempFah = tempKel * 9.0 / 5.0 - 459.67; დაბრუნების tempFah; }
შენ გააკეთე! თქვენ მიაღწიეთ პროექტის პროგრამირების განყოფილებას! ახლა, დარწმუნდით, რომ გააკეთეთ ყველა გაყვანილობა და კავშირი სერვო ძრავებიდან და ნეოპიქსელებიდან პურის დაფაზე და მიკროკონტროლებთან. შენიშვნა: ჩადეთ დამატებითი დუელსი/ჩოპტიკები ვერტიკალური ნაპრალების მეშვეობით ყუთებზე სხეულის მარცხენა და მარჯვენა მოძრაობებისთვის. მეორე ბოლო უნდა იყოს დაკავშირებული დრაკონის სხეულთან.
ნაბიჯი 10: ისიამოვნე შენი დრაკონით
გილოცავთ! თქვენ ააშენეთ Sine-ese Dragon ნულიდან! ახლა თქვენ მხოლოდ უნდა დაჯდეთ და ისიამოვნოთ თქვენი გარემოს ჩვენებით!
შენიშვნა: ეს პროექტი შეიქმნა როგორც კურსის ნაწილი ჯოან ბემპონგისა და სუნდარია მუტუველის მიერ. კურსის გვერდი შეგიძლიათ იხილოთ აქ.
გირჩევთ:
ნახევარი ნაბიჯი: 5 ნაბიჯი (სურათებით)
სემინარი: IntroduçãoNeste projeto, você construirá um an sistema de semáforos: არსებობს 3 LED ნათურები სხვადასხვა ბირთვით (verde, amarelo e vermelho) para imitar os semáforos dos carros; არსებობს 2 LED ნათურები სხვადასხვა ბირთვით (verde და vermelho) იმისთვის, რომ გააკეთოთ
როგორ: ჟოლოს PI 4 Headless (VNC) დაყენება Rpi-imager და სურათებით: 7 ნაბიჯი (სურათებით)
როგორ: ჟოლოს PI 4 უსათაურო (VNC) დაყენება Rpi- გამოსახულებითა და სურათებით: ვგეგმავ გამოვიყენო ეს Rapsberry PI რამოდენიმე სახალისო პროექტში ჩემს ბლოგში. მოგერიდებათ მისი შემოწმება. მინდოდა დავბრუნებულიყავი ჩემი ჟოლოს PI– ს გამოყენებით, მაგრამ მე არ მქონდა კლავიატურა ან მაუსი ახალ ადგილას. დიდი ხანი იყო რაც ჟოლოს დაყენება
ESP8266/Arduino SmartThings Bearded Dragon Habitat Controller/მონიტორი: 4 ნაბიჯი
ESP8266/Arduino SmartThings Bearded Dragon ჰაბიტატის კონტროლერი/მონიტორი: DaVinci ჩვენი დრაკონი იყო პროგრამული უზრუნველყოფის განახლების გამო მისი Vivarium– ის კონტროლერისთვის. მე გადავწყვიტე მიგრაცია კარგი ტრადიციული Arduino ლოგიკით, რომელიც ბოლო ერთი წლის განმავლობაში საკმაოდ საიმედოდ იშლებოდა ST_Anything SmartThings– ში
როგორ დაიშალა კომპიუტერი მარტივი ნაბიჯებით და სურათებით: 13 ნაბიჯი (სურათებით)
როგორ დაიშალა კომპიუტერი მარტივი ნაბიჯებით და სურათებით: ეს არის ინსტრუქცია კომპიუტერის დაშლის შესახებ. ძირითადი კომპონენტების უმეტესობა მოდულურია და ადვილად იშლება. თუმცა მნიშვნელოვანია, რომ იყოთ ორგანიზებული ამის შესახებ. ეს დაგეხმარებათ ნაწილების დაკარგვისგან, ასევე ხელახალი შეკრებისას
როგორ გამოვიყენოთ Dragon Rider 500 თქვენი AVR Dragon– ით: 10 ნაბიჯი
როგორ გამოვიყენოთ Dragon Rider 500 თქვენი AVR Dragon– ით: ეს არის სასწავლო კურსი, თუ როგორ გამოიყენოთ Dragon Rider 500– ის ზოგიერთი მახასიათებელი Ecros Technologies– დან. გთხოვთ გაითვალისწინოთ, რომ Ecros– ის ვებგვერდზე არის ძალიან დეტალური მომხმარებლის სახელმძღვანელო. Dragon Rider არის ინტერფეისის დაფა