User Tools

Site Tools


random_object_build_challenge_2023:random_build_wouter

Van Simon kreeg ik een deksel van een elektrische koelbox en een massage apparaat.

Het massageapparaat heb ik voorzien van nieuwe accu, en dat was welkom om nekklachten te verhelpen dus die heb ik niet gebruikt voor deze challenge LOL .

Het deksel van de koelbox heb ik uit elkaar getrokken, en het peltier element en koellichamen heb ik bewaard, van de rest was niet duidelijk of het nog ging werken, dus uit veiligheidsoverwegingen heb ik besloten die niet gebruiken.

Het peltier element was een 45w element op 12v, ik heb dit nog nooit eerder gebruikt, dus ik heb me eerst wat ingelezen. (wonderbaarlijk genoeg is dit effect in 1834 al ontdekt)

Ik heb het element met koellichamen op beide kanten direct aangesloten op 12v, en het viel al snel op dat de onderkant (de tekst zijde) inderdaad koud werd, maar de bovenkant nog veel sneller heet. Daaruit werd het idee geboren dat het een combinatie zou worden van een warmhoudplaatje met een koelkastje er onder. Om je “hot brew” en “cold brew” op temperatuur te houden.

Ik heb een eerste versie in elkaar gezet met bovenop een groot blok aluminium als koellichaam en een afgesloten kastje onderin met daarin het passief koellichaam uit de koelbox en wat isolatie. In het blok bovenop een thermistor om metingen te kunnen doen voor P.I.D. regeling van het peltier element doormiddel van een arduino Nano en een FET.

Al snel bleek dat het blok bovenop in zijn eentje niet genoeg de warmte kon dissiperen, dus heb ik er een plaat bovenop gezet met daaronder weer stukken van het originele koellichaam van de koelbox. Dit leek iets te helpen, dus heb ik het een tijdje laten lopen.

De P.I.D. regeling werkte prima, maar ik kwam er achter dat zodra het vermogen wat in het peltier element werd gestopt minder werd (terugregeling om te zorgen dat het element niet te heet zou worden) de onderkant van het element ook warm begon te worden door thermische geleiding van de bovenkant naar de onderkant. Dit was dus niet de manier om te gaan regelen.

Ik heb toen het peltier element direct aangesloten op de 12v en heb wee fans achter de koellichamen bovenop gezet en ben die met P.I.D. gaan regelen om de bovenkant een maximale temperatuur te gaan laten halen, en dat werkte beter. Om het geheel autonoom te gaan laten werken ook nog een display aangesloten om de temperatuur van de bovenkant aan te geven, en de waarde die de fans kregen aangestuurd.

Tijdens eerste tests probeerde ik het peltier element aan de bovenkant zo'n 80 graden te laten worden, wat prima ging. Ik kwam er alleen achter dat het temperatuurverschil tussen de bovenkant en onderkant een maximale waarde heeft, dus op het moment dat de bovenkant 80 graden wordt begon het element binnenin ook te verwarmen. Helaas moest ik het bovenste gedeelte dus kouder laten worden dan gepland, maar met zo'n 50 graden bovenop bleef het element binnenin wel koelen.

Na dit een tijdje te hebben laten draaien kwam ik er achter dat het element in de koelkast wel koud bleef, maar de rest van de inhoud niet echt koud werd.. tijd voor nog een ventilator dus. Dit paste echter niet in het koelkastje dat ik had gemaakt, en eigenlijk wilde ik de display ook nog ergens mooi kwijt kunnen, dus moest heb ik het koelkastje opnieuw gemaakt met ruimte voor een fan in de koelkast en ruimte onder de koelkast voor de display. Ook heb ik in de keolkast nog een plaatje aluminium gezet met daarin een tweede thermistor om de temperatuur in de koelkast te kunnen meten.

Na wat code aangepast te hebben en een plexiglazen deurtje er voor heb ik het geheel weer laten draaien.

Het plaatje bovenop wordt mooi heet, de binnenkant niet zo koud als gehoopt, maar ik denk dat hij iets koels wel redelijk koel kan houden.

#include <PID_v1.h>
#include <Thermistor.h>
#include <NTC_Thermistor.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

#define SENSORTOP_PIN             A6
#define SENSORINSIDE_PIN          A7

#define REFERENCE_RESISTANCE   10000
#define NOMINAL_RESISTANCE     10000
#define NOMINAL_TEMPERATURE    25
#define B_VALUE                4300

//Define Variables we'll be connecting to
double Setpoint, Input, Output;
//Define the aggressive and conservative Tuning Parameters

double aggKp=4, aggKi=0.2, aggKd=1;
double consKp=1, consKi=0.05, consKd=0.25;

//Specify the links and initial tuning parameters
PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, DIRECT);
Thermistor* thermistorTop;
Thermistor* thermistorInside;
LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup()
{
  Serial.begin(9600);
    Setpoint = 50;

  thermistorTop = new NTC_Thermistor(
    SENSORTOP_PIN,
    REFERENCE_RESISTANCE,
    NOMINAL_RESISTANCE,
    NOMINAL_TEMPERATURE,
    B_VALUE
  );
  thermistorInside = new NTC_Thermistor(
    SENSORINSIDE_PIN,
    REFERENCE_RESISTANCE,
    NOMINAL_RESISTANCE,
    NOMINAL_TEMPERATURE,
    B_VALUE
  );
  myPID.SetMode(AUTOMATIC);
  
  lcd.init();                      // initialize the lcd 
  lcd.init();
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(5,0);
  lcd.print("BiBrew");
  delay(1000);
  lcd.clear();
}

void loop()
{
    // Reads temperature
  const double celsiusTop = thermistorTop->readCelsius();
  const double celsiusInside = thermistorInside->readCelsius();
  // Output of information
  Serial.print("Top Temperature: ");
  Serial.print(celsiusTop);
  Serial.println(" °C, ");
  Serial.print("Inside Temperature: ");
  Serial.print(celsiusInside);
  Serial.println(" °C, ");

  Input = celsiusTop;
  
  double gap = abs(Setpoint-Input); //distance away from setpoint
  if (gap < 10)
  {  //we're close to setpoint, use conservative tuning parameters
    myPID.SetTunings(consKp, consKi, consKd);
  }
  else
  {
     //we're far from setpoint, use aggressive tuning parameters
     myPID.SetTunings(aggKp, aggKi, aggKd);
  }
  
  myPID.Compute();
  analogWrite(3,255-Output);
  Serial.print("Output Power: ");
  Serial.println(255-Output);
  Serial.println("");
  

  lcd.setCursor(0,0);
  lcd.print("Top: ");
  lcd.print(celsiusTop);
  lcd.print(" \337C");
  
  lcd.setCursor(0,1);
  lcd.print("Inside: ");
  lcd.print(celsiusInside);
  lcd.print(" \337C");
  delay(1000);
}
random_object_build_challenge_2023/random_build_wouter.txt · Last modified: 2023/12/04 12:07 by wrusman