INHOUDSOPGAWE:

Verkeersverslagkontrole (NL) Met deurmat: 6 stappe
Verkeersverslagkontrole (NL) Met deurmat: 6 stappe

Video: Verkeersverslagkontrole (NL) Met deurmat: 6 stappe

Video: Verkeersverslagkontrole (NL) Met deurmat: 6 stappe
Video: Найти и обезвредить (1982) фильм 2024, Julie
Anonim
Verkeersverslagtoets (NL) Met deurmat
Verkeersverslagtoets (NL) Met deurmat

In hierdie instruksies sal ek beskryf hoe ek 'n deurmat bou wat verkeersverslae van Nederlandse snelweë sal nagaan. As u eers op u deurmat stap en daar 'n verkeersknoop op u roete is, word die mat in 'n rooi kleur. As daar geen verkeersknoop is nie, word die mat groen.

Ek werk aan 'n NodeMCU 1.0 (ESP0-12E-module). Die kode vir hierdie projek kan ook op ander toestelle werk (byvoorbeeld Arduino -borde). Hierdie projek is gebaseer op 'n Nederlandse bron vir verkeersverslae, die ANWB.

Wat ons nodig het vir hierdie projek:

- NodeMCU - Jumperdrade - LED -lig of strook - Analoge sensor (aluminiumfolie, spons) - Wi -Fi -verbinding - Deurmat

Stappe wat ons moet neem:

1. Koppel NodeMCu aan Wi-Fi 2. Versoek data via HTTPS van ANWB.nl 3. Verander data in bruikbare inligting 4. Installeer die sneller 5. Ontwerp terugvoer

Stap 1: Koppel NodeMCU aan Wi-Fi

Hierdie stap wys hoe u 'n suksesvolle HTTPSRequest kan doen om te sien of die toestel aan die internet gekoppel is.

Installeer eers die ESP8266 -biblioteek in Arduino IDE. Open uit voorbeelde ESP8266>

Vul u Wi-Fi-geloofsbriewe bo-aan u kode in, soos hieronder getoon:

const char* ssid = "YOUR_SSID";

const char* wagwoord = "YOUR_PASS";

Laai die kode op u toestel op en kyk of die NodeMCU aan die internet koppel. Die HTTPSRequest -voorbeeld gebruik Github as standaard om inligting van te kry. As die HTTPSRequest daarin geslaag het, ontvang u die Github -data in die seriële monitor.

Stap 2: Versoek data van HTTPS van ANWB.nl

In hierdie tweede stap verander u die databron van die standaard na die bron wat benodig word vir hierdie projek: ANWB.nl.

