Hi,
Om mijn mini oven die ik aan het ontwerpen ben heb ik een sensor nodig met voldoende hoge resolutie en welke niet afhankelijk is van bedradings eigenschappen.
Op het ogenblik gebruik ik hier meet NTC's voor die bij 25C 5K zijn.
Deze zou ik 4 draads kunnen uitvoeren om het wat beter te doe, maardat geeft ook weer meer draden naar buiten met natuurlijk energie lek.
Dus ik ben in mijn Temperatuur sensorbak gedoken en heb er een STM172 uit gehaald waarmee het mogelijk is redelijk snel een hoge resolutie temperatuur meting te doen.
De uitkomst wil ik dan middelen voor een wat stabielere uitlezing.
Deze sensor is een digitaal model, zodat bedradings weerstand geen rol speeld.
Het probleem is dat ik de code die ik hieronder laat zien niet goed begrijp, het zal echt iets in de basis zijn, maar ik begrijp de opset niet goed, waarom dit zo gedaan is.
Ik gebruik een stukje Arduino code die in een Library zit die voor de Arduino is gemaakt voor de STM172 Sensor.
Laat ik eerst even de code zien en dan ga ik verder met mijn vraag.
c code:
/*
Demo sketch for the SMT172 library.
This sketch is intended for the ATmega328P (Uno, Nano, Pro Mini etc.)
There is no timer2 on the ATmega32U4 (Pro Micro)
The ICP1 pin is not exposed on the Mega2560R3 board so timer4 or timer5 must be
used requiring a modification of the SMT172 library. This board also uses
different pins for timer2.
This sketch will output to serial.
Connect the output of the SMT172 to pin 8 (Input Capture Pin of timer 1)
Timer 2 is set up in phase correct PWM and output a duty cycle of
10.98% ~-45.06 C on pin 3 and a duty cycle of 92.94% ~139.58 C on pin 11
Connect pin 8 to pin 3 or pin 11 to check the working if no SMT172 is available
*/
#include <arduino.h>
#include <SMT172.h>
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7); // 0x3F is the I2C bus address for an unmodified backpack of a PCF8574A
uint32_t LastSensorUpdate;
void setup() {
// activate LCD module
lcd.begin (16,2); // for 16 x 2 LCD module
lcd.setBacklightPin(3,POSITIVE);
lcd.setBacklight(HIGH);
lcd.clear();
Wire.begin();
Serial.begin(115200);
pinMode(8, INPUT);
pinMode(12, OUTPUT);
// The following code fragment sets up phase-correct PWM on pins 3 and 11 (Timer 2).
// The waveform generation mode bits WGM are set to to 001 for phase-correct PWM.
// The other bits are the same as for fast PWM.
pinMode(3, OUTPUT);
pinMode(11, OUTPUT);
TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM20);
// TCCR2B = _BV(CS22); // Output frequency: 16 MHz / 64 / 255 / 2 = 490.196 Hz
TCCR2B = _BV(CS21); // Output frequency: 16 MHz / 8 / 255 / 2 = 3921.569 Hz
OCR2A = 237; // Output A duty cycle: 237 / 255 = 92.94% = 129.58 C on pin 11
OCR2B = 28; // Output B duty cycle: 28 / 255 = 10.98% = -45.06 C on pin 3
}
void loop() {
// read the sensor every 250 millisecond
if ((unsigned long) (millis() - LastSensorUpdate) >= 250) {
LastSensorUpdate = millis();
SMT172::startTemperature(0.001);
repeat:
switch (SMT172::getStatus()) {
case 0: goto repeat; // O Dijkstra, be merciful onto me, for I have sinned against you :)
case 1: Serial.print(F("Measuring time [ms]: "));
Serial.println(SMT172::getTime() * 1e3, 2); // convert to milliseconds
Serial.print(F("Sensor frequency [Hz]: "));
Serial.println(SMT172::getFrequency(), 2);
Serial.print(F("Duty cycle [%]: "));
Serial.println(SMT172::getDutyCycle() * 100, 2);
Serial.print(F("Temperature [C]: "));
Serial.println(SMT172::getTemperature(), 4);
Serial.print(F("Error [mK]: "));
Serial.println(SMT172::getError() * 1000, 2);
Serial.println();
// Bram frutsel om temperatuur op het LCD te krijgen
lcd.clear();
lcd.home(); // set cursor to 0,0
lcd.setCursor (0,0);
lcd.print("SMT172 ");
lcd.print(SMT172::getTemperature(), 4);
lcd.print(" C");
// Bram frutsel om temperatuur op het LCD te krijgen
break;
case 2: Serial.println(F("**** Sensor disconnected ****"));
Serial.println();
delay(10); // delay in between reads for stability
}
}
}
Om dus de temperatuur op het display te krijgen moet ik het stukje code "Bram Frutsel" binne het "Repeat" deel zetten.
Ik krijg de waarde (SMT172::getTemperature(), 4) niet buiten deze Repeat functie.
Dus wat zal de rede zijn dat de Library/Code maker dit zo heeft uitgevoerd en hoe kan ik de temperatuur functie buiten die Repeat functie krijgen voor andere functies zoals
status LED aansturing en het middelen dat ik wil gaan doen?
Twee van de vijf 2x 16 LCD die ik op voorraad had werkte er maar, ik dacht dat ik gek werd gisteren avond, had ook nog een nieuwe i2c printje en een nieuwe LCD display Bingo en het werkte.
Natuurlijk had ik met een i2c scanner het adres van het conversie printje achterhaald, daar zat het niet in, wel een beetje vreemd, maar nu geen probleem meer, het werkt met het nieuwe spul.
En ja, natuurlijk ook de contrast instelling gecontroleerd en bij display wissel een power cycle gedaan.
Plaatje van de simpele test setup, hier wordt de plastic TO92 versie gebruikt, ik heb hem ook nog in "metal can" die een wat hogere nauwkeurigheid heeft.
Ik hoor graag van jullie hoe ik de temperatuur gewoon in de loop kan gebruiken voor verdere bewerking.
Dank vast en groet,
Bram