/***************************************************************************
This is a library for the BMP280 humidity, temperature & pressure sensor
Designed specifically to work with the Adafruit BMP280 Breakout
----> http://www.adafruit.com/products/2651
These sensors use I2C or SPI to communicate, 2 or 4 pins are required
to interface.
Adafruit invests time and resources providing this open source code,
please support Adafruit andopen-source hardware by purchasing products
from Adafruit!
Written by Limor Fried & Kevin Townsend for Adafruit Industries.
BSD license, all text above must be included in any redistribution
***************************************************************************/
#include <Wire.h>
#include <Adafruit_AHTX0.h>
Adafruit_AHTX0 aht;
#include <Adafruit_BMP280.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
Adafruit_BMP280 bmp; // I2C
//Adafruit_BMP280 bmp(BMP_CS); // hardware SPI
//Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK);
void setup() {
Serial.begin(9600);
while ( !Serial ) delay(100); // wait for native usb
Serial.println(F("BMP280 test"));
Wire.begin(5, 4);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C, false, false)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
delay(2000); // Pause for 2 seconds
// Clear the buffer.
display.clearDisplay();
Serial.println("Adafruit AHT10/AHT20 demo!");
if (! aht.begin()) {
Serial.println("Could not find AHT? Check wiring");
while (1) delay(10);
}
Serial.println("AHT10 or AHT20 found");
unsigned status;
//status = bmp.begin(BMP280_ADDRESS_ALT, BMP280_CHIPID);
status = bmp.begin();
if (!status) {
Serial.println(F("Could not find a valid BMP280 sensor, check wiring or "
"try a different address!"));
Serial.print("SensorID was: 0x"); Serial.println(bmp.sensorID(),16);
Serial.print(" ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n");
Serial.print(" ID of 0x56-0x58 represents a BMP 280,\n");
Serial.print(" ID of 0x60 represents a BME 280.\n");
Serial.print(" ID of 0x61 represents a BME 680.\n");
while (1) delay(10);
}
/* Default settings from datasheet. */
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Operating Mode. */
Adafruit_BMP280::SAMPLING_X2, /* Temp. oversampling */
Adafruit_BMP280::SAMPLING_X16, /* Pressure oversampling */
Adafruit_BMP280::FILTER_X16, /* Filtering. */
Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */
}
void loop() {
display.display();
display.clearDisplay();
display.display();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Wetter in Suttorf");
display.println();
Serial.print(F("Temperature = "));
display.print(F("Temperature: "));
Serial.print(bmp.readTemperature());
display.print(bmp.readTemperature());
Serial.println(" *C");
display.println(" C");
Serial.print(F("Pressure = "));
display.print(F("Pressure: "));
Serial.print(bmp.readPressure());
display.print(bmp.readPressure()/100);
Serial.println(" Pa");
display.print(" HPa");
Serial.print(F("Approx altitude = "));
Serial.print(bmp.readAltitude(1013.25)); /* Adjusted to local forecast! */
Serial.println(" m");
Serial.println();
sensors_event_t humidity, temp;
aht.getEvent(&humidity, &temp);
// populate temp and humidity objects with fresh data
Serial.print("Temperature: ");
Serial.print(temp.temperature);
Serial.println(" degrees C");
Serial.print("Humidity: ");
display.print("Humidity: ");
Serial.print(humidity.relative_humidity);
display.print(humidity.relative_humidity);
Serial.println("% rH");
display.println("% rH");
display.display();
delay(5000);
}
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 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.
Spannungsversorgung
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.
|
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
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.
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.
Dieses Programm funktioniert. Bitte LCD und LM35 wie in den
Kommentaren anschliessen.
/*Sketch getestet 18.07.2013*/
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
#define LCD_CLEAR 0b00000001
float temp;
float tempF;
int tempPin = 1;
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
}
void loop() {
temp = analogRead(tempPin);
temp = temp * 5/1024*100;
tempF = ((temp*9)/5) + 32;
lcd.setCursor(0, 0);
lcd.print(temp);
lcd.print("C");
lcd.setCursor(0,2);
lcd.print(tempF);
lcd.print("F");
delay(5000);
lcd.clear();
Serial.println(temp);
}
Einige werden sich wundern das die Temperatur nicht stimmt. Das liegt daran das der A/D Wandler die Betriebsspannung als Referenzspannung für die Umrechnung benutzt. Wenn man den Arduino nur über die Spannung der USB Schnittstelle Betreibt ist die Spannung meistens zu niedrig.
Abhilfe schafft da ein externes Netzteil um zu gewährleisten das in der Standardprogrammierung Uref = Ubb = 5V ist.
Weiterhin ändert sich das Ergebnis jedesmal. Das Problem beseitigt ein 100nf über der Betriebspannung direkt am LM35.
Man kann auch, wie im unterem Beispiel die interne Referenz des Atmegacontollers wählen und die liegt hier bei 1,1 V. Das hier wäre ideal. Der LM35 mißt 1 -100 Grad und gibt 0 - 1V aus.
Die dritte Möglich wäre eine externe Referenzspannung ( Achtung max 5V) zu wählen. analogReference(external); Hier verschenkt man den Bereich 1,1 - 5V
Dieses Programm funktioniert. Ausgabe auf den Monitor in den Arduino Tools.
//Aktuell Version Mai 2014
int Sensorport = 0;
float temperatur;
void setup() {
Serial.begin(9600);
analogReference(INTERNAL); // !! Einschalten der internen //Referenzspannung. Beim Uno (Atemge 328p) 1,1Volt
}
void loop()
{ temperatur= analogRead(Sensorport);
delay(20); //warten 20ms
temperatur = temperatur * 1.1 / 10.24 ;
Serial.println(temperatur);
delay(1000);
}
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.
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.
Der Arduino ist eigentlich nichts anderes als ein Atmega µContoller (beim Uno ein Atmega328) dem man in ein kompatibles Stecksystem gebaut und mit einer komfortablen Programmierumgebung versehen hat.
Da Atmega nicht direkt an einer USB Schnittstelle funktioniert wurde dem Bord noch ein Atmega16u verpasst der die USB Schnittstelle händelt. Im Atemga328 ist eine Bootsoftware installiert die die Software über die serielle Schnittstelle lädt. Wer die Programmierumgebung nicht benötigt kann auch über die ISP Schnittstelle programmieren. Der Bootloader lässt sich auch entfernen dann hat man noch mehr Speicher zur Verfügung es ist dann aber kein Arduino mehr.