• 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
Problem z odczytem wartości pinu analogowego
#1
Cześć
Chciałem sobie zrobić na zimę dodatkowe elektryczne podgrzewanie do auta, 3 świece żarowe po 10A każda zamontowane w aluminiowej obudowie i wpięte szeregowo przed nagrzewnicę w samochodzie.
Sterowanie miało odbywać się na zasadzie pomiaru napięcia akumulatora (ładowany lub nie - silnik odpalony lub nie) oraz temperatury wody w układzie chłodzenia.

Na płytce stykowej wszystko działa perfekcyjnie, pomiar temperatury, pomiar napięcia, sterowanie przekaźnikiem jednak po montażu wartości są niezgodne. Arduino pokazuje napięcie (po dzielniku) 4.25V a faktycznie jest tam 3.85v. Ta rozbieżność prowadzi do nieprzerwanego włączania grzałki.

Kod mimo że nie jest jakiś piękny wydaje mi się być w porządku skoro prototyp na biurku działa.

Kod:
#define THERMISTORPIN A1
#define THERMISTORNOMINAL 4700
#define TEMPERATURENOMINAL 25
#define NUMSAMPLES 5
#define BCOEFFICIENT 3950
#define SERIESRESISTOR 10000


#include <Wire.h>
#include <math.h>

int temp;
int samples[NUMSAMPLES];
float input_voltage = 0.0;

#define grzalka 7
#define LED1 4    //zielona
#define LED2 6    //czerwona
#define przycisk 2


void setup()
{

    pinMode(grzalka, OUTPUT);
    pinMode(LED1, OUTPUT);
    pinMode(LED2, OUTPUT);
    pinMode(przycisk, INPUT_PULLUP);
 pinMode(A1, INPUT);
    pinMode(A7, INPUT);

    Serial.begin(9600);
    //analogReference(EXTERNAL);
}

void loop()
{
{
    int analog_value = analogRead(A7);
    input_voltage = ((analog_value * 5.0)/ 1023.0) * 3.2;
    Serial.print("Napiecie: ");
    Serial.println(input_voltage);
}
    {
        uint8_t i;
        float average;

        for (i=0; i< NUMSAMPLES; i++) {
        samples[i] = analogRead(THERMISTORPIN);
        delay(10);
    }

      average = 0;
   for (i=0; i< NUMSAMPLES; i++) {
       average += samples[i];  }

     average /=NUMSAMPLES;
          
          // convert the value to resistance
          average = 1023 / average - 1;
          average = SERIESRESISTOR / average;
//          Serial.print("Thermistor resistance ");
//          Serial.println(average);

              float steinhart;
              steinhart = average / THERMISTORNOMINAL;     // (R/Ro)
              steinhart = log(steinhart);                  // ln(R/Ro)
              steinhart /= BCOEFFICIENT;                   // 1/B * ln(R/Ro)
              steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
              steinhart = 1.0 / steinhart;                 // Invert
              steinhart -= 273.15;                         // convert to C
       temp = steinhart;
       if(temp < -50 && temp > 150){
         temp = 150; }

         
 
       }
    
     Serial.print("Temperatura: ");
     Serial.println(temp);

{
 
 if(input_voltage > 12.8 && input_voltage < 16) {
   delay(3000);
   digitalWrite(LED1, HIGH);
   
   if(temp < 60){
     digitalWrite(grzalka, HIGH);
     digitalWrite(LED2, HIGH);     }
     
   if(temp >= 60) {
     digitalWrite(grzalka, LOW);
     digitalWrite(LED2, LOW);}
   
 }
 else {
   digitalWrite(grzalka, LOW);
   digitalWrite(LED1, LOW);}
   delay(500);

}

}
Będę wdzięczny za każdą pomoc  Shy


Załączone pliki Miniatury
   
 
Odpowiedź
#2
Według mnie słabe zasilanie lub kiepski dzielnik (oporniki z różnych materiałów)'
Po pierwsze ustaw port na stan wysoki i pomiar miernikiem czy masz 5V. Jak nie masz miernika to masz komendę na załączenie napięcia odniesienia i potem serial print powinno być 1023.
Co do dzielnika to użyj 4 x10 k tylko jednakowych . Czyli pomiar masz do 20V.
 
Odpowiedź
#3
Witam,
Czy w:
steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro)

1/B * ln(R/Ro) to ma być:
- 1/ (B * ln(R/Ro))
czy też:
- ln(R/Ro) / B
??
Bo jest to drugie.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości