Für ein Schulprojekt hatte ich einige Ardunio kompatible Boards in China gekauft. Liefen bis immer problemlos.
Blos bei diesem hier habe ich erstmal ein blödes Gesicht gemacht. Ein Blick mit der Lupe auf den Chip sagte mir alles.
Hier wurde kein Atmega 328p verbaut sonder ein AVAG328P aus China.
Einmal kurz Google zur Hilfe genommen. und Problem gelöst.
Der CH340 ist in Windows 10 enthalten und wird automatisch installiert. Falls nicht Frau Google fragen.
Bitte neueste Arduino IDE verwenden. z. Z. 1.8.8
Die Software für die CPU bitte hier downloaden und entpacken.
Dann das verzeichnis Libraries und Hardware nach
c:\user\deinname\documents\Arduino kopieren.
Arduino IDE neu starten. WAVGAT im Boardmanager zuweisen. Auch an den richtigen Port denken.
Sollten beim Compilieren noch Warnings auftreten, dann die entspechende Platform.txt patchen. (....... /dokuments/arduino/hardware/avr
Anstatt:
recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{build.path}/{archive_file}" "{object_file}"
kommt jetzt:
recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{archive_file_path}" "{object_file}"
Dann habe ich festgestellt das der Chip einen 12bit AD-Wandler hat.
Bei 5V ist der AD dann 2540
Sketches die dort eine Division durch 1024 machen müssen dann auf 2540 geändert werden.
MQ 5 ist für Propan Butan bzw LPG für Flüssiggas. Der Sensor reagiert auch auf Alkohol Kohlenmonoxyd Erdgas und Rauchgase, aber für diese
Gase gibt es andere Sensoren.gibt es andere.
Ganz einfach wie im Bild anschliessen. GND, +5V und A0. Wozu D0 ist hab ich noch nicht rausgefunden.
Die rote LED sollte leuchten , die grüne kann. Das Poti dient der Kalibrierung. Einfach soweit dehen bis die grüne LED erlischt, dann hat man den Schwellpunkt.
Mit einem Gasfeuerzeug ohne Flamme testen. Die Grüne LED sollte jetzt leuchten
In der seriellen Ausgabe des Arduino sieht man einen deutlichen Anstieg des Analogen Wertes.
Zur exakten Anzeige in PPM muss eine Referenzmessung mit einer bekannten Grösse gemacht werden.
Wie man das macht hab ich noch nicht raus. Man kann aber feststellen das etwas da ist und wenn was da ist dann ist was undicht. Das sollte reichen um diversere Leitungen und Schläuche auf Dichtigkeit zu prüfen.
Man könnte den Sketch etwas ändern und beim Anstieg des AD Wertes einen Buzzer piepen lassen. Prima Warnung für Wohnwagenbesitzer.
Hier ein einfacher Sketch zum testen.
///Arduino Sample Code
void
setup()
{
Serial.begin(9600);
//Set serial baud rate to 9600 bps
}
void
loop()
{
int
val;
val=analogRead(0);Read Gas value from analog 0
Serial.println(val,DEC);
//Print the value to serial port
delay(100);
}
Das Breakout ist geauso aufgebaut wie das für den MQ5 lediglich der Sensor ist speziel für das gefährliche Kohlelnmonoxyd ausgelegt.
Der Sketch ähnelt dem des MQ5 wertet aber den Digitalwert mit aus, der bei Schwellwert auf High wechselt.
/* MQ-7 Carbon Monoxide Sensor Circuit with Arduino */
const int AOUTpin=0;//the AOUT pin of the CO sensor goes into analog pin A0 of the arduino
const int DOUTpin=8;//the DOUT pin of the CO sensor goes into digital pin D8 of the arduino
const int ledPin=13;//the anode of the LED connects to digital pin D13 of the arduino
int limit;
int value;
void setup() {
Serial.begin(9600);//sets the baud rate
pinMode(DOUTpin, INPUT);//sets the pin as an input to the arduino
pinMode(ledPin, OUTPUT);//sets the pin as an output of the arduino
}
void loop()
{
value= analogRead(AOUTpin);//reads the analaog value from the CO sensor's AOUT pin
limit= digitalRead(DOUTpin);//reads the digital value from the CO sensor's DOUT pin
Serial.print("CO value: ");
Serial.println(value);//prints the CO value
Serial.print("Limit: ");
Serial.print(limit);//prints the limit reached as either LOW or HIGH (above or underneath)
delay(100);
if (limit == HIGH){
digitalWrite(ledPin, HIGH);//if limit has been reached, LED turns on as status indicator
}
else{
digitalWrite(ledPin, LOW);//if threshold not reached, LED remains off
}
}
Mifare RFID zum lesen und beschreiben von ID Cards und Dongles.
Anschlüsse von Links nach rechts
SDA (SS), SCK, Mosi, Miso, Not used, GND, RST, 3.3V
Bei Arduino Uno, Nano, Micro wird MOSI an Pin 11, MISO an Pin 12, SCK an Pin 13
SDA bzw. SS an Pin 10 (Configurable) und RST an Pin 9 (Configurable) angeschlossen.
SS und RST sind konfigurierbar, die Pins müssen im Sketch angeben werden.
Wenn alles korrekt angeschlossen und die Library installiert ist, dann könnt ihr loslegen.
Als erstes am besten mit dem DumpInfo, da wird der Inhalt der Karte komplett über Seriallprint ausgegeben.
Achtung bei den beigefügten Karten und Dongles lässt sich die UID nicht ändern
Die Sketche zum lesen und schreiben funktionieren wie beschrieben.
Ich selbst habe ein Progrämmchen gemacht das man als Türöffner verwenden könnte.
Es wird eine voreingestellte UID mit der gelesenen verglichen. Der Status Grün oder rot über ein RGB LED angezeigt. Achtung SS und RST wie in meinem Sketch anschliessen oder Sketch ändern
Die Library und Testsketches könnt Ihr hier downlowden.
/*UID lesen und mit gespeicherter vergleichen
LEd blau=Leser wartet, Led Rot=vergeigert, Led gün =OK
getestet 03.2015*/
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 9// so anschliessen
#define RST_PIN 5//so anschliessen
MFRC522 mfrc522(SS_PIN, RST_PIN);
byte soll[4]={
0x81, 0xAA, 0x2C, 0x61};//UID für den Vergleich
byte inhalt[4];
int ledgruen=2;
int ledblau=3;
int ledrot=4;
void setup()
{
Serial.begin(9600);
Serial.println("Leser bereit !");
Serial.println(" ");
SPI.begin();
mfrc522.PCD_Init();
pinMode(ledrot, OUTPUT);
pinMode(ledblau, OUTPUT);
pinMode(ledgruen, OUTPUT);
digitalWrite(ledblau, HIGH);
digitalWrite(ledrot, HIGH);
digitalWrite(ledgruen, HIGH);
}
void loop() {
// Look for new cards
digitalWrite(ledblau, LOW);
digitalWrite(ledrot, HIGH);
digitalWrite(ledgruen, HIGH);
if ( ! mfrc522.PICC_IsNewCardPresent())
return;
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial())
return;
// Show some details of the PICC (that is: the tag/card)
Serial.print("Start ");
digitalWrite(ledblau, HIGH);
digitalWrite(ledrot, LOW);
Serial.println();
Serial.print("PICC type: ");
byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
Serial.println(mfrc522.PICC_GetTypeName(piccType));
// Check for compatibility
if ( piccType != MFRC522::PICC_TYPE_MIFARE_MINI
&& piccType != MFRC522::PICC_TYPE_MIFARE_1K
&& piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
Serial.println("This sample only works with MIFARE Classic cards.");
return;
}
for (byte i = 0; i < 4; i++) {
//Serial.print(mfrc522.uid.uidByte[i],BIN);
inhalt[i]=(mfrc522.uid.uidByte[i]);
}
int open=0;
for (byte i = 0; i < 4; i++) {
if (soll[i] == inhalt[i] ){
open =open+1;
}
}
if (open==4){
digitalWrite(ledrot, HIGH);
digitalWrite(ledgruen, LOW);
}
else
{
digitalWrite(ledrot, LOW);
digitalWrite(ledgruen, HIGH);
}
delay (1000);
}
Man braucht nur ein paar Teile.
Der Aufbau ist in 3 Schritten beschrieben. Grundschaltung, IO, und Betriebspannung. Wer die 3,3V nicht benötigt und oder fertig programmierte Chips einsetzt kann noch einfacher bauen.
Lochrasterplatine 1 Quarz 16Mhz 2 Keramikkondensatoren 22pf 50V 1 10kOhm 1/4 Watt 2 Kondensatoren 100nf 63V (0,1µf) 1 Pinheader female 40pol. 1 IC Sockel 24pol. 1 Atmega328p 1 Kleinsttaster
|
1 DC Einbaubuchse 4 Dioden 1N4007 1 Spannungsregler 5V 1 LM317K für 3,3V 1 Widerstand 330Ohm 1 Widerstand 470 Ohm 1 Widerstand 150 Ohm 1 Wannenstecker 10pol. |
Platine und Pinheader zuschneiden und verlöten. Die Bauteile montieren und wie im Bild anschliessen. Die Pinheader sind nicht teilbar. Beim teilen geht immer ein Anschluss kaputt. Ich habe die Platine bewusst länger gelassen, weil vorn noch ein paar Teile draufkommen, die höher sind und die drüberliegenden Shields stören.
Dieses Bild zeigt die Anschlüsse der IO-Pins. Mann könnte auch noch die Anschlüsseanlog 4 und 5 mit den Anschlüssen oben Links verbinden. Das und der doppelte 5V Anschluss ist die eigenliche Änderung zum Arduino R3. Das hat man gemacht um Shields auch für andere Arduino-Platinen kompatibel bauen zu können.
Wer wie die meisten die 3,3V nicht braucht kann jetzt zB. Eine Buchse einbauen und die Schaltung über ein stabilisiertes Netzteil betreiben.
Ganz einfach mit einem stabilisierten
|
Hier kann man mit einem 9-15VNetzteil rein. Es ist eine Gleichrichtung und ein 5V Regler verbaut. Durch die Dioden ist der Eingang gegen Verpolung geschützt. Es kann auch eine Wechselspannung eingespeist werden. |
Hier mit 3,3V Erweiterung wird nur selten gebraucht.
Der Widerstand links vom Regler hat 330Ohm der daneben 470. Die Spannung beträgt ca. 3,1V. Das funktioniert und ist getestet. Wer genau 3,3V haben will muss mit Hilfe der Datenblätter rechnen und andere Widerstände nehmen. Es gibt auch Regler für 3,3V, wenn ich die getestet habe werde ich die Schaltung ändern.
|
ganz einfach über einen vorhandenen Arduino und dann den Chip umstecken.
Oder per FTDI Adapter an Arduino. Das geht aber nur wenn ein Bootloader installiert ist. Die von mir gelieferten Bausätze haben einen.
Bootloader installieren und auch programmieren geht auch mit dem USBasp von fischl.de
Dieses Programmiergerät habe ich nach der Anleitung von Herrn Fischl gebaut.
Es funktioniert. Für Newcommer ist aber das Problem mit dem Huhn und dem Ei da. Man benötigt ein Programmiergerät um das Programmiergerät nachzubauen. Es gibt ganz einfache Kabel die man an den Paralellport des PC´anschliessen kann. Ich rate davon ab weil es immer weniger PC´s mit diesem Port gibt und auch Software die das unterstützt wird immer seltener.
Herr Fischl bietet einen auch fertig programmierten Bausatz an.
Um ohne Bootloader die Arduinosoftware zu programmieren, muss unter Tools der USBasp ausgewählt werden und statt auf Upload dann auf Upload mit Programmer klicken
Ideal wenn man andere Atmegas flashen möchte wie Atmega 85 oder 16 oder 32.
Dieses Bild zeigt die Verkabelung für den ISP (In System Programmer). Den Resetknopf hatte ich auf den anderen Bildern vergessen.
Über den ISP-Anschluss kann man den Bootloader brennen oder den Arduino, der ja eigentlich ein Atmega328p ist in einer ander Programmierumgebung flashen.
Bei einem neuen Atmega ist werkseitig der interne Oszilator auf, glaub ich 2Mhz eingestellt. Die Anschlüsse für den Quarz können noch als IO Pins genutz werden. 16Mhz oder auch genau Oszillatorfrequenzen bekommt man nur mit einem Quarz hin. Dazu muss die Konfiguration des Chips über die Fusebits geändert werden.
Um einen Bootload noch zu instllieren und vor überschreiben zu schützen sind weiteren Änderungen nötig.
Hier der AVR-Dude und eine Batchdatei zum download. Es ist das Programmiergerät von Fisch eingetragen.
Während der Installation muss der Quarz angeschlossen sein. Hinterher läuft der CHip nicht mehr ohne Quarz.
Hier die fertige Zeile zum setzen der Fuse und Lockbits :
avrdude -p m328p -c USBasp -U hfuse:w:0xda:m -U lfuse:w:0xff:m -U efuse:w:0x05:m -U lock:w:0x0f:m
Für die jüngeren, die den Umgang mit Kommandozeilen nicht mehr kennen gibt es für den AVR-Dude zusätzliche noch eine grafische Benutzeroberfläche. Das ist der Burn-O-mat. Hier downloaden.
Anschluss siehe Bild, ganz einfach.
Pin 1 und 2 an den Quarz, Pin 3 Batterie +
Pin 4 Masse PIN 5 und 6 an Arduino wie im Bild. PIN 7 Clock out, hier nicht beschaltet. Pin 8 +5V ohne die geht es nicht.
Das Programm benutzt schon mein 3 Draht LCD Display. Also bitte dem Libaryeintrag ändern. Oder ganz rausnehmen. Die Befehle sind dann von lcd.print auf serialprint zu ändern für eine Ausgabe auf den Seriallen Monitor. Weiterhin kann man auf <10 abfragen und dann bei den Zahlen eine Vorlaufnull erzeugen. Beispiele gibt es im Netz genug.
//Arduino 1.0+ Only
//Arduino 1.0+ Only
#include "Wire.h"
#define DS1307_ADDRESS 0x68
#include <LiquidCrystal595.h>
LiquidCrystal595 lcd(7,8,9); // datapin, latchpin, clockpin
byte zero = 0x00; //workaround for issue #527
void setup(){
Wire.begin();
Serial.begin(9600);
lcd.begin(16,2);
lcd.clear();
// setDateTime(); //MUST CONFIGURE IN FUNCTION
}
void loop(){
printDate();
delay(1000);
}
/*void setDateTime(){
byte second = 45; //0-59
byte minute = 34; //0-59
byte hour = 12; //0-23
byte weekDay = 1; //1-7
byte monthDay = 3; //1-31
byte month = 3; //1-12
byte year = 13; //0-99
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero); //stop Oscillator
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(decToBcd(weekDay));
Wire.write(decToBcd(monthDay));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.write(zero); //start
Wire.endTransmission();
}*/
byte decToBcd(byte val){
// Convert normal decimal numbers to binary coded decimal
return ( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val) {
// Convert binary coded decimal to normal decimal numbers
return ( (val/16*10) + (val%16) );
}
void printDate(){
// Reset the register pointer
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
int second = bcdToDec(Wire.read());
int minute = bcdToDec(Wire.read());
int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
int monthDay = bcdToDec(Wire.read());
int month = bcdToDec(Wire.read());
int year = bcdToDec(Wire.read());
//print the date EG 3/1/11 23:59:59
lcd.setCursor(0,1);
lcd.print(month);
lcd.print("/");
lcd.print(monthDay);
lcd.print("/");
lcd.print(year);
lcd.setCursor(0,2);
lcd.print(" ");
lcd.print(hour);
lcd.print(":");
lcd.print(minute);
lcd.print(":");
lcd.println(second);
}
Der Arduino hat einem 10Bit A/D Wandler mit 6 analogen Eingängen . Mit 10Bit kann er also eine Spannungen zwischen 0 und 5 Volt in einen digitaler Wert zwischen 0 und 1023 wandeln . Aus 5Volt werden also 1024 Einzelschritte. Wenn man jetzt 5V durch 1024 dividiert erhält man 0,004883 gerundet. Das ist der Abstand der Einzelschritte.
Der LM35 hat einen Messbereich von 0 - 100°C der am mittlerem Pin als Spannung in 0,01V Schritten /°C ausgegeben wird. 5°C sind also 0,05V oder 28°C sind dann 0,280 V.
Zur Programmierung:
Ergebnis = analogRead(0)
Bei 28 °C wäre Ergebnis = 57
Temperatur = Ergebis *5 /1024
Tempreatur wäre 0,2783
Temperatur = Temperatur * 100
Ich muss das mit dem Komma ja noch hinbiegen.
Alles zusammengefastt in einer Zeile wäre dann
Ergebnis = analogRead(0) *5 / 1024*100
Mit Hilfe der Gleitkommafunktion des Ardunios kommt man auf ein sehr genaues Ergebnis. Der LM35 kann aber nur auf 0,5 °C genau messen.
Häufig gibt es Schwankungen von mehreren Grad von Messung zu Messung. Einige haben Klimmzüge gemacht und messen 20 mal und errechen dann den Durchschnitt. Ich habe heute mal einen Kerko 100nf direkt am LM35 angelötet. Jetzt misst das Ding genau. Die Messung funktioniert auch nur genau wenn die Betriebspannung geanu 5V ist. Bei Abweichungen sollte man auf die interne Referenzspannung zugreifen. Beim Atmege 328 sind das 1,1V . Die Formal zur Berechnung ist demenstprechend zu ändern.
Achtung externe Referenzspannung und Spannung von über 5V an den Eingängen lassen den Arduino in Rauch aufgehen
( Garantieverlust)
Vertauschen sie plus und minus nicht, dann werden die Dinger heiss.
Negative Temperaturen messen ist mit mehreren Klimmzügen möglich. Einfacher ist es aber mit einem LM335Z oder 1Wire Termometer wie zb. das 18B20.
Ja so einfach ist es.
Laden Sie bei Arduino die Software für Ihren PC runter und speichern Sie ihn in einem Verzeichnis.
Hier gibt es die Software http://www.arduino.cc/
Entpacken Sie die Software im Verzeichnis.
Schließen Sie den Arduino über ein USB Kabel an.
Der Rest geht automatisch.
Falls nicht dann geht es so !
Der DS18b20 ist ein 12Bit Temperatursensor mit 1Wirebus. Im Gegenteil zu anderen wie z.B LM35 kann aus ihm die gemessene Temperatur direkt ausgelesen werden. Zusätzlich speichert er die min. und die max. Temperatur sowie hat eine programmirbare Alarmfunktion. Die Spannungsversorgung erfolg über die Datenleitung kann aber auch über den 3. Anschluß erfolgen, Im 1Wirebus ist es möglich mehrere Sensoren an einem Bus getrennt von einander auszulesen. Ideal für Haussteuerungen.
Mit dem 18b20 kann die Temperatur mit 9 - 12 Bit ausgewertet werden was 0,0625°C enstpricht. Der in vielen Beiträgen beschriebene DS18S20 kann nur 9Bit was nur 0,5°C entspricht. Hier wird viel von den Authoren im Internet verwechselt und auch falsch beschrieben.
Sollen mehr als nur ein Sensor angeschlossen werden so geschieht das parallel zum 1. . Der Widerstand ist dann nicht mehr erforderlich. Die einzelenen Sensoren werden dann anhand der Seriennummern identifiziert.
Der 1Wire Bus lässt sich als Bus, Stern oder auch Baumstruktur Installiern.
Als Bus sind 300m mögkich, anders sind es immer noch 100m.
Projekt Digitaluhr mit Arduino Uno und DS1307
Den Bau des LCD-Shield mit nur 3 Pin sowie die Realtimeclock DS1307 habe ich bereits schon beschrieben.In diesem Projekt wurden die fertigen Shields dann nur noch zusammengesteckt. Das Programm habe ich erweitert so das sich die Uhr auch stellen lässt.
Die Schaltung des Keypads habe ich bereits erläutert. Der Befehl anlogRead liefert je nach gedrückten Knopf einen anderen Wert. Im anhängenden Listing frage ich im Loop ab, ob überhaupt ein Knopf gedrückt wurde. Wenn ja springt das Programm in die Setroutine und erhöht den Inhalt der zugehörigen Varible um 1 gemäß dem dem Wert von analogRead. Da der Wert ungenau ist und sich verändert habe ich nochmal durck 10 geteilt. Dann funktioniert es sicher.
Bei Nachbau oder Verwendung eines gekauften Shields müssen die Werte eventuell im Programm etwas angepasst werden. Leider ist für das Jahr ein Knopf zu wenig. Ich habe mir weitergeholfen in dem ich um das Jahr zu stellen eine Drahtbrücke von GND nach Digital 0 setzte. Der Taste für Minute setzt dann das Jahr um 1 vor.
Hier das Listing.
//Arduino 1.0+ Only
//Arduino 1.0+ Only
//aktuelle Version vom 31.03.2013 Johannes Krumm
#include "Wire.h"
#define DS1307_ADDRESS 0x68
#include <LiquidCrystal595.h>
LiquidCrystal595 lcd(7,8,9); // datapin, latchpin, clockpin
byte zero = 0x00; //workaround for issue #527
byte wert = 0;
void setup(){
Wire.begin();
Serial.begin(9600);
lcd.begin(16,2);
lcd.clear();
// setDateTime(); //MUST CONFIGURE IN FUNCTION
}
void loop(){
printDate();
delay(1000);
// Hier werden die Tasten abgefragt und deren Wert angezeigt. Sprung nach Settime
if (analogRead(0)<1010){settime();lcd.setCursor(9,0);lcd.print(analogRead(0));}else {lcd.setCursor(9,0);lcd.print(" ");}
}
// Wenn dieser Teil auskommentier ist wird die Zeit gesezt. Nach dem ersten setzten muss diese Teil
// wieder einkommentiert werden, sonst wird die Zeit nach jedem Reset oder Start wieder so zurückgesetzt.
// Der auskommentierte Teil kann auch ganz geloescht werden. Die Zeit lässt sich ja per Taste setzen.
/*void setDateTime(){
byte second = 45; //0-59
byte minute = 10; //0-59
byte hour = 22; //0-23
byte weekDay = 6; //1-7
byte monthDay = 23; //1-31
byte month = 3; //1-12
byte year = 13; //0-99
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero); //stop Oscillator
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(decToBcd(weekDay));
Wire.write(decToBcd(monthDay));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.write(zero); //start
Wire.endTransmission();
}*/
byte decToBcd(byte val){
// Convert normal decimal numbers to binary coded decimal
return ( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val) {
// Convert binary coded decimal to normal decimal numbers
return ( (val/16*10) + (val%16) );
}
void printDate(){
// Reset the register pointer
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
int second = bcdToDec(Wire.read());
int minute = bcdToDec(Wire.read());
int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
int monthDay = bcdToDec(Wire.read());
int month = bcdToDec(Wire.read());
int year = bcdToDec(Wire.read());
//print the date EG 3/1/11 23:59:59
lcd.setCursor(0,1);
if (monthDay<10)
{lcd.print("0");}
lcd.print(monthDay);
lcd.print(".");
lcd.print(month);
lcd.print(".");
lcd.print(year);
lcd.setCursor(0,0);
if (hour < 10) // correct hour if necessary
{
lcd.print("0");
lcd.print(hour);
}
else
lcd.print(hour);
lcd.print(":");
if (minute < 10) // correct minute if necessary
{
lcd.print("0");
lcd.print(minute);
}
else
lcd.print(minute);
lcd.print(":");
if (second < 10) // correct second if necessary
{
lcd.print("0");
lcd.print(second);
}
else
lcd.print(second);
switch (weekDay) // Ausgabe des Wochentages
{
case 1:
lcd.setCursor(8,1);
lcd.print("Montag ");
break;
case 2:
lcd.setCursor(8,1);
lcd.print("Dienstag");
break;
case 3:
lcd.setCursor(8,1);
lcd.print("Mittwoch");
break;
case 4:
lcd.setCursor(8,1);
lcd.print("Donnerst");
break;
case 5:
lcd.setCursor(8,1);
lcd.print("Freitag ");
break;
case 6:
lcd.setCursor(8,1);
lcd.print("Samstag ");
break;
case 7:
lcd.setCursor(8,1);
lcd.print("Sonntag ");
break;
}
}
void settime(){
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
int second = bcdToDec(Wire.read());
int minute = bcdToDec(Wire.read());
int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
int monthDay = bcdToDec(Wire.read());
int month = bcdToDec(Wire.read());
int year = bcdToDec(Wire.read());
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero); //stop Oscillator
if (analogRead(0)/10==0){minute=minute+1; if (minute>=60){minute=0;}}
if (analogRead(0)/10==14){hour=hour+1; if (hour>=24){hour=0;}}
if (analogRead(0)/10==33){month=month+1; if (month>=12){month=0;}}
if (analogRead(0)/10==50){monthDay=monthDay+1; if (monthDay>=31){monthDay=0;}}
if (analogRead(0)/10==74 and digitalRead(0)!=LOW){weekDay=weekDay+1; if (weekDay>=8){weekDay=0;}}
if (analogRead(0)/10==74 and digitalRead(0)== LOW){year=year+1;if (year>30){year=0;} }
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(decToBcd(weekDay));
Wire.write(decToBcd(monthDay));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.write(zero); //start
Wire.endTransmission();
}
Aufpassen: Es werden zwei ähnliche Module abgeboten. Der hier beschriebene HC-SR04 hat 4 Pins. 5V GND Trig und Masse.
Auf de Arduino Seiten findet man ohne grosses suchen einen Anschlussplan und einen Test-Sketch der Entfernung misst und über serialPrint ausgibt
Wer schon in den Exampels rum gesucht hat wird wird auch das Progrämmchen zur Tonerzugung gefunden haben. Es wäre doch mal eine schöne Aufgabe den Rückwärtspiepser zu programmieren.
Die Funktion ist anhand des Zeitdiagramms leicht zu verstehen.