Indholdsfortegnelse:

Trafikrapportkontrol (NL) Med dørmåtte: 6 trin
Trafikrapportkontrol (NL) Med dørmåtte: 6 trin

Video: Trafikrapportkontrol (NL) Med dørmåtte: 6 trin

Video: Trafikrapportkontrol (NL) Med dørmåtte: 6 trin
Video: Squid game #shorts 2024, Juli
Anonim
Trafikrapportkontrol (NL) med dørmåtte
Trafikrapportkontrol (NL) med dørmåtte

I denne instruktive vil jeg beskrive, hvordan man bygger en dørmåtte, der kontrollerer trafikrapporter om hollandske motorveje. Når du træder udenfor på din dørmåtte, og der er trafikprop på din rute, bliver måtten til en rød farve. Når der ikke er trafikprop, bliver måtten grøn.

Jeg arbejder på et NodeMCU 1.0 (ESP0-12E-modul). Koden til dette projekt kan også fungere på andre enheder (f.eks. Arduino -tavler). Dette projekt er baseret på en hollandsk kilde til trafikrapporter, ANWB.

Hvad vi har brug for til dette projekt:

- NodeMCU - Jumperwires - LEDlight or strip - Analog sensor (Aluminiuim folie, Svamp) - Wi -Fi forbindelse - Dørmåtte

Skridt, vi skal tage:

1. Tilslut NodeMCu til Wi-Fi 2. Anmod om data via HTTPS fra ANWB.nl 3. Gør data til brugbare oplysninger 4. Installer udløseren 5. Design feedback

Trin 1: Tilslut NodeMCU til Wi-Fi

Dette trin viser, hvordan du udfører en vellykket HTTPSRequest for at se, om enheden er forbundet til internettet.

Installer først ESP8266 -biblioteket i Arduino IDE. Åbn fra eksempler ESP8266>

Udfyld dine Wi-Fi-legitimationsoplysninger øverst i din kode, som vist herunder:

const char* ssid = "YOUR_SSID";

const char* password = "YOUR_PASS";

Upload koden til din enhed, og kontroller, om NodeMCU opretter forbindelse til internettet. HTTPSRequest -eksemplet bruger Github som standard til at hente oplysninger fra. Når HTTPSRequest lykkedes, modtager du Github -data i den serielle skærm.

Trin 2: Anmod om data fra HTTPS fra ANWB.nl

I dette andet trin ændrer du datakilden fra standard til den nødvendige kilde til dette projekt: ANWB.nl.

Øverst i din kode skal du ændre char* host til www.anwb.nl (eller en anden kilde, du gerne vil have dine data fra):

const char* host = "www.anwb.nl";!! Hvis du bruger en anden kilde, vil trin 3 være forskellig fra min kode. Trin 3 har brug for specifik kodning for at hente brugbar information!

Dernæst skal du ændre string -url'en i funktionsopsætningen til "/feeds/gethf", stien, hvor oplysningerne er hentet fra:

String url = "/feeds/gethf";!! Hvis du bruger en anden kilde, skal du bruge stien til din kilde!

Når du uploader koden, skal du få et svar med alle data fra www.anwb.nl/feeds/gethf. Denne kode gemmes i en streng kaldet linje.

Trin 3: Gør data til brugbare oplysninger

Indtil nu kørte koden kun, da NodeMCU blev startet eller nulstillet, fordi al koden er i opsætningsfunktionen. For at indstille udløseren til løbende at køre koden, skal du ændre placeringen af koden, der kører HTTPS -anmodningen. Under loop -funktionen tilføjer du en anden funktion. Jeg har kaldt det void extractData:

extractData () {

}

Kopiér en del af koden fra opsætningsfunktionen til extractData (). Start med følgende linje indtil afslutningen af opsætningsfunktionen:

hvis (! client.connect (host, Koden er nu i din nye funktion, så fjern den kopierede kode fra opsætningsfunktionen.

Ring derefter til extractData -funktionen i loop -funktionen, og tilføj lidt forsinkelse for at give nodeMCU tid til at hvile:

void loop () {

extractData (); forsinkelse (30000); // dette fjernes senere, når vi har en analog sensor}

Da de data, du modtager, er gemt i en streng, og der kun er brug for dele af denne streng, skal du skrive et par af loops.

Kontroller først alle positionerne af ordet 'vej'. Efter ordet 'vej' følger vejens navn (A1, A2 osv.).

Inden du begynder at skrive for -loops, skal du deklarere nogle variabler, du skal bruge:

int noOfPos = 0;

boolsk hasRunOnce = false; int fra = 0; int roadArray [20];

Nu er det tid til at skrive nogle sløjfer. Jeg har skrevet for -loops i bunden af extractData -funktionen. Jeg forsøgte at opdele det i separate funktioner, men jeg kunne ikke få det til at fungere.

For løkke nr. 1: Find positionerne for ordet vej i strenglinjen:

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

Kontroller derefter, hvilke veje der har et trafikprop, ved at bruge positionerne i for -løkken ovenfra. Placeringen af vejenes navn er altid den samme og starter 7 tegn og slutter 10 tegn efter ordet vej.

Nu definerer vi matrixnavnetOfRoadArray, som vil blive udfyldt i det næste for loop:

String nameOfRoadArray [20];

For løkke nr. 2: Find alle navnene på vejene med input fra for sløjfe 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); }

MatrixnavnetOfRoudArray skal udfyldes med alle de trafikpropper, der signaleres.

Dernæst skal du kontrollere, om din vej er i rækken af veje med trafikprop. Udskriv navnetOfRoadArray for at få vejene i dataene. Gør dette ved at tilføje Serial.println (nameOfRoadArray [k]); ind i 2. for sløjfe som:

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

Hvis det er rigtigt, vil du se alle vejene med trafikprop i den serielle skærm.

Inden du skriver den sidste For -loop, skal du erklære en boolean som en global variabel. Den boolske, kaldet trafficJam er som standard falsk og ændres, hvis funktionen extractData returnerer true for en trafikprop. Følgende kode kommer oven på.ino -filen:

boolsk trafikJam = falsk;

For sløjfe nr. 3: Kontroller, om vejen, i dette tilfælde A1, er på listen over trafikpropper.

for (int l = 0; l <20; l ++) {if (nameOfRoadArray [l] == "A1 \" ") {// ændr A1 til din foretrukne trafik trafficJam = true;}

Hvis du udskriver trafficJam i den serielle skærm, ved du, om der er trafikprop på A1 eller ej.

Sæt denne kode i bunden af extractData -funktionen:

Serial.println (trafficJam); // se om der er trafikprop

Med disse oplysninger vil vi arbejde videre med systemets feedback i trin 5.

Trin 4: Installer udløseren

Installer udløseren
Installer udløseren
Installer udløseren
Installer udløseren
Installer udløseren
Installer udløseren

Da vi nu kan hente dataene med succes fra kilden, er det tid til at bygge en sensor, der vil udløse nodeMCU til at køre funktionen extractData. Jeg valgte at lave en analog sensor ud af min dørmåtte. Du kan ændre udløseren ved at bruge en anden sensor.

Bygger den analoge sensor

Jeg brugte 2 stykker aluminiumsfolie, to springtråde og en svamp.

Bor et hul i svampen, dette er stedet, hvor aluminiumsfolierne kommer i kontakt. Lim aluminiumsfolie på begge sider af svampen. Tilslut jumperkabler til aluminiumsfolien. Tilslut jumperkablerne til nodeMCU. Den ene side til A0-stiften og den anden til en V3-ben. Læg svampen under din dørmåtte, og du har lige ændret din dørmåtte til en sensor. Fantastisk!

Koden til at læse værdi fra sensoren for at se, om der står nogen på dørmåtten:

int sensorValue = analogRead (A0);

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

Når aluminiumsfolien får kontakt (når nogen står på måtten), er sensorValue 1024. Dette resulterer i, at funktionen extractData () udløses. Og det er præcis det, vi ønsker, at systemet skal gøre.

Trin 5: Designfeedback

Jeg brugte en LEDstrip til at give brugeren feedback. Når der er trafikprop, lyser lyset rødt. Når vejen er god at gå, bliver den grøn. Jeg brugte adafruit neopixel biblioteket til at styre min LEDstrip.

Skriv denne kode øverst i din fil for at sikre, at LEDstrip er defineret:

#omfatte

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

Skriv den næste kode i opsætningsfunktionen:

// neopixel

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

Og følgende kode i loop -funktionen:

hvis (trafficJam == true) {

for (int i; i <PIXEL_COUNT; i ++) {pixels.setPixelColor (i, 255, 0, 0); // røde pixels.show (); forsinkelse (200); }} andet {for (int i; i <PIXEL_COUNT; i ++) {pixels.setPixelColor (i, 0, 255, 0); // grønne pixels.show (); forsinkelse (200); }

I koden ovenfor er der en if/else -funktion. Når funktionen extractData returnerer tilstedeværelsen af en trafikprop, bliver LEDstripen rød. Hvis ikke, bliver LED -stripen grøn.

Trin 6: Kør koden

Hvis vi kører den komplette kode nu, skal sensoren og lyset fungere. Når du står på dørmåtten, tilsluttes sensoren, og extractData -funktionen kører. Når den vej, vi leder efter, er i rækken af vejnavne, er LEDstripen rød, hvilket signalerer en trafikprop. Hvis det ikke er i arrayet, bliver LEDstrip grønt, og du ved, at du er god til at gå!

Hav en sikker rejse og tak fordi du læste med. Jeg håber, at du har fundet inspiration eller information. Hvis du har fået feedback, er du velkommen til at svare!

Anbefalede: