Ich habe gerade ein paar Probleme, die nach dem einbinden eines Temperatursensors DS18B20 aufgetreten sind.
Ich habe einmal den Sketch so laufen lassen. Die Zykluszeit beträgt ~26ms.
void loop() {
unsigned long aktuelleZeit = millis();
Serial.print(aktuelleZeit);
Serial.println(" : Arduino im loop()");
}
Nun lasse ich den Sketch wie folgt laufen. Die Zykluszeit beträgt nun ~800ms.
void loop() {
unsigned long aktuelleZeit = millis();
Serial.print(aktuelleZeit);
Serial.println(" : Arduino im loop()");
ausgabe();
}
void ausgabe() {
sensoren.requestTemperatures();
float temp1 = sensoren.getTempCByIndex(0);
lcd.setCursor(9,1);
lcd.print(temp1);
lcd.print((char)223);
lcd.print('C');
}
Das 2. Probleme kommt, sobald ich ShiftRegister aus der setup auskommentiere. Nun ist das Display leer, die Serielle Verbindung verbindet, gibt aber keine Werte zurück.
Zur Vollständigkeit hier noch einmal das komplette Sketch
// LCD I2C Display
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
// RTC
#include <DS3232RTC.h>
#include <Time.h>
// DS18B20
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 10 // One Wire an Pin 10
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensoren(&oneWire);
// RGB Shift Register
#include <ShiftPWM.h>
//const int ShiftPWM_dataPin = 11;
//const int ShiftPWM_clockPin = 13;
const int ShiftPWM_latchPin = 8;
const bool ShiftPWM_invertOutputs = false;
const bool ShiftPWM_balanceLoad = false;
unsigned char maxHelligkeit = 255;
unsigned char pwmFrequenz = 75;
unsigned int numRegister = 3;
unsigned int numAusgaenge = numRegister * 8;
unsigned int numRgbLeds = numRegister * 8 / 3;
void setup() {
// LCD I2C Diplay
lcd.init();
lcd.backlight();
/*
// RGB Shift Register
ShiftPWM.SetAmountOfRegisters(numRegister);
ShiftPWM.SetPinGrouping(4);
ShiftPWM.Start(pwmFrequenz, maxHelligkeit);
ShiftPWM.SetAll(0);
*/
// DS18B20
sensoren.begin();
// Serielle Schnittstelle
Serial.begin(9600);
}
void loop() {
unsigned long aktuelleZeit = millis();
Serial.print(aktuelleZeit);
Serial.println(" : Arduino im loop()");
ausgabe();
}
void ausgabe() {
sensoren.requestTemperatures();
float temp1 = sensoren.getTempCByIndex(0);
/*
lcd.setCursor(0,0);
uhrzeitLcd();
lcd.setCursor(0,1);
if(temp1 > 40.0) lcd.print("AUS");
else lcd.print("AN ");
*/
lcd.setCursor(9,1);
lcd.print(temp1);
lcd.print((char)223);
lcd.print('C');
}
void uhrzeitLcd() {
tmElements_t tm;
RTC.read(tm);
if(tm.Day >= 0 && tm.Day < 10) lcd.print('0');
lcd.print(tm.Day);
lcd.print('.');
if(tm.Month >= 0 && tm.Month < 10) lcd.print('0');
lcd.print(tm.Month);
lcd.print(". ");
if(tm.Hour >= 0 && tm.Hour < 10) lcd.print('0');
lcd.print(tm.Hour);
lcd.print(':');
if(tm.Minute >= 0 && tm.Minute < 10) lcd.print('0');
lcd.print(tm.Minute);
lcd.print(':');
if(tm.Second >= 0 && tm.Second < 10) lcd.print('0');
lcd.print(tm.Second);
}
Zur genauen Herkunft der DallasTemperature Libary kann ich gerade nichts näheres sagen, hatte die über Umwege gefunden.
Gibt es evtl. eine alternative Libary mit einer einfachen Einbindung eines DS18B20?
Bei der DallasTemperature gab es mehrere Beispiele, ua. diese, wovon ich meine Funktion abgeleitet hab
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
void setup(void)
{
// start serial port
Serial.begin(9600);
Serial.println("Dallas Temperature IC Control Library Demo");
// Start up the library
sensors.begin();
}
void loop(void)
{
// call sensors.requestTemperatures() to issue a global temperature
// request to all devices on the bus
Serial.print("Requesting temperatures...");
sensors.requestTemperatures(); // Send the command to get temperatures
Serial.println("DONE");
Serial.print("Temperature for the device 1 (index 0) is: ");
Serial.println(sensors.getTempCByIndex(0));
}