Мазмұны:
- 1 -қадам: жоғары және төмен
- 2 -қадам: Оң және сол туралы не деуге болады?
- 3 -қадам: денені көтеру … ҚАЛАЙ?
- 4 -қадам: Бірақ бұл қораптар әдемі емес …
- 5 -қадам: Slinky Toys ?? Ойбай
- 6 -қадам: айдаһарыңызды басып шығарыңыз
- 7 -қадам: NeoPixels көмегімен айдаһарды көтеру уақыты
- 8 -қадам: бағдарламалау уақыты
- 9 -қадам: Бағдарламалау жалғасуда
- 10 -қадам: Айдаһарыңыздан рахат алыңыз
Бейне: Sine-ese Dragon: 10 қадам (суреттермен)
2024 Автор: John Day | [email protected]. Соңғы өзгертілген: 2024-01-30 10:27
Sine-ese Dragon-бұл үш сағаттық аралықтағы ауа райы болжамын айту үшін механикалық қозғалыстар мен шамдарды қолданатын үй декоры. Анықтама бойынша қоршаған орта бір нәрсенің айналасын сипаттайды; сондықтан ауа райы туралы мәліметтерді қоршаған орта дисплейіне енгізу орынды деп шешілді. Ауа райы - бұл адамдардың күнін байқаусызда өзгертетін және әр минут сайын, тіпті секундқа дейін үнемі өзгеріп отыратын ақпарат бөлігі.
Қытай айдаһары - «күш, күш пен сәттілік символы» және Азия субконтинентінде жоғары мәдени және дәстүрлі құндылық болып табылады. Қытайлық айдаһар сәттілік әкелуден басқа, «суды, жауын -шашынды, тайфундар мен су тасқындарын» басқаратын күшті күштерге ие дейді. Ақыр соңында, қытайлық айдаһар ауа райы туралы мәліметтерді ұсынуға лайықты деп табылды.
Көрнекілік
Sine-ese айдаһар үш негізгі сегментте алты негізгі нүктеде 3 3 сағаттық ауа райы болжамын білдіреді. Әр 3 сағаттық интервал үшін келесі ақпарат қосылады:
- Ауа райы сипаттамасы - ағымдағы ауа райы ақпаратының түсін анықтайды.
- Температура - дененің биіктігін көрсетеді
- Ылғалдылық - жарық диодты сегменттердің жыпылықтауы
- Желдің жылдамдығы - дененің солға және оңға қозғалу жылдамдығын басқарады.
Қажетті материалдар
- 3 мм фанера/Картон
- 5 мм ағаш сүлгілер немесе таяқшалар
- 2 Бөлшек фотондар
- 3 Ұсақ ойыншықтар
- 6 серво қозғалтқышы
- NeoPixel шамдары (жіп немесе жеке шамдар бірге тігілген)
- Супер желім көп
- Өткізгіш жіп
- Акрил бояуы
- Сәндік мата
- Лазерлік кескіш
- 3D принтері
1 -қадам: жоғары және төмен
Sine-ese айдаһарын құрудың алғашқы қадамы-дененің жоғары және төмен қозғалысын басқаратын компонентті құру. Қандай жақсы!
-
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 -суретте көрсетілгендей екі платформаны бірге жинаңыз.
-
Қорапты біріктіріңіз. Бұл қиын болса да, оған жету оңай:
- Екі платформаны қораптың екі жағындағы екі үлкен тесіктің арасына кіргізу.
- Бірінші қолды үстіңгі платформаның үстіне қою.
- Қолды айналдыруды қолмен, содан кейін жоғарғы платформадан өткізіңіз.
- Екінші қолды төменгі платформаның жоғарғы жағына қою.
- Қолды айналдыруды екінші қолмен, содан кейін төменгі платформадан өткізу.
- Қолмен айналдырғышты 3D басып шығарылған қол бұрғыштың тіктөртбұрышты саңылауы арқылы бекіту.
- Токарьдың екінші ұшы сервоқозғалтқыштың үстіне түседі.
- Жоғарғы, төменгі және артқы бөліктерді қорапқа қосыңыз.
Сіздің соңғы жиналған қорапшаңыз алтыншы суретке ұқсас болуы керек. Енді сіз мұны тағы екі рет қайталауыңыз керек!
Бұл қадамның соңында сізде әрқайсысы жоғары/төмен және солға/оңға үш қозғалыс жүйесі бар алты қорап болуы керек.
3 -қадам: денені көтеру … ҚАЛАЙ?
Жақсы сұрақ! Бұл кезде 3D басып шығарылған жалпақ ұстаушылар келеді. Қосылған.stl файлын жүктеп алып, оны 3D принтермен басып шығарыңыз. 6 түрлі қорапқа барлығы 6 ұстағышты басып шығаруды ұмытпаңыз.
Егер сіз жоғарыдағы жалпақ ұстаушының суретін көрген болсаңыз, тосын сый жойылды - бұл біздің Синусе айдаһардың түсі!
4 -қадам: Бірақ бұл қораптар әдемі емес …
Ал мен келісемін! Сондықтан біз лазерлік кескішті қолданып, барлық қораптарды сақтап, жасыру үшін әлдеқайда тартымды қорапшаны кесеміз.
Adobe Illustrator файлдарын жүктеңіз және оларды лазерлік кескішпен кесіңіз. Бұлттардың дизайнын қатысушылардың бірі қолмен жасаған. Оларды иллюстратор файлының ішінен алып тастап, өзіңіздің қалауыңыз бойынша өзіңіздің дизайныңызды қосу арқылы өзгертіңіз! Төменде бәрін біріктіру үшін ұсынылған қадамдар берілген.
- Бірінші файлдың барлық үш бөлігін (tashqiBoxFinal_1) бірге жинап, жабыстырыңыз.
- Бөлімді екінші файлдан (сыртқыBoxFinal_2) әлі қоспаңыз.
- Үшінші файлдан (tashqiBoxFinal_3) бөлікті қораптың төменгі жағына қойыңыз, ол жоғарғы жағында жабылуы керек. Тек қораптың төменгі жағына жабыстырыңыз.
- InnerBoxesPlatform екі рет басып шығарыңыз. Үлкен тіктөртбұрышты тесіктері бар екі бөлікті бір -біріне жабыстырыңыз. Содан кейін қалған үш бөлікті бір -біріне жабыстырыңыз. Соңында, оны тесіктері бар басқа желімделген жинаққа жабыстырыңыз.
- Платформаны үлкен қораптың төменгі жағына қойыңыз.
- Барлық 6 кіші қорапты платформаға сәйкес орындарына салыңыз.
- Енді бөлікті екінші файлдан (сыртBoxFinal_2) қораптың жоғарғы жағына қойып, шетінен жабыстырыңыз. Жоғарғы бөліктегі тесіктер кіші қораптардың тесіктерімен сәйкес келуі керек. Олай болмаған жағдайда, кішкене қораптарды қайта реттеңіз. Кішкене қораптарға желім қоспаңыз.
- Егер сіз төменгі жағында жабысқақ бөлігі бар тақтаны қолдансаңыз, оны төменгі бөліктің ортасына жақын қойыңыз, қорапты жапқан кезде фотонмен бірге тақта жоғалады. Төменгі бөлігінде фотондарға сырттан қосылуды жеңілдететін ұсақ тесіктер бар.
5 -қадам: Slinky Toys ?? Ойбай
Айдаһардың денесі:
1. Ыстық желім немесе таспаны қолданып үш шламды біріктіріңіз.
2. Шламдардың ұзындығы мен диаметрін өлшеп, сәндік матаның бір бөлігін кесіңіз.
3. Матаның екі ұшын әкеліп, бір -біріне тігіңіз.
4. Оларды тігуді аяқтағаннан кейін, шұлықтарды шұлық сияқты сырғытыңыз.
5. Шұңқырдың ұштарын тігілген матаға тігіңіз.
6 -қадам: айдаһарыңызды басып шығарыңыз
Айдаһардың 3D басып шығарылған бөліктері:
1. Бөлшектер https://www.thingiverse.com/thing:854575 сайтынан алынды.
2. Біз тек бас, аяқ және көзді қолдандық.
3. Бөлшекті 3D басып шығарғаннан кейін оны тегістеуіш пен ацетонмен тегістеңіз.
4. Бөлшектерді қалай безендіргіңіз келсе, солай бояңыз.
7 -қадам: NeoPixels көмегімен айдаһарды көтеру уақыты
Жарық сегменті:
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);
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 leftRight_2 = 1; // 0 = солға, 1 = оңға int upDown_2 = 1; // 0 = жоғары, 1 = төмен const size_t bufferSizeCurrent = JSON_ARRAY_SIZE (1) + JSON_OBJECT_SIZE (1) + 2*JSON_OBJECT_SIZE (2) + JSON_OBJECT_SIZE (4) + JSON_OBJEC_SIZE (4) + JSON_OBJEC_SIZE (4) + JSON_OBJEC_SIZE 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_OBJEC_SIZ_2_JIZ_SIZ_ (+) (5) + 76*JSON_OBJECT_SIZE (8) + 12490; Ауа райыArray [3]; өзгермелі температураRray [3]; қалқымалы ылғалдылық Array [3]; өзгермелі windSpeedArray [3]; Жол белгісіArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3]; AllData5DaysForecast жолы;
Веб -ілмектерді қалай орнату керектігін білу үшін мына жерді басыңыз. Аяқтағаннан кейін келесі декларациялар мен функцияларды қосыңыз және қажет болған жағдайда тиісті өзгертулер енгізіңіз:
жарамсыз getWeather5DayForecast () {Particle.publish («get_weather5DayForecast»); allData5DaysForecast = «»; } Timer timerWeatherForecast (60000, getWeather5DayForecast); жарамсыз getCurrentWeather () {Particle.publish («get_currentWeather»); } Timer timerWeatherCurrent (60000, getCurrentWeather);
Келесі функциялар айдаһардың жоғары/төмен және солға/оңға қозғалысын басқарады:
жарамсыз өзгертуLeftRight1 () {if (leftRight_1) {positionLeftRight_1 = positionLeftRight_1 + leftRightSpeed [0]; if (positionLeftRight_1> 100) {leftRight_1 = 0; }} басқа {positionLeftRight_1 = positionLeftRight_1 - leftRightSpeed [0]; if (positionLeftRight_1 <0) {leftRight_1 = 1; }} servoLeftRight_1.write (positionLeftRight_1); }
жарамсыз өзгертуLeftRight2 () {
if (leftRight_2) {positionLeftRight_2 = positionLeftRight_2 + leftRightSpeed [1]; if (positionLeftRight_2> 100) {leftRight_2 = 0; }} басқа {positionLeftRight_2 = positionLeftRight_2 - leftRightSpeed [1]; if (positionLeftRight_2 <0) {leftRight_2 = 1; }} servoLeftRight_2.write (positionLeftRight_2); }
жарамсыз өзгертуUpDown1 () {
if (upDown_1) {positionUpDown_1 ++; if (positionUpDown_1> upDownMaxDegree [0]) {upDown_1 = 0; }} басқа {positionUpDown_1--; if (positionUpDown_1 <1) {upDown_1 = 1; }} servoUpDown_1.write (positionUpDown_1); }
жарамсыз өзгертуUpDown2 () {
if (upDown_2) {positionUpDown_2 ++; if (positionUpDown_2> upDownMaxDegree [1]) {upDown_2 = 0; }} басқа {positionUpDown_2--; if (positionUpDown_2 <1) {upDown_2 = 1; }} servoUpDown_2.write (positionUpDown_2); }
Қозғалысты интервалда өзгерту үшін таймерлер құрылады.
Таймер TimerLeftRight1 (100, changeLeftRight1);
Таймер таймеріLeftRight2 (100, changeLeftRight2); Таймер timerUpDown1 (10, changeUpDown1); Таймер timerUpDown2 (10, changeUpDown2);
Соңында орнату функциясы қосылады. Webhooks -пен айналысатын код жолдарына тиісті өзгерістер енгізуді ұмытпаңыз.
void setup () {// ауа райы таймерлерін іске қосу timerWeatherForecast.start (); timerWeatherCurrent.start (); // Neopixels strip.begin (); // pinMode сияқты инициализацияны қойыңыз және функцияларды осында бастаңыз. // Micro Servo servoLeftRight_1.attach (D1) орнату; servoUpDown_1.attach (D0); servoLeftRight_2.attach (D3); servoUpDown_2.attach (D2); servoLeftRight_1.write (positionLeftRight_1); // серво позициясын инициализациялау servoUpDown_1.write (positionUpDown_1); // серво позициясын инициализациялау servoLeftRight_2.write (positionLeftRight_2); // серво позициясын инициализациялау servoUpDown_2.write (positionUpDown_2); // серво позициясын инициализациялау timerLeftRight1.start (); timerLeftRight2.start (); timerUpDown1.start (); timerUpDown2.start (); // Serial.begin (9600) консолін ашыңыз; кешіктіру (2000); Serial.println («Сәлем!»); // get_weather5DayForecast пен get_currentWeather веб-ілгектеріне жазылыңыз Particle.subscribe («ілмек-жауап/get_weather5DayForecast», gotWeather5DayForecast, MY_DEVICES); Particle.subscribe («ілмек-жауап/get_currentWeather/0», gotCurrentWeatherData, MY_DEVICES); getCurrentWeather (); getWeather5DayForecast (); }
Бұл жоба үшін цикл функциясы қолданылмайды. Біз веб -ілгектерден алынған деректерді өңдеу функцияларын ұмыта алмаймыз!
void gotWeather5DayForecast (const char *оқиға, const char *деректер) {allData5DaysForecast += деректер; // барлық деректерді бір жолға сақтайды. int allData5DaysForecastLen = allData5DaysForecast.length (); char буфері [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (буфер, allData5DaysForecastLen + 1); // int bufferLength = sizeof (буфер) жолы үшін буфер құру; DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (буфер); // Талдау сәтті болатынын тексеріңіз. if (! root.success ()) {//Serial.println("5 күндік ауа райын талдау … ҚАТЕ! «); қайтару; } int i = 1; JsonArray & list = root [«list»]; for (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject [«main»]; өзгермелі температура = негізгі [«temp»]; int ылғалдылығы = негізгі [«ылғалдылық»]; JsonObject & weather = currentObject [«ауа райы»] [0]; const char* weatherInfo = ауа райы [«негізгі»]; float windSpeed = currentObject [«wind»] [«speed»]; const char* timestamp = currentObject [«dt_txt»]; int tempFah = convertToFahrenheit (температура); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; setColor (ауа райы мәліметі, i); temperaturArray = tempFah; moistArray = ылғалдылық; ауа райыArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = уақыт белгісі; i ++; } басқа {үзіліс; }}}
void gotCurrentWeatherData (const char *оқиға, const char *деректер) {DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (деректер); // Талдау сәтті болатынын тексеріңіз. if (! root.success ()) {//Serial.println("Ағымдағы ауа райы бойынша талдау… ҚАТЕ! «); қайтару; } JsonObject & weather = root [«ауа райы»] [0]; const char* weather_main = ауа райы [«негізгі»]; JsonObject & main = root [«main»]; float main_temp = main [«temp»]; int main_humidity = main [«ылғалдылық»]; float wind_speed = түбір [«жел»] [«жылдамдық»]; const char* timestamp = root [«dt_txt»]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (wind_speed); leftRightSpeed [0] = servoIncrement; setColor (ауа райы_басты, 0); weatherArray [0] = ауа райы_басты; temperaturArray [0] = tempFah; moistArray [0] = негізгі ылғалдылық; windSpeedArray [0] = жел жылдамдығы; timestampArray [0] = уақыт белгісі; }
Төменде сіз серво қозғалтқыштарының позицияларын жаңартуды, температураны Келвиннен Фаренгейтке түрлендіруді және жарықдиодты түстерді орнатуды басқаратын қосымша функцияларды таба аласыз.
int updateUpDown (float temp) {// Дәрежені [0, 180] float servoMaxDegree = temp * 45/31 + (990 /31) диапазонына салыстырыңыз; Serial.print («жаңа серво дәрежесі:»); Serial.println (servoMaxDegree); servoMaxDegree қайтару; }
int updateleftRight (өзгермелі windSpeed) {
// Желдің жылдамдығын [1, 100] өзгермелі servoIncrement = windSpeed * 99 /26 + 1 диапазонына салыстырыңыз; Serial.print («servo increment new value:»); Serial.println (servoIncrement); қайтару servoIncrement; }
int convertToFahrenheit (өзгермелі tempKel) {
int tempFah = tempKel * 9.0 / 5.0 - 459.67; қайтару tempFah; }
void setColor (String weatherDesc, int index) {
int ledIndex = 0; if (индекс == 0) {ledIndex = 0; } if if (index == 1) {ledIndex = 6; } else if (индекс == 2) {ledIndex = 12; } else {қайтару; } if (weatherDesc == «Clear») {// сары үшін (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (253, 219, 62)); // сары жолақ.show (); кешіктіру (20); }} else if (weatherDesc == «Бұлттар») {// сұр үшін (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (223, 229, 237)); // сұр жолақ.show (); кешіктіру (20); }} else if (weatherDesc == «Snow») {// white for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (255, 225, 225)); // ақ жолақ.show (); кешіктіру (20); }} else if (weatherDesc == «Rain») {// blue for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (119, 191, 246)); // көк жолақ.show (); кешіктіру (20); }} else {// red 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 bufferSizeCurrent = JSON_ARRAY_SIZE (1) + JSON_OBJECT_SIZE (1) + 2*JSON_OBJECT_SIZE (2) + JSON_OBJECT_SIZE (4) + JSON_OBJECT_SIZE (5) + JSON_ (JOB_JE)
const size_t bufferSizeForecast = 38*JSON_ARRAY_SIZE (1) + JSON_ARRAY_SIZE (38) + 2*JSON_OBJECT_SIZE (0) + 112*JSON_OBJEC_SIZE (1) + 39*JSON_OBJEC_SIZ_2_JIZ_SIZ_ (2) (5) + 76*JSON_OBJECT_SIZE (8) + 12490;
Ауа райыArray [3];
өзгермелі температураRray [3]; қалқымалы ылғалдылық Array [3]; өзгермелі windSpeedArray [3]; Жол белгісіArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3];
AllData5DaysForecast жолы;
void getWeather5DayForecast ()
{Particle.publish («get_weather5DayForecast2»); allData5DaysForecast = «»; }
Таймер TimerWeatherForecast (60000, getWeather5DayForecast); // 10, 800, 000 мс = 3 күн
жарамсыз getCurrentWeather ()
{Particle.publish («get_currentWeather2»); }
Таймер таймері WeatherCurrent (60000, getCurrentWeather);
жарамсыз өзгертуLeftRight3 () {
if (leftRight_3) {positionLeftRight_3 = positionLeftRight_3 + leftRightSpeed [2]; if (positionLeftRight_3> 100) {leftRight_3 = 0; }} басқа {positionLeftRight_3 = positionLeftRight_3 - leftRightSpeed [2]; if (positionLeftRight_3 <0) {leftRight_3 = 1; }} servoLeftRight_3.write (positionLeftRight_3); }
жарамсыз өзгертуUpDown3 () {
if (upDown_3) {positionUpDown_3 ++; if (positionUpDown_3> upDownMaxDegree [2]) {upDown_3 = 0; }} басқа {positionUpDown_3--; if (positionUpDown_3 <1) {upDown_3 = 1; }} servoUpDown_3.write (positionUpDown_3); }
Таймер таймеріLeftRight3 (100, changeLeftRight3);
Таймер timerUpDown3 (10, changeUpDown3);
жарамсыз орнату () {
// ауа райы таймерін іске қосыңыз timerWeatherForecast.start (); timerWeatherCurrent.start (); // pinMode сияқты инициализацияны қойыңыз және функцияларды осында бастаңыз. // Micro Servo servoLeftRight_3.attach (D1) орнату; servoUpDown_3.attach (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 веб-ілгектеріне жазылыңыз Particle.subscribe («ілмек-жауап/get_weather5DayForecast2», gotWeather5DayForecast, MY_DEVICES); Particle.subscribe («ілмек-жауап/get_currentWeather2/0», gotCurrentWeatherData, MY_DEVICES); getCurrentWeather (); getWeather5DayForecast (); }
void gotWeather5DayForecast (const char *оқиғасы, const char *деректері)
{allData5DaysForecast += деректер; // барлық деректерді бір жолға сақтайды. int allData5DaysForecastLen = allData5DaysForecast.length (); char буфері [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (буфер, allData5DaysForecastLen + 1); // int bufferLength = sizeof (буфер) жолы үшін буфер құру; DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (буфер); //Serial.println(allData5DaysForecast); // Талдау сәтті болатынын тексеріңіз. if (! root.success ()) {//Serial.println("5 күндік ауа райын талдау … ҚАТЕ! «); қайтару; } int i = 1; JsonArray & list = root [«list»]; for (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject [«main»]; өзгермелі температура = негізгі [«temp»]; int ылғалдылығы = негізгі [«ылғалдылық»]; JsonObject & weather = currentObject [«ауа райы»] [0]; const char* weatherInfo = ауа райы [«негізгі»]; float windSpeed = currentObject [«wind»] [«speed»]; const char* timestamp = currentObject [«dt_txt»]; int tempFah = convertToFahrenheit (температура); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; temperaturArray = tempFah; moistArray = ылғалдылық; ауа райыArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = уақыт белгісі; i ++; } басқа {үзіліс; }}}
void gotCurrentWeatherData (const char *оқиғасы, const char *деректері)
{DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (деректер); //Serial.println(деректер); // Талдау сәтті болатынын тексеріңіз. if (! root.success ()) {//Serial.println("Ағымдағы ауа райы бойынша талдау… ҚАТЕ! «); қайтару; } JsonObject & weather = root [«ауа райы»] [0]; const char* weather_main = ауа райы [«негізгі»]; JsonObject & main = root [«main»]; float main_temp = main [«temp»]; int main_humidity = main [«ылғалдылық»]; float wind_speed = түбір [«жел»] [«жылдамдық»]; const char* timestamp = root [«dt_txt»]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (wind_speed); leftRightSpeed [0] = servoIncrement; weatherArray [0] = ауа райы_басты; temperaturArray [0] = tempFah; moistArray [0] = негізгі ылғалдылық; windSpeedArray [0] = жел жылдамдығы; timestampArray [0] = уақыт белгісі; }
int updateUpDown (өзгермелі уақыт) {
// Дәрежені [0, 180] өзгермелі servoMaxDegree = temp * 45/31 + (990 /31) диапазонына салыстырыңыз; Serial.print («жаңа серво дәрежесі:»); Serial.println (servoMaxDegree); servoMaxDegree қайтару; }
int updateleftRight (өзгермелі windSpeed) {
// Желдің жылдамдығын [1, 100] өзгермелі servoIncrement = windSpeed * 99 /26 + 1 диапазонына салыстырыңыз; Serial.print («servo increment new value:»); Serial.println (servoIncrement); қайтару servoIncrement; }
int convertToFahrenheit (өзгермелі tempKel) {
int tempFah = tempKel * 9.0 / 5.0 - 459.67; қайтару tempFah; }
Сіз жасадыңыз! Сіз жобаның бағдарламалау бөлімінен өттіңіз! Енді сервоқозғалтқыштар мен неопиксельдерден нан тақтасы мен микроконтроллерлерге барлық сымдар мен қосылыстарды орнатуды ұмытпаңыз. ЕСКЕРТПЕ: корпустың сол және оң қозғалысы үшін қораптардың тік тесіктері арқылы қосымша шпилькаларды/таяқшаларды салыңыз. Екінші ұшын айдаһардың корпусымен байланыстыру керек.
10 -қадам: Айдаһарыңыздан рахат алыңыз
Құттықтаймын! Сіз Sine-ese айдаһарын нөлден құрдыңыз! Енді сіз тек отыруға және қоршаған ортадағы дисплейден ләззат алуыңыз керек!
ЕСКЕРТПЕ: Бұл жоба Джоан Бемпонг пен Саундария Мутувель курстық жұмыстың бөлігі ретінде салынған. Курстың бетін мына жерден табуға болады.
Ұсынылған:
DIY 37 Leds Arduino рулетка ойыны: 3 қадам (суреттермен)
DIY 37 Leds Arduino рулетка ойыны: Рулетка - бұл кішкентай дөңгелекті білдіретін француз сөзімен аталған казино ойыны
Arduino басқарылатын робот - екі қадам: 13 қадам (суреттермен)
Arduino басқарылатын роботты екіжақты: Мен әрқашан роботтарға қызығатынмын, әсіресе адамның іс -әрекетіне еліктеуге тырысатын. Бұл қызығушылық мені жаяу жүруге және жүгіруге еліктей алатын екіжақты робот құрастыруға және дамытуға талпындырды. Бұл нұсқаулықта мен сізге көрсетемін
Arduino Uno көмегімен акустикалық левитация Қадамдық қадам (8 қадам): 8 қадам
Акустикалық левитация Arduino Uno Қадамдық қадаммен (8-қадам): ультрадыбыстық дыбыс түрлендіргіштері L298N Dc әйелдер адаптерінің ток көзі еркек тоқ сымымен Arduino UNOBreadboard Бұл қалай жұмыс істейді: Біріншіден, сіз кодты Arduino Uno-ға жүктейсіз (бұл сандық жүйемен жабдықталған микроконтроллер) және кодты түрлендіру үшін аналогтық порттар (C ++)
Болт - DIY сымсыз зарядтау түнгі сағаты (6 қадам): 6 қадам (суреттермен)
Болт - DIY сымсыз зарядтау түнгі сағаты (6 қадам): Индуктивті зарядтау (сымсыз зарядтау немесе сымсыз зарядтау деп те аталады) - сымсыз қуат беру түрі. Ол портативті құрылғыларды электрмен қамтамасыз ету үшін электромагниттік индукцияны қолданады. Ең көп таралған қолданба - Qi сымсыз зарядтау
Dragon Rider 500 -ді AVR айдаһарымен қалай қолдануға болады: 10 қадам
Dragon Rider 500 -ді AVR айдаһарымен қалай пайдалану керек: Бұл нұсқаулық Ecros Technologies компаниясының Dragon Rider 500 -дің кейбір мүмкіндіктерін пайдалану бойынша апаттық курс. Ecros веб -сайтында өте егжей -тегжейлі пайдаланушы нұсқаулығы бар екенін біліңіз. Dragon Rider - бұл интерфейс тақтасы