Sommario:

Controllo del rapporto sul traffico (NL) con zerbino: 6 passaggi
Controllo del rapporto sul traffico (NL) con zerbino: 6 passaggi

Video: Controllo del rapporto sul traffico (NL) con zerbino: 6 passaggi

Video: Controllo del rapporto sul traffico (NL) con zerbino: 6 passaggi
Video: 4- Sicurezza dei sistemi informatici e della privacy a livello internazionale 2024, Dicembre
Anonim
Controllo del rapporto sul traffico (NL) con zerbino
Controllo del rapporto sul traffico (NL) con zerbino

In questo tutorial descriverò come costruire uno zerbino che controllerà i rapporti sul traffico delle autostrade olandesi. Una volta che esci dallo zerbino e c'è un ingorgo sul percorso, il tappetino diventa di colore rosso. Quando non ci sono ingorghi, il tappeto diventa verde.

Lavorerò su un NodeMCU 1.0 (modulo ESP0-12E). Il codice per questo progetto potrebbe funzionare anche su altri dispositivi (ad esempio schede Arduino). Questo progetto si basa su una fonte olandese per i rapporti sul traffico, l'ANWB.

Di cosa abbiamo bisogno per questo progetto:

- NodeMCU - Ponticelli - Luce LED o striscia - Sensore analogico (foglio di alluminio, spugna) - Connessione Wi-Fi - Zerbino

Passi che dobbiamo compiere:

1. Connetti NodeMCu al Wi-Fi 2. Richiedi dati tramite HTTPS da ANWB.nl 3. Trasforma i dati in informazioni utilizzabili 4. Installa il trigger 5. Feedback sulla progettazione

Passaggio 1: collega NodeMCU al Wi-Fi

Questo passaggio mostrerà come eseguire correttamente una HTTPSRequest per vedere se il dispositivo è connesso a Internet.

Innanzitutto, installa la libreria ESP8266 in Arduino IDE. Apri dagli esempi ESP8266>

Inserisci le tue credenziali Wi-Fi nella parte superiore del codice, come mostrato di seguito:

const char* ssid = "YOUR_SSID";

const char* password = "YOUR_PASS";

Carica il codice sul tuo dispositivo e controlla se il NodeMCU si sta connettendo a Internet. L'esempio HTTPSRequest utilizza Github come impostazione predefinita per ottenere informazioni da. Quando HTTPSRequest ha avuto successo, ricevi i dati Github nel monitor seriale.

Passaggio 2: richiesta dati da HTTPS da ANWB.nl

In questo secondo passaggio, si modifica l'origine dati dall'impostazione predefinita all'origine necessaria per questo progetto: ANWB.nl.

Nella parte superiore del codice, cambia char* host in www.anwb.nl (o un'altra fonte da cui desideri ottenere i tuoi dati):

const char* host = "www.anwb.nl";!! Se usi un'altra fonte, il passaggio 3 sarà diverso dal mio codice. Il passaggio 3 richiede una codifica specifica per recuperare informazioni utilizzabili!

Quindi, cambia l'URL della stringa nell'impostazione della funzione in "/feeds/gethf", il percorso da cui vengono prese le informazioni:

String url = "/feeds/gethf";!! Se usi un'altra fonte usa il percorso della tua fonte!

Quando carichi il codice dovresti ricevere una risposta con tutti i dati da www.anwb.nl/feeds/gethf. Questo codice viene salvato in una stringa chiamata line.

Passaggio 3: trasforma i dati in informazioni utilizzabili

Fino ad ora, il codice veniva eseguito solo quando il NodeMCU è stato avviato o ripristinato, perché tutto il codice si trova nella funzione di configurazione. Per impostare il trigger per l'esecuzione continua del codice, è necessario modificare la posizione del codice che esegue la richiesta HTTPS. Sotto la funzione loop, aggiungi un'altra funzione. L'ho chiamato void extractData:

estrarreData(){

}

Copia parte del codice dalla funzione setup in extractData(). Inizia con la seguente riga fino alla fine della funzione di configurazione:

if (!client.connect(host, Il codice è ora nella tua nuova funzione, quindi rimuovi il codice copiato dalla funzione di configurazione.

Quindi, chiama la funzione extractData nella funzione loop e aggiungi un po' di ritardo per dare al nodeMCU il tempo di riposare:

ciclo vuoto(){

estrarreData(); ritardo (30000); // questo verrà rimosso in seguito quando avremo un sensore analogico }

Poiché i dati che ricevi sono memorizzati in una stringa e sono necessarie solo parti di questa stringa, devi scrivere un paio di cicli for.

Innanzitutto, controlla tutte le posizioni della parola "strada". Dopo la parola 'strada', seguirà il nome della strada (A1, A2, ecc.).

Prima di iniziare a scrivere i cicli for, devi dichiarare alcune variabili che utilizzerai:

int noOfPos = 0;

booleano hasRunOnce = false; int da = 0; int roadArray[20];

Ora è il momento di scrivere alcuni loop. Ho scritto i cicli for nella parte inferiore della funzione extractData. Ho provato a dividerlo in funzioni separate, ma non sono riuscito a farlo funzionare.

Per il ciclo n. 1: trova le posizioni della parola strada nella riga della stringa:

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

Quindi, controlla quali strade hanno un ingorgo, utilizzando le posizioni del ciclo for dall'alto. La posizione del nome delle strade è sempre la stessa e inizia con 7 caratteri e termina con 10 caratteri dopo la parola strada.

Ora definiamo l'array nameOfRoadArray, che verrà compilato nel prossimo ciclo for:

Nome stringaOfRoadArray[20];

For loop n. 2: Trova tutti i nomi delle strade con l'input da for loop n. 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); }

L'array nameOfRoudArray dovrebbe essere riempito con tutti gli ingorghi segnalati.

Successivamente, controllerai se la tua strada si trova nella serie di strade con un ingorgo. Stampa il nomeOfRoadArray per ottenere le strade nei dati. Fallo aggiungendo il Serial.println(nameOfRoadArray[k]); nel secondo ciclo for come:

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

Se è corretto vedrai tutte le strade con un ingorgo nel monitor seriale.

Prima di scrivere l'ultimo ciclo For, devi dichiarare un booleano come variabile globale. Il booleano, chiamato trafficJam è per impostazione predefinita false e cambierà se la funzione extractData restituirà true per un ingorgo. Il seguente codice va in cima al file.ino:

boolean trafficJam = false;

Per l'anello n. 3: verificare se la strada, in questo caso A1, è nell'elenco degli ingorghi.

for(int l=0; l < 20; l++){ if(nameOfRoadArray[l] == "A1\""){ //cambia A1 con la strada che preferisci trafficJam = true; }

Se stampi trafficJam nel monitor seriale, sai se c'è un ingorgo sulla A1 o meno.

Metti questo codice in fondo alla funzione extractData:

Serial.println(trafficJam); //vedi se c'è un ingorgo

Con queste informazioni lavoreremo ulteriormente sul feedback del sistema nel passaggio 5.

Passaggio 4: installa il trigger

Installa il grilletto
Installa il grilletto
Installa il grilletto
Installa il grilletto
Installa il grilletto
Installa il grilletto

Poiché ora possiamo recuperare correttamente i dati dalla sorgente, è il momento di costruire un sensore che attiverà il nodeMCU per eseguire la funzione extractData. Ho scelto di realizzare un sensore analogico dal mio zerbino. Potresti cambiare il grilletto usando un altro sensore.

Costruire il sensore analogico

Ho usato 2 fogli di alluminio, due fili per ponticelli e una spugna.

Praticare un foro nella spugna, questo è il punto in cui i fogli di alluminio entreranno in contatto. Incolla un foglio di alluminio su entrambi i lati della spugna. Collegare i cavi dei ponticelli al foglio di alluminio. Collegare i cavi dei ponticelli al nodeMCU. Un lato al pin A0 e l'altro al pin V3. Metti la spugna sotto lo zerbino e hai appena cambiato lo zerbino in un sensore. Stupendo!

Il codice per leggere il valore dal sensore per vedere se qualcuno è in piedi sullo zerbino:

int sensorValue = analogRead(A0);

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

Quando il foglio di alluminio entra in contatto (quando qualcuno è in piedi sul tappetino), il valore del sensore è 1024. Ciò provoca l'attivazione della funzione extractData(). Ed è esattamente quello che vogliamo che faccia il sistema.

Passaggio 5: feedback sulla progettazione

Ho usato una striscia LED per dare un feedback all'utente. Quando c'è un ingorgo, il semaforo diventa rosso. Quando la strada è buona, diventerà verde. Ho usato la libreria adafruit neopixel per controllare la mia striscia LED.

Scrivi questo codice nella parte superiore del tuo file per assicurarti che la striscia LED sia definita:

#includere

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

Scrivi il prossimo codice nella funzione di configurazione:

//neopixel

pixel.begin(); pixel.mostra();

E il seguente codice nella funzione loop:

if (ingorgo == vero){

for(int i; i < PIXEL_COUNT; i++){ pixels.setPixelColor(i, 255, 0, 0); // pixel rossi.show(); ritardo(200); } } else{ for(int i; i < PIXEL_COUNT; i++){ pixels.setPixelColor(i, 0, 255, 0); // pixel verdi.show(); ritardo(200); }

Nel codice sopra c'è una funzione if/else. Quando la funzione extractData restituisce la presenza di un ingorgo la striscia LED diventa rossa. In caso contrario, la striscia LED diventerà verde.

Passaggio 6: eseguire il codice

Se eseguiamo ora il codice completo, il sensore e la luce dovrebbero funzionare. Quando sarai sullo zerbino, il sensore si collegherà e la funzione extractData verrà eseguita. Quando nell'array dei nomi delle strade è presente la strada che stiamo cercando, la striscia LED diventa rossa, segnalando un ingorgo. Se non è nell'array, la striscia LED diventerà verde e saprai che sei a posto!

Buon viaggio e grazie per aver letto. Spero che tu abbia trovato ispirazione o informazioni. Se hai qualche feedback, non esitare a rispondere!

Consigliato: