Мазмуну:

Traffic Report Check (NL) Doormat менен: 6 кадам
Traffic Report Check (NL) Doormat менен: 6 кадам

Video: Traffic Report Check (NL) Doormat менен: 6 кадам

Video: Traffic Report Check (NL) Doormat менен: 6 кадам
Video: How to Sublimate Large Designs Sublimation Doormat 2024, Июль
Anonim
Traffic Report Check (NL) Doormat менен
Traffic Report Check (NL) Doormat менен

Бул нускамада мен Голландиянын магистралдарынын трафик отчетторун текшере турган эшикти кантип курууну сүрөттөп берем. Эшиктин сыртына чыккандан кийин жана маршрутуңузда тыгын пайда болгондон кийин, килем кызыл түскө айланат. Тыгын жок болгондо килемче жашыл болуп калат.

Мен NodeMCU 1.0 (ESP0-12E модулу) үстүндө иштейм. Бул долбоордун коду башка түзмөктөрдө да иштеши мүмкүн (мис. Arduino такталары). Бул долбоор ANWB трафик боюнча Голландиянын булагына негизделген.

Бул долбоор үчүн бизге эмне керек:

- NodeMCU - Jumper зымдары - LED жарыгы же тилке - Аналогдук сенсор (Aluminiuim фольга, Губка) - Wi -Fi байланышы - Doormat

Биз кылышыбыз керек болгон кадамдар:

1. Wi-Fiга NodeMCu туташтыруу 2. ANWB.nl дан HTTPS аркылуу маалыматтарды сурап алуу 3. Дайындарды пайдалуу маалыматка айландыруу 4. Триггерди орнотуу 5. Дизайн боюнча пикир

1-кадам: NodeMCUду Wi-Fiга туташтырыңыз

Бул кадам түзмөк интернетке туташканбы же жокпу, HTTPSRequest кантип ийгиликтүү аткарыларын көрсөтөт.

Биринчиден, ESP8266 китепканасын Arduino IDEге орнотуңуз. ESP8266> HTTPSRequest мисалдарынан ачыңыз.

Төмөндө көрсөтүлгөндөй, кодуңуздун жогору жагындагы Wi-Fi грамоталарын толтуруңуз:

const char* ssid = "YOUR_SSID";

const char* password = "YOUR_PASS";

Кодду түзмөгүңүзгө жүктөңүз жана NodeMCU интернетке туташып жатканын текшериңиз. HTTPSRequest мисалы Githubдан маалыматты алуу үчүн демейки катары колдонот. HTTPSRequest ийгиликтүү болгондо, сиз Github маалыматтарын сериялык монитордон аласыз.

2 -кадам: ANWB.nlден HTTPSтен маалыматтарды сураңыз

Бул экинчи кадамда, сиз маалымат булагын демейки абалдан бул долбоор үчүн керектүү булакка өзгөртөсүз: ANWB.nl.

Кодуңуздун жогору жагында char* хостун www.anwb.nlге алмаштырыңыз (же сиздин маалыматыңызды алууну каалаган башка булак):

const char* host = "www.anwb.nl";!! Эгер башка булакты колдонсоңуз, 3 -кадам менин кодумдан айырмаланат. 3 -кадамга керектүү маалыматты алуу үчүн конкреттүү коддоо керек!

Андан кийин, функция орнотуусундагы саптын url'ин "/feeds/gethf" деп өзгөртүңүз, бул маалымат алынган:

String url = "/feeds/gethf";!! Эгерде сиз башка булакты колдонсоңуз, булагыңыздын жолун колдонуңуз!

Кодду жүктөгөндө www.anwb.nl/feeds/gethf дарегиндеги бардык маалыматтар менен жооп алышыңыз керек. Бул код линия деп аталган сапка сакталат.

3 -кадам: Колдонулуучу маалыматка маалыматтарды буруңуз

Ушул убакка чейин, код NodeMCU иштетилгенде же баштапкы абалга келгенде гана иштеген, анткени бардык код орнотуу функциясында. Триггерди кодду үзгүлтүксүз иштетүү үчүн, HTTPS өтүнүчүн иштеткен коддун абалын өзгөртүү керек. Цикл функциясынын астына сиз дагы бир функцияны кошосуз. Мен аны жокко чыгарылган extractData деп атадым:

extractData () {

}

Орнотуу функциясынан коддун бир бөлүгүн extractData () көчүрүңүз. Орнотуу функциясы аяктаганга чейин төмөнкү саптан баштаңыз:

эгер (! client.connect (хост, Код азыр сиздин жаңы функцияңызда, андыктан көчүрүү кодун орнотуу функциясынан алып салыңыз.

Андан кийин, цикл функциясында extractData функциясын чакырып, nodeMCU эс алуу үчүн бир аз кечигүүнү кошуңуз:

void loop () {

extractData (); кечигүү (30000); // бул кийинчерээк аналогдук сенсор болгондо өчүрүлөт}

Сиз алган маалыматтар сапта сакталгандыктан жана бул саптын бөлүктөрү гана керек болгондуктан, циклдар үчүн бир -эки жазышыңыз керек.

Биринчиден, "жол" сөзүнүн бардык позицияларын текшериңиз. "Жол" деген сөздөн кийин жолдун аталышы коштолот (A1, A2 ж.б.).

For циклдерин жазууну баштоодон мурун, сиз колдоно турган кээ бир өзгөрмөлөрдү жарыялашыңыз керек:

int noOfPos = 0;

логикалык hasRunOnce = false; int from = 0; int roadArray [20];

Эми кээ бир циклдерди жазууга убакыт келди. Мен extractData функциясынын ылдый жагында for циклдерин жаздым. Мен аны өзүнчө функцияларга бөлүүгө аракет кылдым, бирок иштей албадым.

No1 цикл үчүн: сап сөзүндөгү жол сөзүнүн ордун табыңыз:

for (int i = 0; i <line.length (); i ++) {int pos = line.indexOf ("road \": ", from); roadArray [noOfPos] = pos; noOfPos+= 1; from = pos + 1; if (hasRunOnce == true && pos == line.indexOf ("road \": ")) {i = line.length (); } hasRunOnce = true; }

Андан кийин, кайсы жолдордо тыгын бар экенин текшериңиз, жогорудагы for циклинин позицияларын колдонуу менен. Жолдордун аталышынын позициясы дайыма бирдей жана жол белгисинен кийин 7 белгиден башталат жана 10 белгиден бүтөт.

Эми биз nameOfRoadArray массивин аныктайбыз, ал кийинки цикл үчүн толтурулат:

String nameOfRoadArray [20];

No2 цикл үчүн: no loop үчүн киргизилген жолдордун бардык аталыштарын табыңыз. 1

үчүн (int k = 0; k <20; k ++) {int pos = roadArray [k]; int positionOfRoadName = pos + 7; int endOfPositionOfRoadName = pos + 10; nameOfRoadArray [k] = line.substring (positionOfRoadName, endOfPositionOfRoadName); }

Array nameOfRoudArray бардык тыгындар белги менен толтурулушу керек.

Андан кийин, сиздин жолдун тыгыны бар жолдордун катарында экенин текшерип жатасыз. Жолдорго маалымат алуу үчүн nameOfRoadArray басып чыгарыңыз. Муну Serial.println (nameOfRoadArray [k]) кошуу менен жасаңыз; 2 -циклге окшош:

үчүн (int k = 0; k <20; k ++) {int pos = roadArray [k]; int positionOfRoadName = pos + 7; int endOfPositionOfRoadName = pos + 10; nameOfRoadArray [k] = line.substring (positionOfRoadName, endOfPositionOfRoadName); Serial.println (nameOfRoadArray [k]); }

Туура болсо, сериялык монитордо тыгыны бар бардык жолдорду көрөсүз.

Акыркы For циклин жазардан мурун, логикалык глобалдык өзгөрмө катары жарыялашыңыз керек. TrafficJam деп аталган логикалык мааниси жалган болуп саналат жана эгерде extractData функциясы тыгын үчүн чындыкка кайтып келсе, өзгөрөт. Төмөнкү код.ino файлынын үстүнө барат:

логикалык TrafficJam = жалган;

No3 цикл үчүн: Жол, бул учурда А1, тыгындардын тизмесинде экенин текшериңиз.

for (int l = 0; l <20; l ++) {if (nameOfRoadArray [l] == "A1 \" ") {// A1ди өзүңүзгө жаккан трафикке алмаштырыңыз trafficJam = true;}

Эгерде сиз TrafficJamди сериялык мониторго басып чыгарсаңыз, анда A1де тыгын бар же жок экенин билесиз.

Бул кодду extractData функциясынын астына коюңуз:

Serial.println (trafficJam); // тыгын барбы же жокпу, көрүңүз

Бул маалымат менен биз 5 -кадамдагы системанын кайтарым байланышынын үстүндө иштейбиз.

4 -кадам: Триггерди орнотуңуз

Trigger орнотуу
Trigger орнотуу
Trigger орнотуу
Trigger орнотуу
Trigger орнотуу
Trigger орнотуу

Биз азыр маалыматты булактан ийгиликтүү ала алганыбыз үчүн, extractData функциясын иштетүү үчүн nodeMCUду иштете турган сенсор курууга убакыт келди. Мен эшиктин төшөгүнөн аналогдук сенсор жасоону чечтим. Башка сенсордун жардамы менен триггерди алмаштырсаңыз болот.

Аналогдук сенсорду куруу

Мен 2 даана алюминий фольга, эки секирүүчү зым жана губканы колдондум.

Губкада тешик жасаңыз, бул жерде алюминий фольгалары байланышка чыгат. Губканын эки жагына алюминий фольгасын чаптаңыз. Алюминий фольгага секирүүчү зымдарды туташтырыңыз. Өткөргүч зымдарды nodeMCUга туташтырыңыз. Бир тарап A0-пинге, экинчиси V3-пинге. Губканы эшиктин астына койсоңуз, эшикти сенсорго алмаштырдыңыз. Керемет!

Кимдир бирөө эшиктин үстүндө турганын текшерүү үчүн сенсордон маанини окуу үчүн код:

int sensorValue = analogRead (A0);

if (sensorValue == 1024) {extractData (); }

Алюминий фольга контакт түзүп жатканда (кимдир бирөө төшөктө турганда), sensorValue 1024. Бул функциянын extractData () атылышына алып келет. Жана так биз системанын жасашын каалайбыз.

5 -кадам: Дизайн боюнча пикир

Мен колдонуучуга пикир берүү үчүн LEDstrip колдондум. Тыгын болгондо, жарык кызыл түскө боёлот. Жол жакшы болгондо, ал жашыл болуп калат. Мен LEDstripти көзөмөлдөө үчүн adafruit neopixel китепканасын колдондум.

LEDstrip аныкталганына ынануу үчүн бул кодду файлыңыздын үстүнө жазыңыз:

#кошуу

#аныктоо PIXEL_PIN D5 #аныктоо PIXEL_COUNT 10 #аныктоо PIXEL_TYPE NEO_GRB + NEO_KHZ800 Adafruit_NeoPixel пиксель = Adafruit_NeoPixel (PIXEL_COUNT, PIXEL_PIN, PIXEL_TYP)

Орнотуу функциясына кийинки кодду жазыңыз:

// неопиксел

piksel.begin (); piksel.show ();

Жана цикл функциясында төмөнкү код:

if (trafficJam == true) {

үчүн (int i; i <PIXEL_COUNT; i ++) {piksel.setPixelColor (i, 255, 0, 0); // кызыл пиксель.show (); кечигүү (200); }} башка {үчүн (int i; i <PIXEL_COUNT; i ++) {piksel.setPixelColor (i, 0, 255, 0); // жашыл пикселдер.show (); кечигүү (200); }

Жогорудагы коддо if/else функциясы бар. ExtractData функциясы тыгындын болушун кайтарганда, LED тилкеси кызыл түскө айланат. Болбосо, LED тилкеси жашыл болуп калат.

6 -кадам: Кодду иштетүү

Эгерде биз азыр толук кодду иштетсек, сенсор менен жарык иштеши керек. Эшиктин үстүндө турганда, сенсор туташат жана extractData функциясы иштейт. Жол аталыштарынын катарында биз издеп жаткан жол бар болсо, LED тилкеси кызылга айланып, тыгынды билдирет. Эгерде ал массивде болбосо, LED диапазону жашыл түскө айланат жана сиз барууга даяр экениңизди билесиз!

Саякатыңыз коопсуз болсун жана окууңуз үчүн рахмат. Мен сизге кандайдыр бир илхам же маалымат таптыңыз деп үмүттөнөм. Эгерде сизде кандайдыр бир пикир болсо, жооп берүүдөн тартынбаңыз!

Сунушталууда: