Hallo zusammen,
ich möchte mir eine Temperaturanzeige bauen. Dazu verwende ich einen Sensor DB18B20, einen Arduino Nano und eine vierstellige 7-Segment-Anzeige (siehe Schaltung).
Weil ich die Temperaturanzeige mit einem Akku betreibe und deshalb Strom sparen will, möchte ich die Temperatur nur gemessen und angezeigt bekommen, wenn ich einen Taster betätige. Dann soll der Nano aus dem „Schlaf“ geweckt werden, die Messung erfolgen und angezeigt werden und anschließend, nach loslassen des Tasters, der Nano wieder in den Schlaf wechseln.
Da ich mit dem Taster den Interrupt (Nano wecken) auslöse in dem ich Pin 2 auf LOW lege, steuer ich über Pin 3 einen Transistor an, der dann VCC an den Sonsor und die Anzeige legt. Jetzt sollte eine Temperatur angezeigt werden, denn die leuchtende LED zeigt, das am Sensor und an der Anzeige VCC anliegt.
Leider erfolgt keine Anzeige, weil das Programm nicht den Sensor liest. Die Abfrage if (sensors.getDS18Count() != 0) ist nicht erfüllt, denn in seriellen Monitor wird mir nach drücken des Tasters nur „"Interrupt" und „MESSUNG IST EIN“ ausgegeben, aber nicht "Sensor".
Ich versuche es schon stundenlang vergeblich den Fehler zu finden, ohne Erfolg.
Ich habe die 7-Segment Anzeige an einer anderen Schaltung getestet, sie funktioniert, und ich habe den Sensor ausgetauscht, auch ohne Erfolg.
Ich geh davon aus, das die Schaltung ok ist. Da ich bezüglich des programmierens noch ein ziehmlicher Anfänger bin werde ich wohl etwas im Code bei der Anpassung falsch gemacht haben.
Gruß
wAlter67
//////////////////////////////////////////////////////
// Temperaturanzeige mit 7-Segment und Schlafmodus
////////////////////////////////////////////////////
// Definitionen für Schlafmodus ////////////////////////////////
#include <avr/sleep.h>
#define INT_PIN 2
#define LED_PIN 13
// Definitionen für Temp-Messung ////////////////////////////////
#include <TM1637Display.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// Module connection pins (Digital Pins)
#define CLK A4
#define DIO A3
#define ONE_WIRE_BUS 7
const uint8_t SEG_ERR[] = {
SEG_A | SEG_D | SEG_E | SEG_F | SEG_G, // E
SEG_E | SEG_G, // r
SEG_E | SEG_G, // r
0, // space
};
TM1637Display display(CLK, DIO);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
byte Messung_EIN = 3;
// Unterprogramme für Schlafmodus ////////////////////////////////
void INT_PINisr(void)
/* ISR fuer Pin 2 */
{
/* detach Interrupt, damit er nur einmal auftritt */
detachInterrupt(0);
}
void enter_sleep(void)
{
digitalWrite(Messung_EIN, LOW); // Sensor und Anzeige AUS
attachInterrupt(0, INT_PINisr, LOW);
/* Arduino schlafen legen */
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_mode();
sleep_disable();
}
/////////////////////////////////////////////////////////////////
void setup()
{
// Setupteil für Temp-Messung //////////////////////////////////
pinMode(7, INPUT);
pinMode(3, OUTPUT);
digitalWrite(Messung_EIN, LOW); // Sensor und Anzeige AUS
display.setBrightness(0x00);
sensors.begin();
if (sensors.getDS18Count() == 0)
display.setSegments(SEG_ERR);
else
sensors.setResolution(10);
//////////////////////////////////////////////////////////////
Serial.begin(9600);
Serial.println("Starte ...");
/* Pin 2 als Interrupt-Pin, Pullup einschalten */
pinMode(INT_PIN, INPUT);
digitalWrite(INT_PIN, HIGH);
pinMode(LED_PIN, OUTPUT);
Serial.println("Init erfolgt ...");
delay(100);
}
void loop()
{
/* warten, bis der Interupt-Eingang wieder frei ist */
while (digitalRead(INT_PIN) == LOW) {
Serial.println("Interrupt");
digitalWrite(Messung_EIN, HIGH); // Sensor und Anzeige EIN
Serial.println("MESSUNG IST EIN");
if (sensors.getDS18Count() != 0) {
Serial.println("Sensor");
sensors.requestTemperatures();
double temp = sensors.getTempCByIndex(0);
display.showNumberDecEx(temp * 100, 0b01000000, false);
}
Serial.println("*** Taste loslassen ***");
delay(100);
}
Serial.println("Gehe schlafen ...");
delay(100);
/* LED umschalten und wieder schlafen */
//digitalWrite(LED_PIN, ! digitalRead(LED_PIN));
enter_sleep();
Serial.println("Bin aufgewacht ...");
delay(100);
}
