Innehållsförteckning:

Trafikrapportkontroll (NL) med dörrmatta: 6 steg
Trafikrapportkontroll (NL) med dörrmatta: 6 steg

Video: Trafikrapportkontroll (NL) med dörrmatta: 6 steg

Video: Trafikrapportkontroll (NL) med dörrmatta: 6 steg
Video: Как спрятать данные в ячейках Excel? 2024, November
Anonim
Trafikrapportkontroll (NL) med dörrmatta
Trafikrapportkontroll (NL) med dörrmatta

I den här instruktören kommer jag att beskriva hur man bygger en dörrmatta som kontrollerar trafikrapporter om holländska motorvägar. När du kliver utanför på din dörrmatta och det är trafikstockning på din rutt, blir mattan till en röd färg. När det inte finns någon trafikstockning blir mattan grön.

Jag kommer att arbeta med en NodeMCU 1.0 (ESP0-12E-modul). Koden för detta projekt kan också fungera på andra enheter (t.ex. Arduino -kort). Detta projekt är baserat på en nederländsk källa för trafikrapporter, ANWB.

Vad vi behöver för detta projekt:

- NodeMCU - Bygelkablar - LED -lampa eller remsa - Analog sensor (Aluminiuim folie, svamp) - Wi -Fi -anslutning - Dörrmatta

Steg vi måste ta:

1. Anslut NodeMCu till Wi-Fi 2. Begär data via HTTPS från ANWB.nl 3. Förvandla data till användbar information 4. Installera utlösaren 5. Design feedback

Steg 1: Anslut NodeMCU till Wi-Fi

Det här steget visar hur du gör en framgångsrik HTTPSRequest för att se om enheten är ansluten till internet.

Installera först ESP8266 -biblioteket i Arduino IDE. Öppna från exempel ESP8266>

Fyll i dina Wi-Fi-uppgifter högst upp i koden, enligt nedan:

const char* ssid = "YOUR_SSID";

const char* password = "YOUR_PASS";

Ladda upp koden till din enhet och kontrollera om NodeMCU ansluter till internet. HTTPSRequest -exemplet använder Github som standard för att hämta information från. När HTTPSRequest lyckades får du Github -data i den seriella bildskärmen.

Steg 2: Begär data från HTTPS från ANWB.nl

I det andra steget ändrar du datakällan från standard till källan som behövs för detta projekt: ANWB.nl.

Högst upp i koden ändrar du char* host till www.anwb.nl (eller en annan källa du vill hämta dina data från):

const char* host = "www.anwb.nl";!! Om du använder en annan källa kommer steg 3 att skilja sig från min kod. Steg 3 behöver specifik kodning för att hämta användbar information!

Ändra sedan strängadressen i funktionsinställningen till "/feeds/gethf", sökvägen dit informationen är hämtad:

String url = "/feeds/gethf";!! Om du använder en annan källa, använd sökvägen till din källa!

När du laddar upp koden bör du få ett svar med all data från www.anwb.nl/feeds/gethf. Denna kod sparas i en sträng som heter line.

Steg 3: Förvandla data till användbar information

Fram till nu kördes koden bara när NodeMCU startades eller återställdes, eftersom all kod finns i installationsfunktionen. För att ställa in utlösaren för att köra koden kontinuerligt måste du ändra positionen för koden som kör HTTPS -begäran. Under loop -funktionen lägger du till en annan funktion. Jag har kallat det void extractData:

extractData () {

}

Kopiera en del av koden från installationsfunktionen till extractData (). Börja med följande rad till slutet av installationsfunktionen:

if (! client.connect (host, Koden finns nu i din nya funktion, så ta bort den kopierade koden från installationsfunktionen.

Anropa sedan extraktdatafunktionen i loop -funktionen och lägg till lite fördröjning för att ge nodenMCU tid att vila:

void loop () {

extractData (); fördröjning (30000); // detta kommer att tas bort senare när vi har en analog sensor}

Eftersom data du tar emot lagras i en sträng och endast delar av denna sträng behövs, måste du skriva ett par för loopar.

Kontrollera först alla positioner för ordet "väg". Efter ordet "väg" följer vägens namn (A1, A2, etc.).

Innan du börjar skriva för loops måste du deklarera några variabler du ska använda:

int noOfPos = 0;

boolean hasRunOnce = false; int från = 0; int roadArray [20];

Nu är det dags att skriva några slingor. Jag har skrivit för -slingorna i botten av extraktdatafunktionen. Jag försökte dela upp det i separata funktioner, men jag kunde inte få det att fungera.

För slinga nr 1: hitta positionerna för ordet väg i strängraden:

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

Kontrollera sedan vilka vägar som har en trafikstockning genom att använda positionerna för for loop ovanifrån. Placeringen av vägarnas namn är alltid densamma och börjar med 7 tecken och slutar 10 tecken efter ordet väg.

Nu definierar vi matrisnamnetOfRoadArray, som kommer att fyllas i nästa för loop:

SträngnamnOfRoadArray [20];

För slinga nr 2: Hitta alla namn på vägarna med ingången från för slinga nr. 1

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

MatrisnamnetOfRoudArray ska fyllas med alla trafikstockningar som signaleras.

Därefter kommer du att kontrollera om din väg ligger på en rad vägar med trafikstockning. Skriv ut nameOfRoadArray för att få vägarna i data. Gör detta genom att lägga till Serial.println (nameOfRoadArray [k]); in i 2: a för slinga som:

för (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]); }

Om det är rätt kommer du att se alla vägar med en trafikstockning i seriemonitorn.

Innan du skriver den sista For -slingan måste du deklarera en boolean som en global variabel. Den booleska, kallad trafficJam är som standard falsk och kommer att ändras om funktionen extractData returnerar true för en trafikstockning. Följande kod går ovanpå.ino -filen:

booleskt trafikJam = falskt;

För slinga nr 3: Kontrollera om vägen, i detta fall A1, finns i listan över trafikstockningar.

för (int l = 0; l <20; l ++) {if (nameOfRoadArray [l] == "A1 \" ") {// ändra A1 till din favorits väg trafficJam = true;}

Om du skriver ut trafficJam i den seriella bildskärmen vet du om det finns en trafikstockning på A1 eller inte.

Sätt den här koden längst ner i extractData -funktionen:

Serial.println (trafficJam); // se om det finns en trafikstockning

Med denna information kommer vi att arbeta vidare med systemets feedback i steg 5.

Steg 4: Installera utlösaren

Installera Trigger
Installera Trigger
Installera Trigger
Installera Trigger
Installera Trigger
Installera Trigger

Eftersom vi nu kan hämta data framgångsrikt från källan är det dags att bygga en sensor som kommer att utlösa nodenMCU för att köra funktionen extractData. Jag valde att göra en analog sensor av min dörrmatta. Du kan ändra avtryckaren med en annan sensor.

Bygga den analoga sensorn

Jag använde 2 stycken aluminiumfolie, två bygeltrådar och en svamp.

Borra ett hål i svampen, det här är platsen där aluminiumfolierna kommer i kontakt med. Lim aluminiumfolie på båda sidor av svampen. Anslut bygelkablarna till aluminiumfolien. Anslut bygelkablarna till nodenMCU. Ena sidan till A0-stiftet och den andra till en V3-stift. Lägg svampen under din dörrmatta och du har precis bytt din dörrmatta till en sensor. Grymt bra!

Koden för att läsa värdet från sensorn för att se om någon står på dörrmattan:

int sensorValue = analogRead (A0);

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

När aluminiumfolien tar kontakt (när någon står på mattan) är sensorValue 1024. Detta resulterar i att funktionen extractData () avfyras. Och det är precis vad vi vill att systemet ska göra.

Steg 5: Designfeedback

Jag använde en LEDstrip för att ge feedback till användaren. När det är trafikstockning kommer lampan att färga rött. När vägen är bra att gå blir den grön. Jag använde adafruit neopixel biblioteket för att styra min LEDstrip.

Skriv den här koden högst upp i din fil för att se till att LED -raden är definierad:

#omfatta

#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 nästa kod i installationsfunktionen:

// neopixel

pixlar. börjar (); pixlar. visa ();

Och följande kod i loop -funktionen:

if (trafficJam == true) {

för (int i; i <PIXEL_COUNT; i ++) {pixels.setPixelColor (i, 255, 0, 0); // röda pixlar. visa (); fördröjning (200); }} annat {för (int i; i <PIXEL_COUNT; i ++) {pixels.setPixelColor (i, 0, 255, 0); // gröna pixlar. visa (); fördröjning (200); }

I koden ovan finns en if/else -funktion. När funktionen extractData returnerar närvaron av ett trafikstockning blir LED -remsan röd. Om inte blir LED -remsan grön.

Steg 6: Kör koden

Om vi kör hela koden nu ska sensorn och ljuset fungera. När du står på dörrmattan kommer sensorn att ansluta och extraktdatafunktionen körs. Den väg vi letar efter finns i utbudet av vägnamn, LED -remsan blir röd och signalerar en trafikstockning. Om det inte finns i matrisen blir LEDstripen grön och du vet att du är bra att gå!

Ha en säker resa och tack för att du läser. Jag hoppas att du hittat lite inspiration eller information. Om du har lite feedback får du gärna svara!

Rekommenderad: