Thermometer XXL

Toon hier Uw afgeronde projecten aan anderen.
Gebruikers-avatar
Berichten: 118
Geregistreerd: 01 Okt 2015, 11:54
Woonplaats: Castricum

Thermometer XXL

Berichtdoor FonzieBonzo » 22 Mrt 2017, 16:54

Misschien voor andere ook leuk om te maken of misschien zelfs wel beter te maken.
Met een stappenmotor wind ik een visdraad op waar aan het uiteinde een pijl hangt.
Ik zet deze pijl ter hoogte van de temperatuur cijfers stil zodat ik dus een hele grote thermometer heb.

De visdraad gaat ook nog door een lus welke aan een microswitch vast zit. De microswitch wordt aangetrokken
indien de visdraad te strak komt te staan, Hierdoor kan ik na het opstarten de startmotor/aanwijzer kalibreren door hem helemaal naar boven te laten gaan.

Het werkt goed al had ik achteraf de buitentemperatuur willen doen en de aanwijzer aan twee visdraden hangen.
Hiermee kan ik dan de pijl iets naar boven of naar beneden kan laten hangen zodat er aangegeven kan worden of de temp af of oploopt.

Gr,
Fonzie

thermometer.jpg
thermometer.jpg (26.72 KiB) 5276 keer bekeken


kastje.jpg
kastje.jpg (56.01 KiB) 5276 keer bekeken


cpp code
#include <OneWire.h>

const bool DEBUG = false;

const int pinLed = 5;
const int pinTempSensor = 4;
const int pinMicroswitch = 3;
const int pinButUp = 6;
const int pinButDown = 7;

const int pinStepMotor1 = 11;
const int pinStepMotor2 = 9;
const int pinStepMotor3 = 10;
const int pinStepMotor4 = 8;

int ButUp = 0;
int ButDown = 0;
int Microswitch = 0;
//94699-29754=64945/12
int TempStep = 5412;
long TempStartPosition = 29754;

bool MotorCalibrated = false;
long MotorPosition = 0;
int MotorStep = 0;

const long TempInterval = 5000;
unsigned long previousMillis = 0;
float Temp = 20.0;
const float MarriageSaver = 1.0;


OneWire ds(pinTempSensor);

void setup(void) {
Serial.begin(9600);
pinMode(pinLed, OUTPUT);
pinMode(pinTempSensor, INPUT);

pinMode(pinStepMotor1, OUTPUT);
pinMode(pinStepMotor2, OUTPUT);
pinMode(pinStepMotor3, OUTPUT);
pinMode(pinStepMotor4, OUTPUT);

pinMode(pinButUp, INPUT_PULLUP);
pinMode(pinButDown, INPUT_PULLUP);
pinMode(pinMicroswitch, INPUT_PULLUP);
}

void loop(void)
{
//****************** read buttons state ************************************************
ButUp = !(bool)digitalRead(pinButUp);
ButDown = !(bool)digitalRead(pinButDown);
Microswitch = !(bool)digitalRead(pinMicroswitch);

//****************** If debug is true (be aware it will slowdown the motor) *************
if (DEBUG)
{
if ((millis() % 500) == 0)
{
Serial.print(" T=");
Serial.print((float)Temp);
Serial.print(" MS=");
Serial.print(Microswitch ? "1" : "0" );
Serial.print(" ButUp=" );
Serial.print(ButUp ? "1" : "0");
Serial.print(" ButDown=" );
Serial.print(ButDown ? "1" : "0");
Serial.print(" Calib=");
Serial.print(MotorCalibrated ? "1" : "0");
Serial.print(" MotPos=");
Serial.print(MotorPosition);
Serial.println("");
}
}

//****************** Button up & Down ***************************************************
if (ButUp ) {
Motor(10, false);
return;
}
if (ButDown)
{
Motor(10, true);
return;
}

//****************** Check if motor already calibrated otherwice do *********************
if (MotorCalibrated == false)
{
if (Microswitch)
{
MotorCalibrated = true;
MotorPosition = 0;
} else
{
Motor(10, false);
return;
}
}

//****************** GetTemp if the time is for it **************************************
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= TempInterval)
{
previousMillis = currentMillis;
Temp = GetTemp();
}

//****************** Breakout main loop if in debug mode *******************************
if (DEBUG)
{
return;
}

//****************** Set motorposition to temp *****************************************
if (MotorCalibrated & Temp > 13 & Temp < 29)
{
long pos = abs((Temp - 28)) * TempStep + TempStartPosition;
int MotorSpeed = 6;
long Difference = abs(pos - MotorPosition);
if (Difference > TempStep)
{
MotorSpeed = 10;
}

if (pos > MotorPosition)
{
Motor(MotorSpeed, true);
} else if (pos < MotorPosition)
{
Motor(MotorSpeed, false);
}
}
}

//****************** Get temp from sensor *******************************************
float GetTemp()
{
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius;

if ( !ds.search(addr))
{
ds.reset_search();
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44);

present = ds.reset();
ds.select(addr);
ds.write(0xBE);
for ( i = 0; i < 9; i++)
{
data[i] = ds.read();
}
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10)
{
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else
{
byte cfg = (data[4] & 0x60);
// at lower res, the low bits are undefined, so let's zero them
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
//// default is 12 bit resolution, 750 ms conversion time
}
celsius = (float)raw / 16.0;
celsius = (float)round(Temp * 9.0 + celsius) / 10.0 + MarriageSaver;

return celsius;
}

//****************** Controling the step-motor *******************************
void Motor(int speed, bool MotorDirectionDown)
{
if (MotorDirectionDown == true)
{
MotorPosition++;
MotorStep++;
} else
{
MotorPosition--;
MotorStep--;
}

if (MotorStep > 7) {
MotorStep = 0;
}
if (MotorStep < 0) {
MotorStep = 7;
}

switch (MotorStep) {
case 0:
digitalWrite(pinStepMotor1, LOW);
digitalWrite(pinStepMotor2, LOW);
digitalWrite(pinStepMotor3, LOW);
digitalWrite(pinStepMotor4, HIGH);
break;
case 1:
digitalWrite(pinStepMotor1, LOW);
digitalWrite(pinStepMotor2, LOW);
digitalWrite(pinStepMotor3, HIGH);
digitalWrite(pinStepMotor4, HIGH);
break;
case 2:
digitalWrite(pinStepMotor1, LOW);
digitalWrite(pinStepMotor2, LOW);
digitalWrite(pinStepMotor3, HIGH);
digitalWrite(pinStepMotor4, LOW);
break;
case 3:
digitalWrite(pinStepMotor1, LOW);
digitalWrite(pinStepMotor2, HIGH);
digitalWrite(pinStepMotor3, HIGH);
digitalWrite(pinStepMotor4, LOW);
break;
case 4:
digitalWrite(pinStepMotor1, LOW);
digitalWrite(pinStepMotor2, HIGH);
digitalWrite(pinStepMotor3, LOW);
digitalWrite(pinStepMotor4, LOW);
break;
case 5:
digitalWrite(pinStepMotor1, HIGH);
digitalWrite(pinStepMotor2, HIGH);
digitalWrite(pinStepMotor3, LOW);
digitalWrite(pinStepMotor4, LOW);
break;
case 6:
digitalWrite(pinStepMotor1, HIGH);
digitalWrite(pinStepMotor2, LOW);
digitalWrite(pinStepMotor3, LOW);
digitalWrite(pinStepMotor4, LOW);
break;
case 7:
digitalWrite(pinStepMotor1, HIGH);
digitalWrite(pinStepMotor2, LOW);
digitalWrite(pinStepMotor3, LOW);
digitalWrite(pinStepMotor4, HIGH);
break;
default:
digitalWrite(pinStepMotor1, LOW);
digitalWrite(pinStepMotor2, LOW);
digitalWrite(pinStepMotor3, LOW);
digitalWrite(pinStepMotor4, LOW);
break;
}
//****************** slowdown motor (value speed 1..10) *************************************
delay(11 - speed);
}

Advertisement

Terug naar Afgeronde projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 8 gasten