resolutie DS18B20

De regels van arduinoforum.nl
Berichten: 1
Geregistreerd: 30 Aug 2021, 18:43

resolutie DS18B20

Berichtdoor badboy » 01 Sep 2021, 21:18

Hallo,
ik heb een broeikaststuring gemaakt met een arduino uno en een DS18b20 temperatuur sensor.
Hiermee stuur ik een SSR aan die een verwarmingselement aanstuurt 230V AC.
Het probleem wat ik nu heb is dat de resolutie van de sensor volgens mijn op 9bit staat. De uitlezing verspringt met 0.5°C.
Ik zou graag de resolutie verzetten naar 12 bit. Daar ik een nauwkeurigheid van +/- 0.4°C moet hebben. Ik heb al enkele codes getest die ik gevonden heb. Ik krijg elke keer een foutmelding.
Er staat al een regel in die de resolutie zou moeten aanpassen. Dit werkt echter niet. Ik heb ook het aantal cijfers achter de komma al verhoogt naar 4. Geen resultaat.
Weet er iemand hoe ik dit moet aanpassen?
De uitlezing van de PWM gaat nu van 0 tot 255. Hoe kan ik deze omzetten van 0 tot 100%?

#include <AutoPID.h>
#include <DallasTemperature.h>
#include <OneWire.h>

#define TEMP_PROBE_PIN 49
#define Heater_PIN 2
#define TEMP_READ_DELAY 800 //can only read digital temp sensor every ~750ms

//pid settings and gains
#define OUTPUT_MIN 0
#define OUTPUT_MAX 255
#define KP 200
#define KI 0
#define KD 0

//Dallas Tempsensor
#define SENSOR_RESOLUTION 12;
unsigned long current = 0;
unsigned long last = 0;
int mode;

double temperature, setPoint = 37.40, outputVal;

OneWire oneWire(TEMP_PROBE_PIN);
DallasTemperature temperatureSensors(&oneWire);

//input/output variables passed by reference, so they are updated automatically
AutoPID myPID(&temperature, &setPoint, &outputVal, OUTPUT_MIN, OUTPUT_MAX, KP, KI, KD);

unsigned long lastTempUpdate; //tracks clock time of last temp update

//call repeatedly in loop, only updates after a certain time interval
//returns true if update happened
bool updateTemperature() {
if ((millis() - lastTempUpdate) > TEMP_READ_DELAY) {
temperature = temperatureSensors.getTempCByIndex(0); //get temp reading
lastTempUpdate = millis();
temperatureSensors.requestTemperatures(); //request reading for next time
return true;
}
return false;
}


void setup() {
pinMode(Heater_PIN,OUTPUT);
Serial.begin(115200);

temperatureSensors.begin();
temperatureSensors.requestTemperatures();
while (!updateTemperature()) {} //wait until temp sensor updated

//if temperature is more than 4 degrees below or above setpoint, OUTPUT will be set to min or max respectively
myPID.setBangBang(4);
//set PID update interval to 4000ms
myPID.setTimeStep(4000);

last = millis();
delay(1000);
}

void loop() {

updateTemperature();
myPID.run(); //call every loop, updates automatically at certain time interval
analogWrite(Heater_PIN, outputVal);

Serial.println ("tmp");

Serial.println( temperature, 4);


Serial.print("pwm");

Serial.println(outputVal);

delay(1000);
}

Advertisement

Berichten: 3662
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: resolutie DS18B20

Berichtdoor shooter » 02 Sep 2021, 10:03

je programma zit niet netjes in elkaar:
het begint bij call repeatedly in loop, maar dat komt pas in de loop er is ook geen call boven
datzelfde geldt voor je 12 bits, eerst de define resolutie doen en dan de dallas definieren.
en ik zie ook geen call dat de arduino de dallas aanroept.
volgorde is echt belangrijk,
de default is trouwens 12 bit (de hoogste) en dan is de resolutie 0.125 graden.
er staat ook bool updatetemperature en dan staat er een { achter, ofwel doe eens ctrl T dan aanpassen komen de procedure te zien
paul deelen
shooter@home.nl

Terug naar Forum regels

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 1 gast