Benutzer-Werkzeuge

Webseiten-Werkzeuge


de:i2c_arduino

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

de:i2c_arduino [2011/03/25 12:29]
goesta created
de:i2c_arduino [2011/04/01 11:03] (aktuell)
goesta Typos ausgebessert und neue Programmversion
Zeile 1: Zeile 1:
 ====== I2C Sensoren mittels USB auslesen ====== ====== I2C Sensoren mittels USB auslesen ======
  
-Mit der [[http://​www.arduino.cc|Arduino]] Plattform lassen sich allerhand Dinge anstellen. So auc Daten vom I2C Bus lesen und LCDs ansteuern. Und ganz nebenbei kann man per USB mit einem PC kommunizieren.+Mit der [[http://​www.arduino.cc|Arduino]] Plattform lassen sich allerhand Dinge anstellen. So auch Daten vom I2C Bus lesen und LCDs ansteuern. Und ganz nebenbei kann man per USB mit einem PC kommunizieren.
  
 Grundlage ist ein Atmel Microcontroller mit etlichen I/O Anschlüssen und ein Serial/USB Adapter (auch mit einem Atmel realisiert) zum Anschluss an PCs und zur einfachen Programmierung. Grundlage ist ein Atmel Microcontroller mit etlichen I/O Anschlüssen und ein Serial/USB Adapter (auch mit einem Atmel realisiert) zum Anschluss an PCs und zur einfachen Programmierung.
Zeile 17: Zeile 17:
 Von Anfang an war die Integration in Nagios ein wesentliches Ziel. Aber wenn man schon Hardware an den Server anschließt,​ kann man dann nicht auch mehr machen? Von Anfang an war die Integration in Nagios ein wesentliches Ziel. Aber wenn man schon Hardware an den Server anschließt,​ kann man dann nicht auch mehr machen?
  
-Wäre eine Ausgabe des aktuellen Status nicht auch nett? Zum Beispiel in Form einer Ampel? Dazu habe ich auch schon mal einen [[http://​www.smekal.at/​code/​NAmpel|Hack mit legacy Schnittstellen]] gebaut. Fein wäre noch eine Textausgabe ...+Wäre eine Ausgabe des aktuellen Status nicht auch nett? Zum Beispiel in Form einer Ampel? Dazu habe ich auch schon einmal ​einen [[http://​www.smekal.at/​code/​NAmpel|Hack mit legacy Schnittstellen]] gebaut. Fein wäre noch eine Textausgabe ...
  
 ==== LCD Ansteuerung ==== ==== LCD Ansteuerung ====
Zeile 25: Zeile 25:
  
 ===== Testaufbau ===== ===== Testaufbau =====
-Um einmal zu sehen ob das überhaup ​funktionieren kann habe ich einen Testaufbau mittels Breadboard erstellt.+Um einmal zu sehenob das überhaupt ​funktionieren kannhabe ich einen Testaufbau mittels Breadboard erstellt.
  
 {{:​de:​ds1621_lcd_0.1_steckplatine.png|}} {{:​de:​ds1621_lcd_0.1_steckplatine.png|}}
Zeile 69: Zeile 69:
 Halogen-Schreibtischlampen erzeugen ganz schön viel Strahlungswärme! :-) Halogen-Schreibtischlampen erzeugen ganz schön viel Strahlungswärme! :-)
  
-Da mir die Teststrippen recht bald zu wenig waren habe ich den Datenbus mit Flachbandkabeln realsisert. Auch für den DS1621 hatte ich zu wenig Kabel und habe daher auf die Anordnung vom alten Prjekt ​zurückgegriffen. Der Kondensator kommt auch daher, er soll bei längeren Leitungen helfen ...+Da mir die Teststrippen recht bald zu wenig warenhabe ich den Datenbus mit Flachbandkabeln realsisert. Auch für den DS1621 hatte ich zu wenig Kabel und habe daher auf die Anordnung vom alten Projekt ​zurückgegriffen. Der Kondensator kommt auch daher, er soll bei längeren Leitungen helfen ...
  
 ===== Software ===== ===== Software =====
Zeile 75: Zeile 75:
  
 ==== Firmware für Arduino ==== ==== Firmware für Arduino ====
-Dank der umfangreichen Bibliotheken ist das Programm erstaunlich knapp ung recht gut lesbar:+Dank der umfangreichen Bibliotheken ist das Programm erstaunlich knapp und recht gut lesbar:
  
 <code c> <code c>
-#include <Wire.h> +// 
-#​include ​<LiquidCrystal.h>+// ds1621_lcd.pde 
 +// 
 +// This simple Arduino project reads temerature from DS1621 via I2C 
 +// and outputs to LCD and USB 
 +// 
 +// v0.3 2011-03-25 GS <goesta@smekal.at> 
 +// 
 +/* 
 +   This program is free software: you can redistribute it and/or modify 
 +   it under the terms of the GNU General Public License as published by 
 +   the Free Software Foundation, either version 3 of the License, or 
 +   (at your option) any later version.
  
-LiquidCrystal lcd(1211, 10, 5, 4, 3, 2); +   This program is distributed in the hope that it will be useful
-int backLight = 9+   but WITHOUT ANY WARRANTYwithout even the implied warranty of 
-int dataRead = 13;+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ​ See the 
 +   GNU General Public License for more details.
  
-// Simple DS1621 demo +   http://www.gnu.org/​licenses 
-// -- by Jon McPhalen (www.jonmcphalen.com) +*/
-// -- 19 DEC 2007+
  
-// SDA pin is Analog4 +#include <​LiquidCrystal.h>​ // LCD interface library 
-// SCL pin is Analog5 +#include <​Wire.h>​ // I2C library 
-// DS1621 ​has A2A1and A0 pins connected ​to GND+#define DEV_ID 0x90 >> 1 
 +#define NAME "DS1621-Therm 0.3" 
 +LiquidCrystal lcd(121110, 5, 4, 3, 2); 
 +int backLight = 9; // use digital pin 9 to control LCD backlight 
 +int dataRead = 13; // show I2C activity with on board LED
  
-#define DEV_ID 0x90 >> 1                    // shift required by wire.h 
 void setup() void setup()
 { {
 +  Serial.begin(9600);​
 +  Serial.println(NAME);​
   pinMode(dataRead,​ OUTPUT);   pinMode(dataRead,​ OUTPUT);
   pinMode(backLight,​ OUTPUT);   pinMode(backLight,​ OUTPUT);
Zeile 102: Zeile 118:
   lcd.clear(); ​                 ​   lcd.clear(); ​                 ​
   lcd.setCursor(0,​0); ​         ​   lcd.setCursor(0,​0); ​         ​
-  lcd.print("​DS1621-Therm 0.2");  ​+  lcd.print(NAME);  ​
   lcd.setCursor(0,​1); ​         ​   lcd.setCursor(0,​1); ​         ​
   lcd.print("​initializing ...");   lcd.print("​initializing ...");
  
-  ​digitalWrite(dataRead, HIGH); +  ​i2cInit();    // call device ​to attention
-  Wire.begin();​ +
-  Wire.beginTransmission(DEV_ID); ​          // connect ​to DS1621 (#0) +
-  Wire.send(0xAC); ​                         // Access Config +
-  Wire.send(0x02); ​                         // set for continuous conversion +
-  Wire.beginTransmission(DEV_ID); ​          // restart +
-  Wire.send(0xEE); ​                         // start conversions +
-  Wire.endTransmission();​ +
-  digitalWrite(dataRead,​ LOW);+
 } }
  
Zeile 120: Zeile 128:
 void loop() void loop()
 { {
-  int tempC = 0+  int temp
-  int decimal ​= 0+  int decimal; 
-  ​digitalWrite(dataRead, HIGH); +  ​i2cInit();    // call device ​to attention 
-  Wire.begin();​ +  delay(1000); ​ // wait for sensor to convert data
-  Wire.beginTransmission(DEV_ID); ​          // connect ​to DS1621 (#0) +
-  Wire.send(0xAC); ​                         // Access Config +
-  Wire.send(0x02); ​                         // set for continuous conversion +
-  Wire.beginTransmission(DEV_ID); ​          // restart +
-  Wire.send(0xEE); ​                         // start conversions +
-  Wire.endTransmission();​ +
-  digitalWrite(dataRead,​ LOW); +
-  delay(1000); ​                             // give time for measurement+
  
-  digitalWrite(dataRead,​ HIGH);+  digitalWrite(dataRead,​ HIGH); ​   // show I2C activity
   Wire.beginTransmission(DEV_ID);​   Wire.beginTransmission(DEV_ID);​
-  Wire.send(0xAA); ​                         // read temperature+  Wire.send(0xAA);​
   Wire.endTransmission();​   Wire.endTransmission();​
-  Wire.requestFrom(DEV_ID,​ 2);              // request ​one byte from DS1621 +  Wire.requestFrom(DEV_ID,​ 2);     ​// request ​two bytes of data 
-  ​tempC = Wire.receive(); ​                  ​// get whole degrees reading +  ​temp = Wire.receive(); ​          ​// integer value comes first 
-  decimal = Wire.receive();​+  decimal = Wire.receive(); ​       // decimal/​negative info
   digitalWrite(dataRead,​ LOW);   digitalWrite(dataRead,​ LOW);
  
   lcd.clear(); ​                 ​   lcd.clear(); ​                 ​
   lcd.setCursor(0,​0); ​         ​   lcd.setCursor(0,​0); ​         ​
-  lcd.print("​DS1621-Therm 0.2");  ​+  lcd.print(NAME);  ​
   lcd.setCursor(0,​1); ​         ​   lcd.setCursor(0,​1); ​         ​
   lcd.print("​Sensor0:"​);​   lcd.print("​Sensor0:"​);​
   lcd.setCursor(9,​1);​   lcd.setCursor(9,​1);​
-  lcd.print(tempC);+  lcd.print(temp);
   lcd.setCursor(11,​1);​   lcd.setCursor(11,​1);​
   if ( decimal == 0 ) {   if ( decimal == 0 ) {
     // no decimal     // no decimal
     lcd.print("​.0"​);​     lcd.print("​.0"​);​
 +    Serial.print(temp);​
 +    Serial.println("​.0 C");
   }   }
   else {   else {
     //.5 degrees     //.5 degrees
     lcd.print("​.5"​);​     lcd.print("​.5"​);​
 +    Serial.print(temp);​
 +    Serial.println("​.5 C");
   }   }
   lcd.setCursor(13,​1);​   lcd.setCursor(13,​1);​
   lcd.print("​ C");   lcd.print("​ C");
 +}
 +
 +void i2cInit() {
 +  digitalWrite(dataRead,​ HIGH); // show activity on LED
 +  Wire.begin();​
 +  Wire.beginTransmission(DEV_ID); ​          // connect to DS1621 (#0)
 +  Wire.send(0xAC); ​                         // Access Config
 +  Wire.send(0x02); ​                         // set for continuous conversion
 +  Wire.beginTransmission(DEV_ID); ​          // restart
 +  Wire.send(0xEE); ​                         // start conversions
 +  Wire.endTransmission();​
 +  digitalWrite(dataRead,​ LOW);
 } }
 </​code>​ </​code>​
 ===== To do ===== ===== To do =====
 +Weil das mit dem I2C Bus keine so gute Idee ist (die Leitunslängen sind für rund einen Meter ausgelegt) werde ich das Ganze auf 1-Wire Bus umstellen. Dafür gibt es auch billige Sensoren und die Kabel können bis zu 100 Meter lang sein.
 +
 +Vorher muss ich aber einkaufen gehen ;-)
 +
 ==== Hardware ==== ==== Hardware ====
   * mehrere Sensoren an einem Bus   * mehrere Sensoren an einem Bus
Zeile 170: Zeile 190:
 ==== Software ==== ==== Software ====
   * Scan über alle Sensoren   * Scan über alle Sensoren
-  * Ausgabe über USB 
   * polling einzelner Sensoren über USB -> Nagios Plugin   * polling einzelner Sensoren über USB -> Nagios Plugin
  
de/i2c_arduino.txt · Zuletzt geändert: 2011/04/01 11:03 von goesta