Verander bo -aan u kode die char* host na www.anwb.nl (of 'n ander bron waaruit u u data wil kry):

const char* host = "www.anwb.nl";!! As u 'n ander bron gebruik, sal stap 3 verskil van my kode. Stap 3 benodig spesifieke kodering om bruikbare inligting op te haal!

Verander vervolgens die string -url in die funksie -opstelling na "/feeds/gethf", die pad waarvandaan die inligting vandaan kom:

String url = "/feeds/gethf";!! As u 'n ander bron gebruik, gebruik die pad na u bron!

As u die kode oplaai, moet u 'n antwoord kry met al die data van www.anwb.nl/feeds/gethf. Hierdie kode word gestoor in 'n string genaamd line.

Stap 3: Verander data in bruikbare inligting

Tot nou toe het die kode slegs uitgevoer toe die NodeMCU begin of herstel is, omdat al die kode in die opstellingsfunksie is. Om die sneller in te stel om die kode voortdurend te laat loop, moet u die posisie verander van die kode wat die HTTPS -versoek uitvoer. Onder die lusfunksie voeg u nog 'n funksie by. Ek het dit void extractData genoem:

extractData () {

}

Kopieer 'n deel van die kode van die opstelfunksie na die extractData (). Begin met die volgende reël tot aan die einde van die opstelfunksie:

as (! client.connect (gasheer, Die kode is nou in u nuwe funksie, dus verwyder die gekopieerde kode uit die opstelfunksie.

Bel vervolgens die extractData -funksie in die lusfunksie en voeg 'n bietjie vertraging by om die nodeMCU tyd te gee om te rus:

leemte -lus () {

extractData (); vertraging (30000); // dit sal later verwyder word as ons 'n analoog sensor het}

Aangesien die data wat u ontvang in 'n string gestoor is en slegs dele van hierdie string benodig word, moet u 'n paar vir lusse skryf.

Kontroleer eers al die posisies van die woord 'pad'. Na die woord 'pad' volg die naam van die pad (A1, A2, ens.).

Voordat u die for lusse begin skryf, moet u 'n paar veranderlikes wat u gaan gebruik, verklaar:

int noOfPos = 0;

boolean hasRunOnce = false; int van = 0; int roadArray [20];

Nou is dit tyd om 'n paar lusse te skryf. Ek het die for lusse onderaan die extractData -funksie geskryf. Ek het probeer om dit in aparte funksies te verdeel, maar ek kon dit nie laat werk nie.

Vir lus nr. 1: vind die posisies van die woord pad in die snaarlyn:

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

Kontroleer vervolgens watter paaie 'n verkeersknoop het deur die posisies van die for -lus van bo te gebruik. Die naam van die paaie is altyd dieselfde en begin met 7 karakters en eindig 10 karakters na die woord pad.

Nou definieer ons die skikking naamOfRoadArray, wat die volgende vir lus ingevul gaan word:

StringnaamOfRoadArray [20];

Vir lus nr. 2: Soek al die name van die paaie met die insette van lus nr. 1

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

Die skikkingnaamOfRoudArray moet gevul wees met al die verkeersknope wat aangedui word.

Vervolgens gaan u kyk of u pad op 'n verskeidenheid paaie is met 'n verkeersknoop. Druk die nameOfRoadArray af om die paaie in die data te kry. Doen dit deur die Serial.println (nameOfRoadArray [k]) by te voeg; in die 2de vir lus soos:

vir (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]); }

As dit reg is, sien u al die paaie met 'n verkeersknoop in die seriële monitor.

Voordat u die laaste For -lus skryf, moet u 'n Boole as 'n globale veranderlike verklaar. Die boolean, genaamd trafficJam, is standaard vals en sal verander as die funksie extractData vir 'n verkeersknoop waar is. Die volgende kode kom bo -op die.ino -lêer:

boolean trafficJam = vals;

Vir lus nr. 3: Kyk of die pad, in hierdie geval A1, in die lys van verkeersknope is.

for (int l = 0; l <20; l ++) {if (nameOfRoadArray [l] == "A1 \" ") {// verander A1 na die pad van u guns trafficJam = true;}

As u trafficJam in die seriële monitor druk, weet u of daar 'n verkeersknoop op die A1 is of nie.

Plaas hierdie kode onderaan die extractData -funksie:

Serial.println (trafficJam); // kyk of daar 'n verkeersknoop is

Met hierdie inligting gaan ons verder werk aan die terugvoer van die stelsel in stap 5.

Stap 4: Installeer die sneller

Installeer die sneller
Installeer die sneller
Installeer die sneller
Installeer die sneller
Installeer die sneller
Installeer die sneller

Aangesien ons die data nou suksesvol uit die bron kan haal, is dit tyd om 'n sensor te bou wat die nodeMCU sal aktiveer om die funksie extractData uit te voer. Ek het gekies om 'n analoog sensor uit my deurmat te maak. U kan die sneller verander deur 'n ander sensor te gebruik.

Bou die analoog sensor

Ek het 2 stukke aluminiumfoelie, twee springdrade en 'n spons gebruik.

Boor 'n gat in die spons, dit is die plek waar die aluminiumfoelies in aanraking kom. Plak aluminiumfoelie aan weerskante van die spons vas. Koppel jumperdrade aan die aluminiumfoelie. Koppel die jumperdrade aan die nodeMCU. Die een kant na die A0-pen en die ander na 'n V3-pen. Plaas die spons onder u deurmat en u het pas u deurmat in 'n sensor verander. Ontsagwekkende!

Die kode om die waarde van die sensor af te lees om te sien of iemand op die deurmat staan:

int sensorValue = analogRead (A0);

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

As die aluminiumfoelie kontak maak (as iemand op die mat staan), is die sensorWaarde 1024. Dit lei tot die funksie extractData (). En dit is presies wat ons wil hê die stelsel moet doen.

Stap 5: Ontwerp terugvoer

Ek het 'n LEDstrip gebruik om terugvoer aan die gebruiker te gee. As daar 'n verkeersknoop is, sal die lig rooi kleur. As die pad goed is, word dit groen. Ek het die adafruit neopixel biblioteek gebruik om my LEDstrip te beheer.

Skryf hierdie kode bo -aan u lêer om seker te maak dat die LEDstrip gedefinieer is:

#insluit

#define PIXEL_PIN D5 #define PIXEL_COUNT 10 #define PIXEL_TYPE NEO_GRB + NEO_KHZ800 Adafruit_NeoPixel pixels = Adafruit_NeoPixel (PIXEL_COUNT, PIXEL_PIN, PIXEL_TYPE);

Skryf die volgende kode in die opstelfunksie:

// neopixel

pixels.begin (); pixels.show ();

En die volgende kode in die lusfunksie:

as (trafficJam == waar) {

vir (int i; i <PIXEL_COUNT; i ++) {pixels.setPixelColor (i, 255, 0, 0); // rooi pixels.show (); vertraging (200); }} anders {vir (int i; i <PIXEL_COUNT; i ++) {pixels.setPixelColor (i, 0, 255, 0); // groen pixels.show (); vertraging (200); }

In die kode hierbo is daar 'n if/else -funksie. As die funksie extractData die teenwoordigheid van 'n verkeersknoop weergee, word die LEDstrook rooi. Indien nie, word die LED -strook groen.

Stap 6: voer die kode uit

As ons nou die volledige kode gebruik, moet die sensor en lig werk. As u op die deurmat staan, sal die sensor aansluit en die extractData -funksie loop. As die pad wat ons soek in die verskeidenheid padname is, word die LED -strook rooi, wat 'n verkeersknoop aandui. As dit nie in die skikking is nie, word die LEDstrip groen en weet u dat u klaar is!

Lekker reis en dankie dat u gelees het. Ek hoop dat u inspirasie of inligting gevind het. As u terugvoer gekry het, reageer gerus!

Aanbeveel: