Inhoudsopgave:

Verkeersmelding Check(NL) Met Deurmat: 6 Stappen
Verkeersmelding Check(NL) Met Deurmat: 6 Stappen

Video: Verkeersmelding Check(NL) Met Deurmat: 6 Stappen

Video: Verkeersmelding Check(NL) Met Deurmat: 6 Stappen
Video: CIVINET Webinar Smart Mobility 2024, Juli-
Anonim
Verkeersmelding Check(NL) Met Deurmat
Verkeersmelding Check(NL) Met Deurmat

In deze instructable zal ik beschrijven hoe je een deurmat bouwt die verkeersrapporten van Nederlandse snelwegen controleert. Zodra je op je deurmat naar buiten stapt en er staat een file op je route, dan verkleurt de mat naar een rode kleur. Als er geen file is, wordt de mat groen.

Ik zal werken aan een NodeMCU 1.0 (ESP0-12E-module). De code voor dit project zou ook op andere apparaten kunnen werken (bijvoorbeeld Arduino-borden). Dit project is gebaseerd op een Nederlandse bron voor verkeersmeldingen, de ANWB.

Wat hebben we nodig voor dit project:

- NodeMCU - Doorverbindingsdraden - LED-licht of strip - Analoge sensor (aluminiumfolie, spons) - Wi-Fi-verbinding - Deurmat

Stappen die we moeten nemen:

1. Verbind NodeMCu met wifi 2. Vraag data op via HTTPS bij ANWB.nl 3. Zet data om in bruikbare informatie 4. Installeer de trigger 5. Ontwerp feedback

Stap 1: verbind NodeMCU met wifi

Deze stap laat zien hoe u een succesvolle HTTPS-aanvraag doet om te zien of het apparaat is verbonden met internet.

Installeer eerst de ESP8266-bibliotheek in Arduino IDE. Open uit voorbeelden ESP8266 >

Vul uw wifi-gegevens in bovenaan uw code, zoals hieronder weergegeven:

const char* ssid = "YOUR_SSID";

const char* wachtwoord = "YOUR_PASS";

Upload de code naar uw apparaat en controleer of de NodeMCU verbinding maakt met internet. Het HTTPSRequest-voorbeeld gebruikt Github als standaard om informatie op te halen. Wanneer het HTTPS-verzoek is gelukt, ontvangt u de Github-gegevens in de seriële monitor.

Stap 2: Gegevens opvragen van HTTPS bij ANWB.nl

In deze tweede stap wijzigt u de gegevensbron van de standaard naar de bron die nodig is voor dit project: ANWB.nl.

Wijzig bovenaan je code char* host in www.anwb.nl (of een andere bron waar je je gegevens vandaan wilt halen):

const char* host = "www.anwb.nl";!! Als je een andere bron gebruikt, zal stap 3 anders zijn dan mijn code. Stap 3 heeft specifieke codering nodig om bruikbare informatie op te halen!

Wijzig vervolgens de string-URL in de functie-instellingen in "/feeds/gethf", het pad waar de informatie vandaan komt:

String url = "/feeds/gethf";!! Als u een andere bron gebruikt, gebruik dan het pad naar uw bron!

Als je de code uploadt zou je een reactie moeten krijgen met alle gegevens van www.anwb.nl/feeds/gethf. Deze code wordt opgeslagen in een string met de naam line.

Stap 3: Zet gegevens om in bruikbare informatie

Tot nu toe liep de code alleen wanneer de NodeMCU werd gestart of gereset, omdat alle code in de setup-functie staat. Om de trigger in te stellen om de code continu uit te voeren, moet u de positie van de code die het HTTPS-verzoek uitvoert, wijzigen. Onder de lusfunctie voeg je nog een functie toe. Ik heb het void extractData genoemd:

extractData(){

}

Kopieer een deel van de code van de setup-functie naar de extractData(). Begin met de volgende regel tot het einde van de setup-functie:

