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