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.
Luftfeuchtigkeit messen mit dem dem DHT11,
ist eigentlich ganz einfach da das ganze handling und timig von einer Libary ausgeführt wird. Die Libary benennt die Pins etwas anders. Der Pin 15 im Scetch ist tatsächlich A1 am Arduino.
Der Anschluss ist ganz einfach.
Hier der fertige Scetch mit LCD und Ausgabe aufs Terminal. Ganz einfach da hier eine Libary (von Ladyada) verwendet wird.
Der Widerstand wird auf einigen Seiten auch mit kleineren Werten angeben. Bei mir funzt es nur mit 10kOhm.
#include <LiquidCrystal.h>
LiquidCrystal lcd(9, 8,4,5,6,7); // diese Pins werden für das Display benötigt.
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
Serial.println("DHT11-Test");
lcd.clear(); // LCD loeschen
lcd.begin(16, 2); // fuer LCD1602
dht.begin();
}
void loop() {
// Das Erfassen von Temperatur und Luftfeuchtigkeit benoetigt ca. 250 Millisekunden.
float h = dht.readHumidity();
float t = dht.readTemperature();
// Check, ob die Daten Zahlen sind, falls nicht (NaN: not a number), ist was falsch gelaufen!
if (isnan(t) || isnan(h))
{
Serial.println("Fehler beim Lesen vom DHT-Sensor");
}
else
{
Serial.print("Feuchtigkeit: ");
Serial.print(h);
Serial.print(" %\t ");
Serial.print("Temperatur: ");
Serial.print(t);
Serial.println(" Grad Celsius");
lcd.setCursor(0,0);
lcd.print("Feuchtigk.:");
lcd.print(h);
lcd.setCursor(0,1);
lcd.print("Temperatur:");
lcd.print(t);
}
}
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.
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.
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.