if (!client.connect(host, De code staat nu in je nieuwe functie, dus verwijder de gekopieerde code uit de setup-functie.

Roep vervolgens de extractData-functie in de loop-functie aan en voeg wat vertraging toe om de nodeMCU tijd te geven om te rusten:

lege lus(){

extractData(); vertraging (30000); // dit wordt later verwijderd als we een analoge sensor hebben }

Aangezien de data die je ontvangt in een string wordt opgeslagen en slechts delen van deze string nodig zijn, moet je een aantal for-lussen schrijven.

Controleer eerst alle posities van het woord 'weg'. Na het woord 'weg' volgt de naam van de weg (A1, A2, etc.).

Voordat u begint met het schrijven van de for-lussen, moet u enkele variabelen declareren die u gaat gebruiken:

int noOfPos = 0;

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

Nu is het tijd om wat loops te schrijven. Ik heb de for-lussen onderaan de extractData-functie geschreven. Ik heb geprobeerd het in afzonderlijke functies op te delen, maar ik kreeg het niet werkend.

Voor lus nr. 1: zoek de posities van het woord weg in de tekenreeksregel:

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 = waar; }

Controleer vervolgens op welke wegen een file staat, door de posities van de for-lus van bovenaf te gebruiken. De positie van de naam van de wegen is altijd hetzelfde en begint 7 karakters en eindigt 10 karakters na het woord weg.

Nu definiëren we de array nameOfRoadArray, die in de volgende for-lus zal worden ingevuld:

TekenreeksnaamOfRoadArray[20];

For loop nr. 2: Vind alle namen van de wegen met de invoer van for loop nr. 1

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

De array nameOfRoudArray moet worden gevuld met alle gesignaleerde files.

Vervolgens ga je kijken of jouw weg tussen de wegen met een file staat. Druk de nameOfRoadArray af om de wegen in de gegevens te krijgen. Doe dit door de Serial.println(nameOfRoadArray[k]); in de 2e for-lus zoals:

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

Als het goed is zie je alle wegen met een file in de Seriële monitor.

Voordat u de laatste For-lus schrijft, moet u een boolean declareren als een globale variabele. De boolean, genaamd trafficJam, is standaard false en zal veranderen als de functie extractData true retourneert voor een file. De volgende code komt bovenop het.ino-bestand:

boolean trafficJam = false;

Voor lus nr. 3: Controleer of de weg, in dit geval A1, in de lijst met files staat.

for(int l=0; l <20; l++){ if(nameOfRoadArray[l] == "A1\""){ // verander A1 in de weg van je voorkeur trafficJam = true; }

Als u verkeersopstoppingen afdrukt in de seriële monitor, weet u of er een verkeersopstopping is op de A1 of niet.

Zet deze code onderaan de extractData-functie:

Serial.println(trafficJam); // kijk of er een verkeersopstopping is

Met deze informatie gaan we in stap 5 verder werken aan de terugkoppeling van het systeem.

Stap 4: installeer de trigger

Installeer de trigger
Installeer de trigger
Installeer de trigger
Installeer de trigger
Installeer de trigger
Installeer de trigger

Omdat we de gegevens nu met succes van de bron kunnen ophalen, is het tijd om een sensor te bouwen die de nodeMCU activeert om de functie extractData uit te voeren. Ik koos ervoor om van mijn deurmat een analoge sensor te maken. Je zou de trigger kunnen veranderen door een andere sensor te gebruiken.

De analoge sensor bouwen

Ik gebruikte 2 stukken aluminiumfolie, twee jumperdraden en een spons.

Boor een gat in de spons, dit is de plek waar de aluminiumfolies contact zullen maken. Lijm aluminiumfolie aan beide zijden van de spons. Sluit de jumperdraden aan op de aluminiumfolie. Sluit de jumperdraden aan op de nodeMCU. De ene kant naar de A0-pin en de andere naar een V3-pin. Leg de spons onder je deurmat en je hebt zojuist je deurmat veranderd in een sensor. Geweldig!

De code om de waarde van de sensor af te lezen om te zien of er iemand op de deurmat staat:

int sensorValue = analoog lezen (A0);

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

Wanneer de aluminiumfolie contact maakt (wanneer iemand op de mat staat), is de sensorValue 1024. Dit resulteert in de functie extractData() die wordt geactiveerd. En dat is precies wat we willen dat het systeem doet.

Stap 5: Ontwerpfeedback

Ik gebruikte een LEDstrip om feedback te geven aan de gebruiker. Als er een file is, kleurt het licht rood. Als de weg goed begaanbaar is, wordt hij groen. Ik heb de adafruit neopixel bibliotheek gebruikt om mijn LEDstrip aan te sturen.

Schrijf deze code bovenaan je bestand om er zeker van te zijn dat de LEDstrip gedefinieerd is:

#erbij betrekken

#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);

Schrijf de volgende code in de setup-functie:

//neopixel

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

En de volgende code in de lusfunctie:

if (verkeersstoring == waar){

for(int i; i <PIXEL_COUNT; i++){ pixels.setPixelColor(i, 255, 0, 0); // rode pixels.show(); vertraging (200); } } else{ for(int i; i < PIXEL_COUNT; i++){ pixels.setPixelColor(i, 0, 255, 0); // groene pixels.show(); vertraging (200); }

In de bovenstaande code is er een if/else-functie. Wanneer de functie extractData de aanwezigheid van een file retourneert, wordt de LEDstrip rood. Zo niet, dan wordt de LEDstrip groen.

Stap 6: Voer de code uit

Als we nu de volledige code uitvoeren, zouden de sensor en het licht moeten werken. Wanneer je op de deurmat staat, zal de sensor verbinding maken en de extractData-functie starten. Wanneer in de rij met wegnamen de weg staat die we zoeken, wordt de LEDstrip rood, wat een file signaleert. Als het niet in de array zit, wordt de LEDstrip groen en weet je dat je klaar bent om te gaan!

Een veilige reis en bedankt voor het lezen. Ik hoop dat je wat inspiratie of informatie hebt gevonden. Als je feedback hebt, voel je vrij om te reageren!

Aanbevolen: