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}"

awavgat

 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.

MQ5 Propan Lq5 Sensor am Arduino

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

MQ7 CO Sensor

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
}
}

 
 

 

 

rc522Mifare 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);

}

 
 

Arduino Selbstbau auf Lochraster.

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 Elko 22 - 100µf

 1 Widerstand 330Ohm

 1 Widerstand 470 Ohm

 1 Widerstand 150 Ohm
 1 LED Grün

 1 Wannenstecker 10pol.

 

 

Arduino Selbstbau auf Lochraster

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.

 

 

 

Selbstbau Arduino IO Verkabelung

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.

 

 

Spannungsversorgung

 

Ganz einfach mit einem stabilisierten
Netzteil.

Aduino basteln von Johannes Krumm

Hier kann man mit einem 9-15VNetzteil rein.
Es ist eine Gleichrichtung und ein  5V Regler verbaut.

 Ardunionachbau mit 5V Spanungsversorgung

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.

Arduino Nachbau mit 5V und 3,3 Volt Spannungsversorgung.

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.

Programmierung,

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 USBasp Eigenbau

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 mit der Arduinosoftware zu programmieren, muss unter Tools der USBasp ausgewählt werden und statt auf Upload dann auf Upload mit Programmer klicken.

 

Selbstbauarduino mit ISP Anschluss

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.

 

Bootloader installieren und Fusebits setzen.

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.

 

Temperatur mit LM35 messen.

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.

Thermometer mit LM35 gebaut von Johannes KrummDer 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)

lm35dz


Vertauschen sie plus und minus nicht, dann werden die Dinger heiss.

Testprogramme unter dem Menupunkt Temperatur richtig messen.

 

Negative Temperaturen messen ist mit mehreren Klimmzügen möglich. Einfacher ist es aber mit einem LM335Z oder 1Wire Termometer wie zb. das  18B20.

 
 

Auspacken einschalten geht

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.

DS18B20DS18b20anschluss

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.

 

 

 

 

 

 

 

Termometerprogramm als Beispiel.

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.

Uhrfertig 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.Uhrvonoben

 

//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.

HC-SR04

  1. Betriebspannung: 5V DC
  2. Ruhestromt: <2mA
  3. Abstrahlwinkel: <15°
  4. Messbereich: 2cm – 500 cm
  5. Auflösung: 1 cm
  6. Ultrasonic Frequency: 40kHz

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.

 

hc-sr04diagramm

Die Funktion ist anhand des Zeitdiagramms leicht zu verstehen.

  • Setzte den "Trigger Pin" am Sensor für 10µs auf high. Dadurch wird die Sensorfunktion gestartet.
  • 8 40kHz Impulse werden gesendet Der Echopin geht nach dem senden von low auf high.
  • Der 40Khz Ton wird vom nächsten Objekt Refelktiert.
  • Wenn der Sensor ein Echo empfängt wechselt der "Echopin" auf Low.
  • Die Distance zum Object wird aus der länge der Zeit berechent in der der Echopin high ist.
  • Wird er Ton nicht von einem Hindernis reflektiert. Dann geht der Echopin nach 38ms auf low. (Timeout)




     
 

Vergest den Beitrag nehmt einen EPS8266 oder Wemos D1 mini. Alles drauf billiger und läuft in der ArduinoIDE

Mit Arduino ins Netzwerk oder sogar ins Internet kein Problem.

In den Beisplielen muss lediglich die IP-Adresse an Euer Netzwerk angepasst werden.
Auch die MAC-Adresse wird über das Programm gesetzt (Das hat mich überrascht). Es muss darauf geachtet werden, das sie genau wie die IP nicht schon mal im Netztwerk existiert.
In den Examples unter Ethernet ist das Programm "Webserver"  Es gibt den Wert der Analogschnittstellen  in HTML aus.
Weiterhin in den Examples unter SD ein Programm, mit dem sich die SD-Karte (nicht im Lieferunfang) testen lässt.
Ethernetshield für Arduino


Hier vorab ein Programm mit dem sich ein Led an Digital 8 ein und ausschalten lässt.  Die Libary ist in dem Standarddownload von der Arduinoseite enthalten. 

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1, 177);

EthernetServer server(80);

void setup()
{
  Serial.begin(9600);    
  pinMode(8, OUTPUT);    
  Ethernet.begin(mac, ip);
  server.begin();
}

void loop()
{
 
  EthernetClient client = server.available();
  if (client) {
    boolean currentLineIsBlank = true;
    String buffer = "";  
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.print(c);   
        buffer+=c;       
        if (c == '\n' && currentLineIsBlank) {
          
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();

          if (digitalRead(8)){  
            client.print(" LED is <font color='red'>OFF</font>");
          }else{
            client.print(" LED is <font color='green'>ON</font>");
          }
          client.println("<br />");
          
          
          client.print("<FORM action=\"http://192.168.1.177\" >");
          client.print("<P> <INPUT type=\"radio\" name=\"status\" value=\"0\">Off");
          client.print("<P> <INPUT type=\"radio\" name=\"status\" value=\"1\">On");
          client.print("<P> <INPUT type=\"submit\" value=\"Submit\"> </FORM>");
            
          break;
        }
        if (c == '\n') {
          
          currentLineIsBlank = true;
          buffer="";       
        } else if (c == '\r') {            
          if(buffer.indexOf("GET /?status=0")>=0)
            digitalWrite(8,HIGH);  
          
          if(buffer.indexOf("GET /?status=1")>=0)
            digitalWrite(8,LOW);  
        }
        else {
          
          currentLineIsBlank = false;
        }
      }
    }
    
    delay(1);
    
    client.stop();
  }
}

Das Funktioniert im lokalem Netztwerk. Um den Zugriff übers Internet zu ermöglichen muss der Port ( meistens) 80 auf die dem Ethershield zugeordnete IP-Adresse geroutet werden. Findet man bei einigen Routern unter Firewalleinstellungen oder virtuell Server.
Da die meisten von Euch ja die öffentliche IP-Adresse von Ihrem Provider dynamisch zugewiesen bekommen, muss hier auch noch Dyn Dns aktiviert werden.

Leider ist der amerikanische DynDns.org nicht mehr kostenlos.
Wenn ich eine Lösung gefunden habe teile ich das hier mit.

 

 

 

 

Ethershield 1.1 Yes it works.

Es wird noch ein anderes Ethershield angeboten für das es eine andere Libary gibt.

#include "etherShield.h"
#include "ETHER_28J60.h"

static uint8_t mac[6] = {
  0x54, 0x55, 0x58, 0x10, 0x00, 0x24};                                                     
static uint8_t ip[4] = {
  192, 168, 1,15};
static uint16_t port = 80;

ETHER_28J60 e;
int ledPin = 5;
void setup()


{
  pinMode(ledPin, OUTPUT);
  e.setup(mac, ip, port);
  analogReference(INTERNAL);
  Serial.begin(9600);
}

void loop()
{
  float analog = analogRead(0);
  float temp = (analog * 1.1/1024*100);
  delay(10);
  char celsius[4];
  dtostrf(temp,4,1,(celsius));


  if (e.serviceRequest())
  {
    e.print("<html><head><title>Temperatur TEST</title><meta http-equiv='Refresh' content='1'></head><body>");
    e.print("<h2><center>Temperatur in Celsius: ");
   
    e.print (celsius);
    e.print("<br>");
    e.print("<br>LED ein bei 26");
    if (temp >= 26) {
      digitalWrite(ledPin,HIGH);
      e.print("<br><img src='http://ebay.jkrumm.de/lichtan.png'></img>");
      }
    else {
      digitalWrite(ledPin,LOW);
      e.print("<br><img src='http://ebay.jkrumm.de/lichtaus.png'></img>");
          
    }
    e.respond();
  }
  if (temp >= 26) {
    digitalWrite(ledPin,HIGH);
  }
  else {
    digitalWrite(ledPin,LOW);
  }


  delay(10);
}


 

 

Hier ein Sketch der einen LM35 auswertet, abhängig von der Temperatur ein Led ein und ausschaltet.

 

 

 

 

 

 

 

 

 

smr200