Spisu treści:

Sprawdzanie raportu o ruchu (NL) z wycieraczką: 6 kroków
Sprawdzanie raportu o ruchu (NL) z wycieraczką: 6 kroków

Wideo: Sprawdzanie raportu o ruchu (NL) z wycieraczką: 6 kroków

Wideo: Sprawdzanie raportu o ruchu (NL) z wycieraczką: 6 kroków
Wideo: Jeffrey Mishlove: Zdalne oglądanie i testowanie zjawisk paranormalnych 2024, Lipiec
Anonim
Kontrola raportu o ruchu (NL) z wycieraczką
Kontrola raportu o ruchu (NL) z wycieraczką

W tej instrukcji opiszę, jak zbudować wycieraczkę, która będzie sprawdzać raporty o ruchu na holenderskich autostradach. Gdy wyjdziesz na wycieraczkę i na Twojej trasie pojawi się korek, mata zmieni kolor na czerwony. Gdy nie ma korków, mata zmieni kolor na zielony.

Będę pracował na NodeMCU 1.0 (moduł ESP0-12E). Kod do tego projektu mógłby działać również na innych urządzeniach (np. płytach Arduino). Projekt ten opiera się na holenderskim źródle raportów o ruchu drogowym, ANWB.

Czego potrzebujemy do tego projektu:

- NodeMCU - Zworki - LEDlight lub pasek - Czujnik analogowy (folia aluminiowa, gąbka) - Połączenie Wi-Fi - Wycieraczka

Kroki, które musimy podjąć:

1. Połącz NodeMCu z Wi-Fi 2. Żądaj danych przez HTTPS z ANWB.nl 3. Przekształć dane w użyteczne informacje 4. Zainstaluj wyzwalacz 5. Projektuj informacje zwrotne

Krok 1: Połącz NodeMCU z Wi-Fi

Ten krok pokaże, jak wykonać pomyślne żądanie HTTPSRequest, aby sprawdzić, czy urządzenie jest połączone z Internetem.

Najpierw zainstaluj bibliotekę ESP8266 w Arduino IDE. Open z przykładów ESP8266 >

Wpisz swoje dane uwierzytelniające Wi-Fi w górnej części kodu, jak pokazano poniżej:

const char* ssid = "TWÓJ_SSID";

const char* hasło = "TWÓJ_PASS";

Prześlij kod na swoje urządzenie i sprawdź, czy NodeMCU łączy się z Internetem. Przykład HTTPSRequest używa Github jako domyślnego do pobierania informacji. Gdy HTTPSRequest się powiedzie, otrzymasz dane Github na monitorze szeregowym.

Krok 2: Poproś o dane z HTTPS z ANWB.nl

W tym drugim kroku zmienisz źródło danych z domyślnego na źródło potrzebne dla tego projektu: ANWB.nl.

U góry kodu zmień host char* na www.anwb.nl (lub inne źródło, z którego chcesz pobrać dane):

const char* host = "www.anwb.nl";!! Jeśli użyjesz innego źródła, krok 3 będzie się różnił od mojego kodu. Krok 3 wymaga specjalnego kodowania, aby uzyskać użyteczne informacje!

Następnie zmień adres URL ciągu w konfiguracji funkcji na "/feeds/gethf", ścieżkę, z której pobierane są informacje:

String url = "/feeds/gethf";!! Jeśli używasz innego źródła, użyj ścieżki do swojego źródła!

Po przesłaniu kodu powinieneś otrzymać odpowiedź ze wszystkimi danymi z www.anwb.nl/feeds/gethf. Ten kod jest zapisywany w ciągu zwanym linią.

Krok 3: Zmień dane w użyteczne informacje

Do tej pory kod działał tylko wtedy, gdy NodeMCU zostało uruchomione lub zresetowane, ponieważ cały kod znajduje się w funkcji konfiguracji. Aby ustawić wyzwalacz, aby uruchamiał kod w sposób ciągły, musisz zmienić pozycję kodu, który uruchamia żądanie HTTPS. Poniżej funkcji pętli dodajesz kolejną funkcję. Nazwałem to void extractData:

wyodrębnijDane(){

}

Skopiuj część kodu z funkcji setup do extractData(). Zacznij od następującego wiersza do końca funkcji konfiguracji:

if (!client.connect(host, Kod znajduje się teraz w nowej funkcji, więc usuń skopiowany kod z funkcji konfiguracji.

Następnie wywołaj funkcję extractData w funkcji pętli i dodaj opóźnienie, aby dać nodeMCU czas na odpoczynek:

pusta pętla () {

wyodrębnijDane(); opóźnienie (30000); // zostanie to usunięte później, gdy będziemy mieli czujnik analogowy }

Ponieważ dane, które otrzymujesz, są przechowywane w ciągu i potrzebne są tylko części tego ciągu, musisz napisać kilka pętli for.

Najpierw sprawdź wszystkie pozycje słowa „droga”. Po słowie „droga” pojawi się nazwa drogi (A1, A2 itd.).

Zanim zaczniesz pisać pętle for, musisz zadeklarować kilka zmiennych, których będziesz używać:

int nrPozycji = 0;

wartość logiczna hasRunOnce = false; int od = 0; int roadArray[20];

Teraz nadszedł czas na napisanie kilku pętli. Na dole funkcji extractData napisałem pętle for. Próbowałem podzielić go na osobne funkcje, ale nie mogłem go uruchomić.

Dla pętli nr 1: znajdź pozycje słowa droga w linii ciągu:

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

Następnie sprawdź, na jakich drogach jest korek, korzystając z pozycji pętli for z góry. Pozycja nazw dróg jest zawsze taka sama i zaczyna się od 7 znaków, a kończy 10 znaków po słowie droga.

Teraz definiujemy tablicę nameOfRoadArray, która zostanie wypełniona w następnej pętli for:

Nazwa ciąguOfRoadArray[20];

Dla pętli nr 2: Znajdź wszystkie nazwy dróg z danymi wejściowymi z pętli for nr. 1

for(int k = 0; k < 20; k++){ int pos = tablica drogowa[k]; int pozycjaNazwaDrogi = poz + 7; int endPositionOfRoadName = pozycja + 10; nazwaTablicaDrogi[k] = line.substring(PozycjaNazwyDrogi, koniecPozycjiNazwyDrogi); }

Tablica nameOfRoudArray powinna być wypełniona wszystkimi sygnalizowanymi korkami.

Następnie sprawdzisz, czy Twoja droga znajduje się w szeregu dróg z korkiem. Wydrukuj nameOfRoadArray, aby uzyskać drogi w danych. Zrób to, dodając Serial.println(nameOfRoadArray[k]); w drugą pętlę for:

for(int k = 0; k < 20; k++){ int pos = tablica drogowa[k]; int pozycjaNazwaDrogi = poz + 7; int endPositionOfRoadName = pozycja + 10; nazwaTablicaDrogi[k] = line.substring(PozycjaNazwyDrogi, koniecPozycjiNazwyDrogi); Serial.println(nazwaTablicaDrogi[k]); }

Jeśli wszystko jest w porządku, na monitorze Serial zobaczysz wszystkie drogi z korkiem.

Przed napisaniem ostatniej pętli For musisz zadeklarować wartość logiczną jako zmienną globalną. Wartość logiczna o nazwie trafficJam domyślnie ma wartość false i zmieni się, jeśli funkcja extractData zwróci true w przypadku korka. Poniższy kod znajduje się na górze pliku.ino:

boolean trafficJam = false;

Dla pętli nr 3: Sprawdź, czy droga, w tym przypadku A1, znajduje się na liście korków.

for(int l=0; l < 20; l++){ if(nameOfRoadArray[l] == "A1\""){ //zmień A1 na swoją ulubioną drogę trafficJam = true; }

Jeśli drukujesz trafficJam na monitorze szeregowym, wiesz, czy na A1 jest korek, czy nie.

Umieść ten kod na dole funkcji extractData:

Serial.println(korek); //sprawdź czy jest korek

Mając te informacje, będziemy dalej pracować nad informacją zwrotną z systemu w kroku 5.

Krok 4: Zainstaluj wyzwalacz

Zainstaluj wyzwalacz
Zainstaluj wyzwalacz
Zainstaluj wyzwalacz
Zainstaluj wyzwalacz
Zainstaluj wyzwalacz
Zainstaluj wyzwalacz

Ponieważ możemy teraz pomyślnie pobrać dane ze źródła, nadszedł czas na zbudowanie czujnika, który uruchomi nodeMCU do uruchomienia funkcji extractData. Zdecydowałem się zrobić czujnik analogowy z wycieraczki. Możesz zmienić wyzwalacz, używając innego czujnika.

Budowa czujnika analogowego

Użyłem 2 kawałków folii aluminiowej, dwóch zworek i gąbki.

Wywierć otwór w gąbce, to jest miejsce, w którym folie aluminiowe będą się stykać. Po obu stronach gąbki przyklej folię aluminiową. Podłącz przewody połączeniowe do folii aluminiowej. Podłącz przewody połączeniowe do nodeMCU. Jedna strona do styku A0, a druga do styku V3. Umieść gąbkę pod wycieraczką i właśnie zamieniłeś wycieraczkę w czujnik. Niesamowite!

Kod do odczytania wartości z czujnika, aby sprawdzić, czy ktoś nie stoi na wycieraczce:

int sensorValue = analogRead(A0);

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

Kiedy folia aluminiowa styka się (gdy ktoś stoi na macie), wartość sensorValue wynosi 1024. Powoduje to uruchomienie funkcji extractData(). I to jest dokładnie to, czego oczekujemy od systemu.

Krok 5: Opinia o projekcie

Użyłem taśmy LED, aby przekazać informację zwrotną użytkownikowi. Gdy pojawi się korek, światło zmieni kolor na czerwony. Gdy droga będzie gotowa, zmieni kolor na zielony. Użyłem biblioteki adafruit neopixel do sterowania paskiem LED.

Napisz ten kod na początku pliku, aby upewnić się, że pasek LED jest zdefiniowany:

#włączać

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

Wpisz następny kod w funkcji konfiguracji:

//neopiksel

piksele.początek(); piksele.pokaż();

Oraz następujący kod w funkcji pętli:

if (korek == prawda){

for(int i; i < PIXEL_COUNT; i++){ piksele.setPixelColor(i, 255, 0, 0); // czerwone piksele.show(); opóźnienie(200); } } else{ for(int i; i < PIXEL_COUNT; i++){ pikseli.setPixelColor(i, 0, 255, 0); // zielone piksele.show(); opóźnienie(200); }

W powyższym kodzie znajduje się funkcja if/else. Gdy funkcja extractData zwróci informację o korku, pasek LED zmieni kolor na czerwony. Jeśli nie, pasek LED zmieni kolor na zielony.

Krok 6: Uruchom kod

Jeśli uruchomimy teraz cały kod, czujnik i światło powinny działać. Gdy staniesz na wycieraczce, czujnik połączy się i uruchomi funkcję extractData. Gdy w tablicy nazw dróg pojawi się szukana przez nas droga, pasek LED zmieni kolor na czerwony, sygnalizując korek. Jeśli nie ma go w tablicy, pasek LED zmieni kolor na zielony i wiesz, że jesteś gotowy!

Życzymy bezpiecznej podróży i dziękuję za przeczytanie. Mam nadzieję, że znalazłeś inspirację lub informacje. Jeśli masz jakieś uwagi, nie wahaj się odpowiedzieć!

Zalecana: