#include <Arduino.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Servo.h>
#include "My_Task.h"
#include "MySlowServo.h"
// Einfache Blinkklasse
class Blink : public MyTask {
public:
void setup(int pin, unsigned long pausenZeit) {
led = pin;
pause = pausenZeit;
pinMode(led,OUTPUT);
digitalWrite(led,LOW);
}
void loop() {
digitalWrite(led,!digitalRead(led));
wait(pause);
}
private:
int led;
unsigned long pause;
};
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 7
#define TEMPERATURE_PRECISION 9 // Lower resolution
float caseTemp = 0;
float heaterTemp = 0;
const int servo_pin = 10;
LangsamerServo servo;
// 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);
int numberOfDevices; // Number of temperature devices found
DeviceAddress tempDeviceAddress; // We'll use this variable to store a found device address
//-----------------------------------------------------------------------------------------------
// Temperature Task
class Temp : public MyTask {
public:
void setup(unsigned long pausenZeit) {
pause = pausenZeit;
}
void loop() {
if (schritt == 0) {
sensors.requestTemperatures(); // Send the command to get temperatures
wait(pause);
schritt = 1;
return;
}
if (schritt == 1) {
sensors.getAddress(tempDeviceAddress, 0);
wait(pause);
schritt = 2;
return;
}
if (schritt == 2) {
float tempC = sensors.getTempC(tempDeviceAddress);
if (tempC == DEVICE_DISCONNECTED_C) {
//"Error: Could not read temperature data"
return;
}
//Serial.print("Case Temp: ");
//Serial.println(tempC,1);
//Serial.println("");
wait(pause);
schritt = 3;
return;
}
if (schritt == 3) {
sensors.getAddress(tempDeviceAddress, 1);
wait(pause);
schritt = 4;
return;
}
if (schritt == 4) {
float tempC = sensors.getTempC(tempDeviceAddress);
if (tempC == DEVICE_DISCONNECTED_C) {
//"Error: Could not read temperature data"
return;
}
//Serial.print("Heater Temp: ");
//Serial.println(tempC,1);
//Serial.println("");
wait(pause);
schritt = 0;
return;
}
}
private:
unsigned long pause;
};
//-----------------------------------------------------------------------------------------------
// LED - Instanzen erstellen
const int anzahl = 12;
Blink blink[anzahl];
Temp temperature;
void setup(void)
{
// start serial port
Serial.begin(9600);
// Start up the library
sensors.begin();
// Grab a count of devices on the wire
numberOfDevices = sensors.getDeviceCount();
blink[0].setup(2,100);
blink[1].setup(3,150);
blink[2].setup(4,200);
blink[3].setup(5,250);
blink[4].setup(6,300);
blink[5].setup(8,350);
blink[6].setup(9,400);
blink[7].setup(11,450);
blink[8].setup(12,500);
for (int i=0; i<anzahl; i++) {
blink[i].start();
}
temperature.setup(1000);
temperature.start();
servo.attach(servo_pin);
servo.write(90);
}
// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if(tempC == DEVICE_DISCONNECTED_C)
{
Serial.println("Error: Could not read temperature data");
return;
}
Serial.print("Temp C: ");
Serial.print(tempC);
//Serial.print(" Temp F: ");
//Serial.println(DallasTemperature::toFahrenheit(tempC)); // Converts tempC to Fahrenheit
}
// Gets temperature readings from the sensors and draws them on the display.
void measureTemperatures() {
sensors.requestTemperatures(); // Send the command to get temperatures
// Loop through each device, print out temperature data
for(int i=0;i<numberOfDevices; i++) {
// Search the wire for address
if(sensors.getAddress(tempDeviceAddress, i)) {
// It responds almost immediately. Let's print out the data
printTemperature(tempDeviceAddress, i); // Use a simple function to print out the data
}
}
}
// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress, int device_id)
{
float tempC = sensors.getTempC(deviceAddress);
if(tempC == DEVICE_DISCONNECTED_C)
{
//"Error: Could not read temperature data"
return;
}
if ( device_id == 0) caseTemp = tempC;
if ( device_id == 1) heaterTemp = tempC;
Serial.print("Case Temp: ");
Serial.println(caseTemp,1);
Serial.println("");
Serial.print("Heater Temp: ");
Serial.print(heaterTemp, 1);
Serial.println("");
}
// Das soll anstelle von delay() verwendet werden
void pause(int ms) {
unsigned long start = millis();
while (millis() < start + ms) {
_loop();
}
}
// in diesen Loop kommt alles, was regelmässig aufgerufen werden muss
void _loop() {
servo.tic();
}
void loop(void)
{
for (int i=0; i<anzahl; i++) blink[i].tic();
temperature.tic();
//measureTemperatures();
if (servo.read() == 10) servo.write(90,50);
if (servo.read() == 90) servo.write(10,50);
if (!servo.amZiel()) servo.tic();
//_loop();
//servo.write(10,50);
//while (!servo.amZiel()) _loop();
//pause(500);
//servo.write(90,50);
//while (!servo.amZiel()) _loop();
//pause(500);
}