#MultifunktionalesShield
Explore tagged Tumblr posts
draegerit · 6 years ago
Text
Arduino Lektion 85: Multifunktionales Shield von Open-Smart
Tumblr media
In diesem Tutorial möchte ich ein weiteres Multifunktionales Shield von der Firma "Open Smart" vorstellen. Die Zielgruppe für dieses Shield sind ganz klar die Anfänger im Bereich Microcontrollerentwicklung. Da das Shield direkt auf den Arduino UNO / Leonardo gesteckt werden kann entfällt eine aufwendige und ggf. fehlerbehaftete Verkabelung und man kann fast direkt mit der Programmierung beginnen.
Bezug
Das mir vorliegende Shield habe ich über Aliexpress für knapp 6$ inkl. Versandkosten erworben. Ich denke jedoch das dieses auch bald bei ebay.de erhältlich sein wird. (Es dauert nach meiner Erkenntnis ca. 4-5 Monate und dann sind diese Module und Shields auch auf ebay.de erhältlich.)
Ausstattung des Multifunktionalen Shields
Das Multifunktionale Shield verfügt über: 4fach 7 Segment Anzeige (TM1636), RealTimeClock DS1307, Piezzo Buzzer, Thermistor (NTC-Widerstand), Fotowiderstand, LEDs, Buttons Die meisten dieser Sensoren / Aktoren habe ich bereits gesondert in Tutorials behandelt (Links sind hinter den Texten hinterlegt.) daher möchte ich auf kleine Beispiele mit diesen und dem Shield eingehen. Das Shield wurde leider ohne Anleitung geliefert d.h. man muss zunächst einmal prüfen wo welche Sensoren / Aktoren angeschlossen sind. Hier reicht jedoch ein prüfender Blick auf der Platine denn die Leiterbahnen sind sehr gut zu erkennen und somit habe ich folgende Anschlüsse ermitteln können: LEDs D1 - digitaler Pin D2 D2 - digitaler Pin D3 D3 - digitaler Pin D4 NTC-Widerstand analoger Pin A0 Fotowiderstand analoger Pin A1 Buttos (Taster) K1 - digitaler Pin D9 K2 - digitaler Pin D10 K3 - digitaler Pin D11 Piezo Buzzer digitaler Pin D6 RTC DS1307 analoger Pin A4 - SDA analoger Pin A5 - SCL 4fach 7 Segmentanzeige digitaler Pin D8 - CLK
Programmieren
Wie bereits erwähnt habe ich die meisten der Sensoren / Aktoren bereits behandelt, daher möchte ich im folgenden einige kleine Beispiele aufzeigen wie diese verwendet werden können.  Piezo Buzzer Der Piezo Buzzer ist am digitalen Pin D6 angeschlossen und kann verschiedene Töne von sich geben. #define BUZZER 6 int minValue = 100; int maxValue = 1500; void setup() { pinMode(BUZZER, OUTPUT); } void loop() { //von der Frequenz minValue bis maxValue for(int i = minValue;iminValue;i--){ playTone(i); } } void playTone(int freq){ //gibt einen Ton auf dem Buzzer wieder mit der Frequenz freq und //einer dauer von 25ms. tone(BUZZER, freq,25); //kleine Pause von 2ms. delay(2); } LEDs Das Shield verfügt über zwei rote, eine grüne und eine blaue LED. Im folgenden Sketch erzeuge ich mit diesen 4 LEDs ein kleines Lauflicht. #define LED_RED1 5 #define LED_RED2 4 #define LED_GRUEN 3 #define LED_BLAU 2 const int PAUSE = 125; void setup() { pinMode(LED_RED1,OUTPUT); pinMode(LED_RED2,OUTPUT); pinMode(LED_GRUEN,OUTPUT); pinMode(LED_BLAU,OUTPUT); } void loop() { lightUpLed(LED_RED1); lightUpLed(LED_RED2); lightUpLed(LED_GRUEN); lightUpLed(LED_BLAU); } void lightUpLed(int pin){ delay(PAUSE); digitalWrite(pin, HIGH); delay(PAUSE); digitalWrite(pin, LOW); } Video Hier nun ein kleines Video, wie das oben gezeigte Sketch funktioniert.   Buttons (Taster) Auf dem Multifunktions Shield sind 3 Taster verbaut, diese Taster öffnen den Kontakt beim drücken d.h. das Signal ist zunächst auf LOW und wenn der Taster gedrückt wird ist dieser HIGH. #define BTN_1 9 #define BTN_2 10 #define BTN_3 11 void setup() { Serial.begin(9600); pinMode(BTN_1, INPUT); pinMode(BTN_2, INPUT); pinMode(BTN_3, INPUT); digitalWrite(BTN_1, HIGH); digitalWrite(BTN_2, HIGH); digitalWrite(BTN_3, HIGH); } void loop() { if(digitalRead(BTN_1) == LOW){ printMsg(1); } if(digitalRead(BTN_2) == LOW){ printMsg(2); } if(digitalRead(BTN_3) == LOW){ printMsg(3); } } void printMsg(int number){ Serial.print("Taster Nummer "); Serial.print(number); Serial.println(" wurde gedrückt."); } Was nun beim dem oben gezeigten Sketch auffällt ist das die Taster "prellen", d.h. beim drücken der Taster wird mehrmals ein Signal empfangen obwohl nur 1x kurz der Taster betätigt wurde.  Wie man dieses Prellen abstellen kann habe ich im Tutorial XYZ beschrieben. Video   Fotowiderstand Ein Fotowiderstand ist ein Widerstand welcher Licht abhängig seine größe bestimmt. D.h. je höher die Lichtintensität welche auf den Fotowiderstand wirkt desto kleiner ist sein innerer Widerstand. Den Fotowiderstand habe ich bereits im Tutorial Arduino Lektion 4: LED mit Fotowiderstand ausführlich behandelt. Da das Shield über 4 LEDs verfügt wollen wir diese nutzen um die aktuelle Lichtintensität anzuzeigen. Der minimale Wert ist 0 und der maximale Wert 1023. Um diese Werte auf die 4 LEDs zu mappen gibt es die Funktion map.  Die Funktion map hat 5 Parameter: map(value, fromLow, fromHigh, toLow, toHigh) Um dieses nun für unsere LEDs zu mappen sieht dieses dann wiefolgt aus: int photoResistorValue = analogRead(FOTOWIDERSTAND); int ledNum = map(photoResistorValue,0,1023,0,3 ); Hier nun der gesamte Sketch: #define LED_RED1 5 #define LED_RED2 4 #define LED_GRUEN 3 #define LED_BLAU 2 #define FOTOWIDERSTAND A1 int leds = {LED_RED1,LED_RED2,LED_GRUEN,LED_BLAU}; void setup() { pinMode(LED_RED1,OUTPUT); pinMode(LED_RED2,OUTPUT); pinMode(LED_GRUEN,OUTPUT); pinMode(LED_BLAU,OUTPUT); } void loop() { int photoResistorValue = analogRead(FOTOWIDERSTAND); int ledNum = map(photoResistorValue,0,1023,0,3 ); lightUpLed(leds); delay(250); } void lightUpLed(int pin){ resetLeds(); digitalWrite(pin, HIGH); } void resetLeds(){ for(int i=0;i 0){ disp = SPACE; } else { //Wenn die Temperatur kleiner als 0°C ist so soll ein Minuszeichen angezeigt werden. disp = NEGATIVE_SIGN; } //Jedes Zeichen in dem String mit dem Temperaturwert durchlaufen. for(int i = 0;i //Lesen des Zeichens an der Stelle i im String. //Als Rückgabe erhält man hier ein Zahlenwert aus der ASCII Tabelle. int pos = temp.charAt(i); //Ungültige Zeichen rausfiltern. //Im String gibt es unsichtbare, Steuerzeichen welche wir auf dem Display //nicht anzeigen möchten / können. if(pos != 3 && pos != 7 && pos != 13 && pos != 16 && pos != 46){ //Die Zahlen beginnen beim ASCII Wert 48 (48 = 0), somit ziehen wir von dem gelesenen Wert 48 ab //und erhalten unseren Index aus dem Array mit den Zahlenwerten für das Display. pos = pos - 48; disp = values; } } //Anzeigen der Temperatur auf dem Display. tm1636.display(disp); //eine kleine Pause 1500ms. delay(1500); } double readNTCValue(){ float analogValue = analogRead(PIN); float resistorValue = (MAX_ANALOG_VALUE / analogValue)- 1; resistorValue = ntcWiderstand / resistorValue; double kelvin = convert2TempKelvin(analogValue); double celsius = convertKelvin2TempCelsius(kelvin); return celsius; } double convert2TempKelvin(float value){ double temp = log(((10240000/value) - ntcWiderstand)); temp = 1 / (0.001129148 + (0.000234125 * temp) + (0.0000000876741 * temp * temp * temp)); return temp; } double convertKelvin2TempCelsius(double kelvin){ return kelvin - 273.15; } int8_t* displayValues(int temp){ } Video RealTimeClock DS1307 Auf dem Multifunktionalen Shield ist zusätzlich eine RealTimeClock vom Typ DS1307 verbaut. Die Schaltungen und Beispiele im Vorfeld zu diesem Kapitel habe ich mit dem Microcontroller Arduino Leonardo gemacht, jedoch benötigte ich für das betreiben der RTC DS1307 einen Arduino UNO. Das liegt vielmehr daran das auf dem Multifunktionalem Shield von Open-Smart die Pins für SDA & SCL auf den analogen Pin A4 bzw. analogen Pin A5 gelegt sind und dieses "nur" am Arduino UNO funktioniert. Bezug der benötigten Bibliotheken Zunächst einmal benötigen wir wieder eine Bibliothek welche uns die Arbeit mit der RTC Ds1307 erleichtert. In meinem Fall wähle ich die Bibliothek "DS1307RTC" von Paul Stoffregen welcher auf seinem GitHub Repository diese zum Download anbietet. Zusätzlich zur genannten Bibliothek benötigt man noch die Bibliothek "TimeLib" hier benutze ich wiederum die Bibliothek von Paul Stoffregen welche auch vom GitHub Repository heruntergeladen werden kann. Wenn beide Bibliotheken heruntergeladen und erfolgreich installiert wurden so kann mit der eigentlichen Programmierung begonnen werden. Der Bibliothek "DS1307RTC" liegen 2 sehr gute Beispiele bei welche ich im weiteren verwenden werde um die RTC am Arduino UNO zu betreiben.
Tumblr media
Beispiele zur Bibliothek "DS1307RTC" von Paul Stoffregen Programmieren der RTC DS1307 setzen der aktuellen Uhrzeit Für das setzen der aktuellen Uhrzeit kann man das Beispiel "SetTime" aus der Bibliothek "DS1307RTC" verwenden. #include #include #include const char *monthName = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; tmElements_t tm; void setup() { bool parse=false; bool config=false; //Setzen des Datums & der Uhrzeit von dem Zeitstempel //wann der Sketch kompiliert wurde. if (getDate(__DATE__) && getTime(__TIME__)) { parse = true; //Schreiben der Daten auf die RTC. //Da die RTC über eine Pufferbatterie verfügt wird sich dieser Wert //über einen langen Zeitraum "gemerkt". if (RTC.write(tm)) { config = true; } } Serial.begin(9600); //Warten das der serielle Ausgang bereitsteht. //Dieses kann besonders beim Arduino Leonardo etwas dauern. while (!Serial) ; delay(200); //kleine Pause von 200ms. //Wenn das parsen des Zeitstempels & das Schreiben auf der RTC erfolgreich waren dann... if (parse && config) { Serial.print("DS1307 configured Time="); Serial.print(__TIME__); Serial.print(", Date="); Serial.println(__DATE__); } else if (parse) { //Wenn nur das parsen des Zeitstempels erfolgreich war dann... Serial.println("DS1307 Communication Error :-{"); Serial.println("Please check your circuitry"); } else { //andernfalls soll eine Fehlermeldung auf dem seriellen Ausgang ausgegeben werden. Serial.print("Could not parse info from the compiler, Time=\""); Serial.print(__TIME__); Serial.print("\", Date=\""); Serial.print(__DATE__); Serial.println("\""); } } void loop() { //bleibt leer } //Liefert true wenn das Parsen der Uhrzeit erfolgreich war. bool getTime(const char *str){ int Hour, Min, Sec; //befüllen der Variablen für Stunde, Minute und Sekunde aus dem übergebenen String. //Als Rückgabe erhält man eine ganze Zahl welche die Anzahl verarbeiteten Variablen repräsentiert. //In diesem Fall müssen 3 Variablen verarbeitet werden, wenn dieses nicht so ist wird die Methode //false zurück liefern. if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3){ return false } tm.Hour = Hour; tm.Minute = Min; tm.Second = Sec; return true; } //Liefert true wenn das Parsen des Datums erfolgreich war. bool getDate(const char *str){ char Month; int Day, Year; uint8_t monthIndex; //befüllen der Variablen für Monat, Tag und Jahr aus dem übergebenen String. //Als Rückgabe erhält man eine ganze Zahl welche die Anzahl verarbeiteten Variablen repräsentiert. //In diesem Fall müssen 3 Variablen verarbeitet werden, wenn dieses nicht so ist wird die Methode //false zurück liefern. if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3){ return false; } for (monthIndex = 0; monthIndex if (strcmp(Month, monthName) == 0) break; } //Wenn der Index des Monats größer, gleich 12 ist dann soll false zurück geliefert werden. //Die Monate beginnen immer mit dem Index 0 (0=Januar, ..., 11=Dezember) if (monthIndex >= 12){ return false; } tm.Day = Day; tm.Month = monthIndex + 1; tm.Year = CalendarYrToTm(Year); return true; } auslesen der Uhrzeit Die RTC verfügt über eine Pufferbatterie, diese Batterie befindet sich unter der 4fach 7 Segmentanzeige.
Tumblr media
RTC DS1307 Pufferbatterie auf dem Multifunktionalem Shield von Open-Smart Die Pufferbatterie sorgt dafür das die einmal gesetzte Zeit gespeichert wird und fortgezählt wird somit ist beim nächsten starten des Arduinos kein erneutes setzen der Uhrzeit notwendig. #include #include #include void setup() { //Beginn der seriellen Kommunikation mit 9600 baud. Serial.begin(9600); //Warten darauf das der Serielle Ausgang bereit ist. //Dieses kann beim Arduino Leonardo etwas länger dauern. while (!Serial) ; delay(200); //eine kleine Pause von 200ms. Serial.println("DS1307RTC Read Test"); Serial.println("-------------------"); } void loop() { tmElements_t tm; //Wenn Daten von der RTC erfolgreich gelesen wurden dann... if (RTC.read(tm)) { Serial.print("Ok, Time = "); print2digits(tm.Hour); //Stunde ausgeben Serial.write(':'); print2digits(tm.Minute); //Minute ausgeben Serial.write(':'); print2digits(tm.Second); //Sekunden ausgeben Serial.print(", Date (D/M/Y) = "); Serial.print(tm.Day); //Tag ausgeben Serial.write('/'); Serial.print(tm.Month); //Monat ausgeben Serial.write('/'); Serial.print(tmYearToCalendar(tm.Year)); //Jahr ausgeben Serial.println(); } else { //Wenn keine Daten gelesen wurden, so soll eine Meldung ausgegeben werden. if (RTC.chipPresent()) { //Wenn eine RTC erkannt wurde dann... Serial.println("The DS1307 is stopped. Please run the SetTime"); Serial.println("example to initialize the time and begin running."); Serial.println(); } else { //Wenn keine RTC erkannt wurde dann... Serial.println("DS1307 read error! Please check the circuitry."); Serial.println(); } delay(9000); //Pause von 9sek. } delay(1000); //Pause von 1sek. } //Wenn die Zahl kleiner als 10 ist so soll eine führende 0 hinzugefügt werden. void print2digits(int number) { if (number >= 0 && number Serial.write('0'); } Serial.print(number); }   Read the full article
0 notes