Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

IoT4Car

Komponenten und Verbrauchsmaterialien

Arduino MKR1000
× 1
SparkFun Logic Level Converter - Bidirektional
× 1
SparkFun OBD-II UART
× 1
SparkFun OBD-II-auf-DB9-Kabel
× 1

Apps und Onlinedienste

Arduino-IDE
freeboard
dweet

Über dieses Projekt

Hintergrund

Haben Sie beim Fahren Ihres Fahrzeugs mit einem Blick auf Ihr Armaturenbrett jemals daran gedacht, die Zählerstände zu sammeln und eine Analyse durchzuführen? Diese Daten können verborgene Schätze enthalten. Für Einzelpersonen kann es Ihre Fahrgewohnheiten widerspiegeln, es kann Ihnen Ihre Geschwindigkeit, Ihren durchschnittlichen MPG, wie viele Ampeln Sie haben und Ihre Wartezeit an jeder Kreuzung sagen. Für Unternehmen sind diese Daten entscheidend für die Echtzeitüberwachung im Flottenmanagement. Fahrzeugzustand, Arbeitslastverteilung, Benzineffizienz und sogar Fahrzeugstandort können über die Cloud an ein zentrales Steuerungssystem zurückgemeldet werden. Unternehmen können maschinelles Lernen nutzen, um die Daten in ein Trainingsmodell einzuspeisen, um die Kosten vorherzusagen und sogar die Eigenschaften des Fahrers zu analysieren. Da sich das IoT weit verbreitet, sind die oben genannten Anwendungen nicht weit entfernt. Mit den Arduino MKR-Boards, die auf IoT-Anwendungen ausgerichtet sind, können Sie ein Gerät bauen, das mit Ihrem Auto kommuniziert und Telemetriedaten ganz allein in die Cloud hochlädt. Ist das nicht cool?

Mit einem Fahrzeug sprechen

Wir brauchen eine Schnittstelle für den Zugriff auf das Fahrzeugsystem. Wo können wir uns ins Auto hacken? Die Antwort ist die OBD-II-Schnittstelle.

Was ist OBD-II?

On-Board-Diagnose (OBD) ist ein eingebautes Selbstdiagnosesystem eines Fahrzeugs, über das wir mit unseren Autos kommunizieren können. Es wurde erstmals 1994 in den USA eingeführt und wurde für alle 1996 und neuere US-Fahrzeuge vorgeschrieben. Andere Länder, darunter Kanada, Teile der Europäischen Union, Japan, Australien und Brasilien, haben ähnliche Gesetze erlassen. OBD-II (zweite Generation) verfügt über fünf Signalisierungsprotokolle, und das Controller Area Network (CAN-Bus) ist eines davon. CAN-Bus muss seit 2008 in allen US-Autos implementiert werden. Es gibt eine großartige Einführung von OBDII von CSS Electronics auf Youtube. In diesem Projekt werden wir über die 16-Pin-OBD-II-Schnittstellen auf Daten zugreifen.

Mein Controller

Arduino ist eine ausgezeichnete Plattform für Bastler, Hersteller und Profis. Es verfügt über eine Vielzahl von Boards, die auf verschiedene Anwendungen ausgerichtet sind. Hier verwende ich das Arduino MKR WiFi 1000 Board aufgrund seiner WiFi-Fähigkeit. Sie können auch andere Boards verwenden, die Ihnen gefallen. Ich würde Arduino MKR GSM 1400 empfehlen, einfach weil GSM viel größere Bereiche abdeckt als WiFi. Aber keine Sorge, auch mit WiFi können wir entlang der Straßen Internet-Zugang haben. Ich zeige Ihnen die Problemumgehung.

Die Dolmetschertafel

Obwohl Arduino selbst über viele I/Os und zahlreiche Bibliotheken verfügt, brauchen wir immer noch ein Board, das OBD-Protokolle in eine Sprache übersetzen kann, die Arduino erkennt. Das Board, das ich verwende, ist das SparkFun OBD-II UART Board.

Diese Platine ermöglicht Ihnen die Verbindung mit dem OBD-II-Bus Ihres Autos. Es bietet Ihnen eine serielle Schnittstelle mit dem ELM327-Befehlssatz und unterstützt alle wichtigen OBD-II-Standards wie CAN. Die Platine enthält einen STN1110-Chip, einen OBD-zu-UART-Interpreter, mit dem Nachrichten zwischen einem der derzeit verwendeten OBD-II-Protokolle und UART konvertiert werden können.

Es sollte jedoch darauf hingewiesen werden, dass das Interpreterboard eine I/O-Spannung von 5 V hat, die bei direktem Anschluss die Arduino MKR-Board-I/O beschädigen kann. Arduino MKR WiFI 1000 läuft mit einer niedrigeren Spannung und seine I/O-Spannung beträgt 3,3 V. Daher wird ein Pegelumsetzer benötigt, um das Signal von 5 V auf 3,3 V und umgekehrt umzuwandeln. Unten ist das Bild der Pegelverschiebung, die ich verwende.

Anschließen

Das Anschließen der Schaltung ist ziemlich einfach. Verbinden Sie einfach Ihren Arduino MRK Pin 13 Rx und Pin 14 Tx über den Pegelumsetzer mit den Tx- und Rx-Pins der OBD-II UART-Platine. Natürlich müssen Sie die Masse der beiden Platinen miteinander verbinden.

Um das Debugging und die Demonstration zu erleichtern, habe ich auch einen LCD 1602-Bildschirm an Arduino angeschlossen, um die Daten in Echtzeit anzuzeigen. Die LCD-zu-Arduino-Verkabelung ist in diesem Tutorial zu finden und wird daher hier nicht näher erläutert.

Unten ist das Bild der Steckbrettverbindung. Die grünen Linien sind für die Drähte, die das Arduino und die OBD-II-UART-Platine verbinden, während die gelben Linien für die Drähte sind, die das Arduino und das LCD verbinden. Der Schaltplan ist auch im Anhang verfügbar.

Die tatsächliche Verbindung ist aufgrund der begrenzten Steckbrettfläche etwas unordentlich, folgt jedoch dem obigen Schema. Ich habe das Micro-USB- und das ODB-II-auf-DB9-Kabel in das Bild aufgenommen.

Seriell1 nicht seriell

Alles klar, es ist Zeit, unser Arduino MKR-Board zu programmieren. Da mein Arduino MKR-Board über UART mit dem Interpreter-Board kommuniziert, müssen keine Bibliotheken von Drittanbietern installiert werden. Das Senden von Befehlen an das Interpreterboard ist einfach wie die Kommunikation mit Serial Monitor. Das einzige, was ich hervorheben möchte, ist, dass der mit Pin 13 und Pin 14 verbundene serielle Port Seriell 1 ist ! Arduino MKR-Board Serielle Schnittstelle bezieht sich auf den USB-Port, der zur Kommunikation mit Ihrem Computer verwendet wird. Vergessen Sie nicht, Seriennummer 1 zu initialisieren port in der setup()-Funktion.

 Serial1.begin(9600); 

Und verwenden Sie Serielle 1 um den Befehl an die Dolmetschertafel zu senden.

 Serial1.println (Nachricht); 

Nachrichten

Wie Sie sehen, verwende ich die Variable "message", um die Befehle zu speichern. Die OBD-Befehle bestehen aus hexadezimalen Codes, die in ASCII-Zeichen geschrieben sind. Die ersten beiden hexadezimalen Zahlen beziehen sich auf den zu verwendenden Servicemodus. Es gibt 10 Diagnosedienste, die im neuesten OBD-II-Standard SAE J1979 beschrieben sind. Da wir an Echtzeitüberwachung interessiert sind, verwenden wir nur 01 Code, um aktuelle Daten in diesem Projekt anzuzeigen.

Jede Hex-Zahl nach dem Service-Modus stellt die Parameter-ID (PID) dar, um spezielle Funktionen zu erreichen. Unten ist der Screenshot der PIDs im 01-Servicemodus. Weitere Informationen finden Sie in Wikipedia.

In diesem Projekt werde ich zeigen, wie man die Fahrzeuggeschwindigkeit, die Motordrehzahl, den Kraftstoffstand und die Motorkühlmitteltemperatur erhält. Die OBD-Befehle für diese vier Funktionen sind:

  • 010D // Autogeschwindigkeit
  • 010C // Motordrehzahl
  • 012F // Kraftstoffstand
  • 0105 // Kühlmitteltemperatur.

Daten entschlüsseln

Sobald die Befehle gesendet wurden, hört die Arduino MKR-Platine auf dem seriellen 1-Port auf jede Antwort. Es ist besser, nach dem Senden der Befehle eine Verzögerung von 200 ms einzustellen. Ich verwende den folgenden Code, um eine Antwort zu erhalten.

void getResponse(void){ while(Serial1.available()> 0) { // Prüfen Sie zunächst, ob wir das Ende des Nachrichtenzeichens ('\r') erhalten haben. if (Serial1.peek () =='\r') {// das Ende der Nachricht erreichen, den seriellen Puffer löschen inChar =Serial1.read (); rxData[rxIndex] ='\0'; // Den Pufferindex zurücksetzen, sodass das nächste Zeichen an den Anfang des Strings zurückkehrt rxIndex =0; } // Wenn wir das Ende des Nachrichtenzeichens nicht erhalten haben, fügen Sie einfach das neue Zeichen zur Zeichenfolge hinzu else{ // Holen Sie sich das neue Zeichen von der seriellen Schnittstelle:inChar =Serial1.read (); // füge dem String das neue Zeichen hinzu und erhöhe die Indexvariable:rxData[rxIndex++] =inChar; } }} 

Die Antwort der Dolmetschertafel folgt dem Format

">1 wiederholte PIDs-Daten"

Im obigen Screenshot sende ich zum Beispiel "010D", um die Autogeschwindigkeit zu erhalten. Die Antwort ist ">1 0D 00". Die ersten 5 Zeichen zeigen, dass das Auto den Befehl empfängt und die PID 0x0D zurück wiederholt. Die letzten beiden Ziffern geben die Geschwindigkeitsdaten 0x00 zurück.

Dann sende ich "010C" aus, um die Motordrehzahl zu erhalten, die Antwort ">1 0C" zeigt die Bestätigung des Befehls, die Daten 0x098C sind das 4-fache des Motordrehzahlwerts in hexadezimaler Form. 0x098C / 4 =611 dez, die Motordrehzahl beträgt also 611 U/min.

Danach sende ich den Befehl "012F", um den Kraftstoffstand abzurufen, und erhalte Daten 0x1D. Der Kraftstoffstand wird berechnet als 0x1D / 255 * 100 =11% dez.

Der letzte Befehl ist "0105", was mir die Kühlmitteltemperatur 0x79 gibt. Die tatsächliche Temperatur beträgt 0x79 - 40 =81 °C dez. Dann wiederholt sich die Befehlssequenz.

Wie Sie sehen, enthält die Antwortzeile Leerzeichen zwischen zwei hexadezimalen Ziffern, und die ersten 5 Ziffern wiederholen einfach die Befehle. Daher beginnen die echten Daten mit dem 6. Zeichen (das erste beginnt mit dem Index 0).

Beim Programmieren und Debuggen ist ein serieller Monitor hilfreich, aber wenn es um die reale Anwendung geht, ist ein LCD-Bildschirm tragbarer und erfüllt den Strombedarf des IoT. Ersetzen Sie einfach den seriellen Monitor durch einen LCD-Bildschirm, Sie können Ihre Fahrzeugdaten in Echtzeit überwachen. Unten ist das Foto von der Verwendung des Projekts in meinem eigenen Auto.

Cloud unsere Daten

Der Vorteil des Arduino MKR gegenüber UNO ist seine Internet-Zugänglichkeit. Arduino MKR zielt auf IoT-Anwendungen ab und wird Industrien intelligenter und vernetzter machen. In den Automobilanwendungen ist MKR WiFi 1000 vielleicht nicht das beste Board, da das WLAN-Signal im Freien selten ist, aber ich nutze mein Handy als persönlichen Hotspot, daher ist dies kein Problem.

Es gibt viele andere Cloud-Plattformen zum Speichern, Anzeigen und Nachverarbeiten der Daten. Sie können wählen, was Ihnen gefällt. Ich werde dweet.io und freeboard.io als Beispiel verwenden. Dweet.io bietet eine API, an die Sie Daten senden können. Freeboard.io verfügt über Handles, um die dweet.io-Daten aufzunehmen und zu visualisieren. Es gibt mehrere Tutorials zum Einrichten von dweet.io und freebboard.io, daher werde ich nicht noch einmal darauf eingehen. Bei Interesse hier einige Beispiele, Beispiel 1, Beispiel 2.

Der Daten-Push-Code wird unten gezeigt, um zu veranschaulichen, wie dweet-Befehle erstellt werden.

void httpRequest() { client.stop(); // Datenstring zum Senden an Freeboard erstellen if (client.connect (server, 80)) { Serial.println ( "Connected"); String-Daten ="POST /dweet/for/mkr1000?RPM="; data.concat(vRPM); // Motordrehzahl hochladen data.concat("&Speed="); data.concat(vSpeed); // Autogeschwindigkeit hochladen data.concat("&Fuel="); data.concat(vFuel); // Kraftstoffstand hochladen data.concat("&Temp="); data.concat(vTemp); // Kühlmitteltemperatur hochladen client.println (data); client.println("Host:https://www.dweet.io"); client.println("Verbindung:schließen"); // Verbindungsende client.println(); aufrechtzuerhalten. Sonst {lcd.clear(); lcd.setCursor(0,0); lcd.println("Verbindung fehlgeschlagen"); }} 

Auf freeboard.io müssen wir ein neues Dashboard erstellen und in diesem Dashboard eine neue Datenquelle erstellen. Verknüpfen Sie diese Datenquelle mit Ihrem dweet.io-Ding, das Sie im Code definiert haben. In meinem Fall ist es mkr1000. Erstellen Sie ein neues Messgerät-Widget, mit dem wir die Daten anzeigen. Geben Sie ihm einen Namen und verknüpfen Sie ihn mit einer unserer Variablen. Unten ist ein Screenshot von meinem Dashboard. Es zeigt GESCHWINDIGKEIT, RPM, KRAFTSTOFFSTAND und KÜHLMITTELTEMPERATUR an.

Fazit

Ich habe die Boards an meinem eigenen Auto ausprobiert und es funktioniert gut. Ich arbeite daran, eine Leiterplatte zu entwerfen, die alle Funktionen in einem integrierten Schaltkreis enthält. Hoffentlich werde ich in Zukunft mehr Tutorials schreiben. Ich kann auch eine Video-Demo beifügen. Es tut mir leid, dass ich diesmal nicht so gut Videos aufnehmen konnte wie das Autofahren. Und Sie sollten auch vorsichtig sein, wenn Sie Ihren Code während der Fahrt auf der Straße debuggen!

Arduino MKR WiFi Board ist gut genug für diese Anwendung. Wenn ich mehr Boards habe, könnte ich das MKR GSM 1400 Board ausprobieren. Fühlen Sie sich frei, andere IoT-Boards mit diesem Tutorial zu verwenden und mir Ihr Feedback mitzuteilen.

Die Arbeit am Projekt macht Spaß und ist lehrreich. Ich genieße das Gefühl, ein Problem zu debuggen. Es ist mir auch eine Freude, mein Wissen im Internet zu teilen. Vielen Dank fürs Lesen. Lassen Sie es mich wissen, wenn Sie Fragen oder Kommentare haben.

Code

  • IoT4Car_code
IoT4Car_codeC/C++
Dieses Programm kommuniziert mit dem Fahrzeug über das OBDII-UART-Board, zeigt die Ergebnisse auf dem LCD an und lädt es auf die Freeboard-IoT-Plattform
/** OBDII-UART-Serial version 9* Dieses Programm spricht mit dem Fahrzeug über das OBDII -UART-Board, * und die Ergebnisse auf dem LCD anzeigen und auf die Freeboard-IoT-Plattform hochladen* * Autor:zhaoshentech* Aktualisiert:2018-08-27* * Updates:* v3:Die Funktion getResponse() wurde so geändert, dass der Puffer empfängt die richtige Antwort.* fügen Sie getRPM() hinzu, um die Motordrehzahl des Fahrzeugs zu erhalten.* v4:Fügen Sie die Funktion getSpeed() hinzu, um die Geschwindigkeit des Fahrzeugs zu erhalten* v5:Fügen Sie das LCD-Modul hinzu und zeigen Sie die Geschwindigkeit und die Drehzahl auf dem . an LCD* v6:ist die WLAN-Version* v7:ist die nicht-wifi, nicht-serielle Version. Entfernen Sie die serielle Initialisierung*, damit das Board ohne Computer arbeiten kann.* v8:ist die nicht-wifi, nicht-serielle Version. Fügen Sie Kraftstoffstand und Kühlmitteltemperatur hinzu.* Ordnen Sie die Anzeigeposition neu an.* v9:ist die nicht serielle WLAN-Version. Upolad-Geschwindigkeit, U/min, Kraftstoffstand und Kühlmitteltemperatur* * LCD-Schaltkreisverbindung:* LCD RS-Pin zu digitalem Pin 12* LCD Enable-Pin zu digitalem Pin 11* LCD D4-Pin zu digitalem Pin 5* LCD D5-Pin zu digitalem Pin 4* LCD D6-Pin an Digital-Pin 3 * LCD D7-Pin an Digital-Pin 2* LCD-R/W-Pin an Masse* 10 K-Potentialmeter:* endet an +5V und Masse* Schleifer an LCD-VO-Pin (Pin 3)*///// //////////////////////////////////////////////// ////// WLAN bezogen ///////////////////////////////////////// ///////////////#include#includechar ssid[] ="IHRE WIFI-SSID"; // wifi IDchar pass[] ="IHR WIFI PSWD"; // wifi passwordchar server[] ="www.dweet.io"; // freeboard und dweet Settingsunsigned long lastConnectionTime =0; // Verfolgen Sie die letzte Verbindung timeconst unsigned long postingInterval =10L * 1000L; // alle 10 Sekunden Daten postenWiFiClient-Client; //WLAN-Client initialisierenint status =WL_IDLE_STATUS; // den WiFi-Funkstatus// die LDC-Bibliothek einschließen#include const int rs =12, en =11, d4 =5, d5 =4, d6 =3, d7 =2;LiquidCrystal lcd(rs, en, d4, d5, d6, d7); // Dies ist ein Zeichenpuffer, der die Daten von der seriellen Schnittstelle speichert:char rxData[20];char rxIndex =0;char inChar =0;Zeichenfolge;// Variablen um die Geschwindigkeit und die RPM-Daten zu halten:int vSpeed ​​=0;int vRPM =0;int vFuel =0;int vTemp =0;void setup() {// Stellen Sie die Anzahl der Spalten und Zeilen des LCD ein:lcd.begin( 16,2); lcd.clear(); // Überprüfen Sie das Vorhandensein des Schilds:if (WiFi.status () ==WL_NO_SHIELD) { lcd.println ("WiFi nicht bereit"); während(wahr); } // Versuch, eine Verbindung zum WiFi-Netzwerk herzustellen:while (status !=WL_CONNECTED) { lcd.clear(); lcd.setCursor(0, 0); lcd.println("WLAN wird verbunden..."); status =WiFi.begin(ssid, pass); // 5 Sekunden auf die Verbindung warten:delay(5000); } lcd.setCursor(0, 1); lcd.println("Verbunden!"); // Serial1 ist der tatsächliche Port, um mit dem Fahrzeug zu sprechen Serial1.begin (9600); resetBuffer();}void loop() { while ( status !=WL_CONNECTED) { lcd.clear(); lcd.setCursor(0,0); // Verbindung zum WPA/WPA2-WLAN-Netzwerk Serial.println ("Verbindung mit WLAN herstellen"); lcd.println("WLAN verbinden..."); status =WiFi.begin(ssid, pass); // 10 Sekunden auf Verbindungsverzögerung warten (5000); } getSpeed(); getRPM(); getFuel(); getCoolTemp(); if (millis() - lastConnectionTime> postingInterval) { httpRequest(); lastConnectionTime =millis(); }}// getRPM data sendet den Befehl "010C" an den Serial1-Port // und ruft getResponse() auf, um die Daten zu sammeln. Dann druckt es // die RPM-Daten auf dem Serial Monitor.void getRPM(void){message ="010C"; Serial1.println (Nachricht); Verzögerung (200); // lösche die aktuelle Zeile für (int i =8; i <16; ++i) {lcd.setCursor(i, 0); // 0 Zeile, i Spalte lcd.write(' '); } lcd.setCursor(8,0); // erste Reihe zweite Hälfte im LCD-Bildschirm // Antwort warten getResponse (); // Die RPM-Antwort geteilt durch 4 ergibt den richtigen Wert. vRPM =((strtol(&rxData[6],0,16)*256) + Strtol(&rxData[9],0,16))/4; lcd.print (vRPM); lcd.print(" rpm");}void getSpeed(void){Nachricht ="010D"; Serial1.println (Nachricht); Verzögerung (200); // aktuelle Zeile löschen:for (int i =0; i <8; ++i) { lcd.setCursor(i, 0); // 0 Zeile, i Spalte lcd.write(' '); aufrechtzuerhalten. lcd.setCursor (0,0); // erste Zeile erste Hälfte des LCD-Bildschirms // auf die Antwort vom Auto warten getResponse (); vSpeed ​​=strtol(&rxData[6], 0, 16); // in der Einheit km/h vSpeed ​​=vSpeed ​​* 0.621371; // in der Einheit mph lcd.print(vSpeed); lcd.print("mph");}void getFuel(void){Nachricht ="012F"; Serial1.println (Nachricht); Verzögerung (200); // aktuelle Zeile löschen:for (int i =0; i <8; i++){ lcd.setCursor(i, 1); // 1. Zeile, i Spalte lcd.write(' '); } lcd.setCursor(0, 1); // zweite Reihe erste Hälfte auf dem LCD-Bildschirm // auf die Antwort vom Auto warten getResponse (); vFuel =strtol(&rxData[6], 0, 16); // in der Skala von 255 // vFuel =244; // Debug-Nutzung vFuel =1.0* vFuel / 255 *100; // im Maßstab 100 lcd.print(vFuel); lcd.print(" %"); //Seriell.println (vFuel); // Debug-Verwendung}void getCoolTemp(void){ message ="0105"; Serial1.println (Nachricht); Verzögerung (200); // aktuelle Zeile löschen:for (int i =8; i <16; i++){ lcd.setCursor(i, 1); // 1. Zeile, i Spalte lcd.write(' '); } lcd.setCursor(8, 1); // zweite Reihe zweite Hälfte auf dem LCD-Bildschirm // auf die Antwort vom Auto warten getResponse (); vTemp =strtol(&rxData[6], 0, 16); // in der Einheit C, aber um 40 Grad versetzt vTemp =vTemp - 40; // Offset um 0 lcd.print (vTemp); // drucke den Grad C lcd.write (0xDF); lcd.print("C");}// Die Funktion getResponse sammelt eingehende Daten vom UART in den rxData-Puffer // und wird beendet, wenn die Antwort übertragen wird. Sobald der Wagenrücklaufstring// erkannt wird, wird der rxData-Puffer nullterminiert (damit wir ihn als String behandeln können)// und der rxData-Index wird auf 0 zurückgesetzt, damit der nächste String kopiert werden kann.void getResponse(void ){ while(Serial1.available()> 0) { // Prüfen Sie zunächst, ob wir das Ende der Nachricht ('\r') erhalten haben. if (Serial1.peek () =='\r') {// das Ende der Nachricht erreichen, den seriellen Puffer löschen inChar =Serial1.read (); rxData[rxIndex] ='\0'; // Den Pufferindex zurücksetzen, sodass das nächste Zeichen an den Anfang des Strings zurückkehrt rxIndex =0; } // Wenn wir das Ende des Nachrichtenzeichens nicht erhalten haben, fügen Sie einfach das neue Zeichen zur Zeichenfolge hinzu else{ // Holen Sie sich das neue Zeichen von der seriellen Schnittstelle:inChar =Serial1.read (); // füge dem String das neue Zeichen hinzu und erhöhe die Indexvariable:rxData[rxIndex++] =inChar; } }}void resetBuffer (void) { for (int i =0; i <20; i++) { rxData[i] =0; }}void httpRequest() {client.stop(); // Datenstring zum Senden an Freeboard erstellen if (client.connect (server, 80)) { Serial.println ( "Connected"); String-Daten ="POST /dweet/for/mkr1000?RPM="; data.concat(vRPM); // Motordrehzahl hochladen data.concat("&Speed="); data.concat(vSpeed); // Autogeschwindigkeit hochladen data.concat("&Fuel="); data.concat(vFuel); // Kraftstoffstand hochladen data.concat("&Temp="); data.concat(vTemp); // Kühlmitteltemperatur hochladen client.println (data); client.println("Host:https://www.dweet.io"); client.println("Verbindung:schließen"); // Verbindungsende client.println(); aufrechtzuerhalten. Sonst {lcd.clear(); lcd.setCursor(0,0); lcd.println("Verbindung fehlgeschlagen"); }}

Schaltpläne

Verbinden Sie Arduino MKR WiFi 1000, SparkFun OBD-II UART Board, SparkFun Logic Level Shifter und LCD 1602 frizling_schematics_M8kF26dafQ.fzz

Herstellungsprozess

  1. Kennzeichen
  2. Antiblockiersystem
  3. Was ist ein Antriebsstrang?
  4. Was ist eine Lichtmaschine?
  5. Hindernisvermeidung durch künstliche Intelligenz
  6. Arduino-Gamecontroller
  7. Wolkenkostüm
  8. Was ist eine Gehäuseerdung?
  9. Chassis-Layout eines Fahrzeugs
  10. Fahrzeugverkabelung verstehen