• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Czujniki PT100
#1
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 Sad .
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
 
Odpowiedź
#2
PT100 będzie tańczył wskazaniami przy odczycie analogowym na Arduino. Są do tego dedykowane wzmacniacze, jak ten:
https://allegro.pl/oferta/551-modul-wzma...3562231583
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.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
(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-wzma...3562231583
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ć Sad 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 Smile :
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 Smile
 
Odpowiedź
#4
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.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości