Czujniki PT100 - Alfiszcze666 - 16-05-2023
Witam.
Mam szafę podgrzewającą zawartość w której zaszyte są czujniki PT100. Chińska elektronika sterująca grzałkami padła. Chciałbym wykorzystać do sterowania przekaźnikami arduino. Ale w pisaniu kodu to ja orłem nie jestem .
Wyszperałem kod do używania cyfrowych czujników temp i dopisałem sterowanie przekaźnikami i działał idealnie... Ale potrzebuję wykorzystać zaszyte w szafie analogowe PT100. Znalazłem kod do odczytu wartości z pt100 i on działa ale po dopisaniu linijek odpowiedzialnych za przekaźniki na pinie D5 warjuje napięcie a co za tym idzie przekaźnik.
Czy podpowie ktoś jak dopisać żeby na D5 pokazywała się stała wartość przy zadanej temperaturze??
Dokładnie żeby wynik z "takeReading" wypisywany na serialu jako "temp" określał stan pinu D5 jako HIGH lub LOW przy odpowiednich wartościach odczytanych z analogowego pinu.. Bo widzę że te wartości są przekazywane na D5 bez stałej wartości.
Z góry dziękuję za pomoc lub wskazówkę co poprawić.
Kod:
/* This code calculates the temperature using a PT100,
* circuit diagram can be found here:https://circuits.io/circuits/2962051-reading-temperature-from-pt100#schematic
* The circuit has a temperature range of -51.85 to 129.87 degrees C
* or -61.33 to 265.73 degree fahrenheit.
*
* As the temperature equation fro the PT100 requires you to know the
* resistance of it, you'll need to convert the voltage to a resistance
* and this can be done by using y=mx+c formula(Rx=m*V+Roff) Rx is the pt100
* resistance, m is the slope(ohms/volt), v is the voltage read into the analog pin
* and Roff is the offset resistance(should be close to the real value you use when calculated.
*
* To calculate the slope, you need to have the PT100 at steady state(settle at one temp)
* and measure its resistance then measure the voltage at analog pin, do this for again at a different
* temp.
* Now we can find m: m=(R2-R1)/(V2-V1) eg from simulator (150-80)/(4.97-0.036)
* m = 14.187 ohms/volt
* to find c just fill one of the values into the Rx=m*V+c
* c = 150-14.187*4.97 = 79.489ohms
*
* Written by Roboro
* Github: https://github.com/RonanB96/Read-Temp-From-PT100-With-Arduino
* Circuit: https://circuits.io/circuits/2962051-reading-temperature-from-pt100/edit#breadboard
* Blog: https://roboroblog.wordpress.com
* Instrustable Post:http://www.instructables.com/id/Reading-Temperature-From-PT100-Using-Arduino/
*/
// You'll need to download this timer library from here
// http://www.doctormonk.com/search?q=timer
#include "Timer.h"
// Define Variables
float V;
float temp;
float Rx;
int relepin = 5; // pin przekaźnika 4
// Variables to convert voltage to resistance
float C = 79.489;
float slope = 14.187;
// Variables to convert resistance to temp
float R0 = 100.0;
float alpha = 0.00385;
int Vin = A5; // Vin is Analog Pin A0
Timer t; // Define Timer object
void setup() {
Serial.begin(9600); // Set Baudrate at 9600
pinMode(Vin,INPUT); // Make Vin Input
pinMode(relepin, OUTPUT); // przekaźnik
t.every(1000,takeReading); // Take Reading Every 100ms
}
void loop() {
t.update(); // Update Timer
if(analogRead(0) <= 28.00){ digitalWrite(relepin, HIGH);} // jeśli temperatura jest mniejsza niż ... stopni, włącz przekaźnik
if(analogRead(0) >= 40.00){ digitalWrite(relepin, LOW);}//jeśli tempo. więcej niż 30, a następnie wyłącz przekaźnik
}
void takeReading(){
// Bits to Voltage
V = (analogRead(Vin)/1023.0)*5.0; // (bits/2^n-1)*Vmax
// Voltage to resistance
Rx = V*slope+C; //y=mx+c
// Resistance to Temperature
temp= (Rx/R0-1.0)/alpha; // from Rx = R0(1+alpha*X)
// Uncommect to convet celsius to fehrenheit
// temp = temp*1.8+32;
Serial.println(temp);
}
Wysłane z mojego RMX3085 przy użyciu Tapatalka
RE: Czujniki PT100 - kaczakat - 16-05-2023
PT100 będzie tańczył wskazaniami przy odczycie analogowym na Arduino. Są do tego dedykowane wzmacniacze, jak ten:
https://allegro.pl/oferta/551-modul-wzmacniacza-max31865-przetwornik-pt100-13562231583
Odczyt po SPI, biblioteki też pewnie znajdziesz.
Jak pin tańczy, to znaczy odczyty też. Zamiast sterować pinem na początek wydrukuj sobie pomiary stabilnej temperatury na serial i pokaż jak to wygląda.
12 punktów ADC to bardzo mały zakres, możesz tu wstawić ewentualnie mały kondensator 100n. Ale sam szum ADC to +/- 10 punktów ADC, czyli odczytujesz głównie zakres szumu ADC.
Powinieneś też uśredniać pomiary, czyli 10x odczytujesz ADC i zamiast analogRead(0) wstawiasz w to miejsce średnią z 10 pomiarów.
W kodzie definiujesz pin A5 jako ten do odczytu, a potem czytasz bezpośrednio z analogRead(0), zrób porządki w kodzie.
RE: Czujniki PT100 - Alfiszcze666 - 17-05-2023
(16-05-2023, 16:57)kaczakat napisał(a): PT100 będzie tańczył wskazaniami przy odczycie analogowym na Arduino. Są do tego dedykowane wzmacniacze, jak ten:
https://allegro.pl/oferta/551-modul-wzmacniacza-max31865-przetwornik-pt100-13562231583
Odczyt po SPI, biblioteki też pewnie znajdziesz.
Precyzja uzyskana za pomocą 150 omowego rezystora mi w zupełności wystarcza. To nie musi być mega precyzyjne sterowanie. +/- 2 stopnie nie robi tragedii.
Jak pin tańczy, to znaczy odczyty też. Zamiast sterować pinem na początek wydrukuj sobie pomiary stabilnej temperatury na serial i pokaż jak to wygląda.
Kod: 15:28:35.398 -> 25.43
15:28:41.404 -> 25.43
15:28:47.399 -> 25.43
15:28:53.406 -> 25.43
15:28:59.398 -> 25.43
15:29:05.408 -> 25.43
15:29:11.412 -> 25.43
15:29:17.409 -> 25.43
15:29:23.402 -> 25.43
12 punktów ADC to bardzo mały zakres, możesz tu wstawić ewentualnie mały kondensator 100n. Ale sam szum ADC to +/- 10 punktów ADC, czyli odczytujesz głównie zakres szumu ADC.
Powinieneś też uśredniać pomiary, czyli 10x odczytujesz ADC i zamiast analogRead(0) wstawiasz w to miejsce średnią z 10 pomiarów
Nie mam zielonego pojęcia jak to zrobić i nie jestem pewien czy to jest bardzo potrzebne przy tym projekcie.
.
W kodzie definiujesz pin A5 jako ten do odczytu, a potem czytasz bezpośrednio z analogRead(0), zrób porządki w kodzie.
Zrobiłem tak i działa :
Kod: void takeReading(){
// Bits to Voltage
V = (analogRead(Vin)/1023.0)*5.0; // (bits/2^n-1)*Vmax
// Voltage to resistance
Rx = V*slope+C; //y=mx+c
// Resistance to Temperature
temp= (Rx/R0-1.0)/alpha; // from Rx = R0(1+alpha*X)
// Uncommect to convet celsius to fehrenheit
// temp = temp*1.8+32;
Serial.println(temp);
if(temp <= 25.00){ digitalWrite(relepin, HIGH);} //
if(temp >= 38.00){ digitalWrite(relepin, LOW);}//
}
Teraz sytuacja taka że powielam "takeReading" jako "takeReading1" itd. dla pozostałych czujników i w teorii jest ok .... ale przy starcie wszystkie przekaźniki się uruchamiają i wtedy wszystkie 6 grzałek startuje i 36A leci z sieci i po bezpiecznikach. Jakiś pomysł żeby te grzania działały sekwencyjnie ? Max 2 szt. jednocześnie a idealnie to po 1 sztuce >> dojście do 38 stopni i kolejna sekcja bez względu ze kolejna lub poprzednia już się ochłodziła ?
Jeszcze raz dziękuję za pomoc bo faktycznie walnałem babola w kodzie i bez kopniaka bym nie szukał gdzie zrobiłem problem
RE: Czujniki PT100 - Irvin - 17-05-2023
No może masz jakieś wyjątkowe Arduino, na wypadek gdyby mnie pamięć myliła podłączyłem sobie dzielnik rezystorowy pod A0 i sprawdziłem jak to działa, tylko poprosiłem program, by odnotował jakie jest min i max odczytane ADC:
478 Max=484 Min= 416 SRD= 479 34.62 po przeliczeniu na stopnie
Jak w programie masz próg przełączania powiązany z odczytem adc 28 do 40, a ja mam rozrzut ponad 100 na ADC i to przełączanie jest związane bardziej z układem planet niż pomiarem temperatury, przynajmniej u mnie.
Pewnie można tego tak użyć, tylko progi przełączania muszą być szersze niż szum, wyciągać średnią z wielu pomiarów, na czas pomiarów użyć trybów usypiania dla ADC.
Też radziłbym jednak jakiś moduł do odczytu PT100.
Jak chcesz coś robić w programie to trzeba jakoś ogarniać upływ czasu, możesz np. wykorzystać millis lub tę bibliotekę timer. Masz w opisie wywołanie co 100 ms, ale zmieniłeś na 1000. Można coś robić co 1000 wywołując przerwanie co 10ms. Wystarczy w każdym wywołaniu mieć jakiś licznik "licznik++" i potem prostymi działaniami podzielić sobie pracę tak by nie robić wszystkiego w tej samej chwili:
if (licznik%5==0) //- co pięć wartości licznik, gdy reszta z dzielenia jest równa 0;
if (licznik%5==1) //- co pięć wartości licznik, gdy reszta z dzielenia jest równa 1;
if(licznik%100==0) //- co 1s;
Oba przypadki wykonają coś w interwale 50ms, przy inkrementacji licznik++ co 10ms, ale to będą inne wywołania tego przerwania. Trzeci robi coś gdy licznik dobił do 100 lub wielokrotności.
W między czasie możesz podjąć decyzję czy włączyć kolejną grzałkę czy nie.
Tak samo można z millis, jest przykład BlinkWithOutDelay w Arduino wywołania zmiany stanu led co 1000ms, można czas zamienić na 10ms, zamiast zmieniać stan led zwiększasz wartość licznika i w tym obiegu led liczyć sobie które to jest kolejne wywołanie dziesiątki ms.
Można tez grzałkami sterować triakiem, wysterować je płynnie, albo jedną sterować płynnie od 0-100%, a pozostałe dołączać ON/OFF jak trzeba przeskoczyć na kolejny próg mocy i znowu dawkować tą pierwszą od 0.
|