Skocz do zawartości

Kurs Arduino II - #7 - termometry analogowe i cyfrowe


Pomocna odpowiedź

Tak, wiem. Nie dało się edytować, od razu dodałem już odpowiedni.

 

Wydaje mi się, że częstotliwość "odpytywania" czujnika nie ma tutaj wpływu, bo aktualna temperatura wyświetla się zawsze prawidłowo. Maksymalna tak samo. Ale bawię się od 3 tygodni więc wiedzę i doświadczenia za bardzo nie mam. I pomysłu co zrobić, by to zadziałało. Ciekawe jest to, że przekopałem sieć i w kilku znalezionych przykładach kod wygląda w ten sam sposób i podobno działa. 

12 godzin temu, gracjuszek10 napisał:

aktualna temperatura wyświetla się zawsze prawidłowo

Bo problem jest w początkowym ustalaniu TempMin.

TempMin odczytywana jest jako druga, zbyt szybko po TempMax, więc otrzymuje wartość 0.

Przy dalszych pomiarach temperatura aktualna jest zawsze większa od 0, więc minimalna pozostaje bez zmian.

Kiedy pierwszy raz oczytujesz temperaturę, to bieżąca, maksymalna i minimalna są identyczne. Więc na początku odczytaj temperaturę, potem zainicjuj wartość max i min.

(edytowany)
Dnia 1.12.2023 o 12:37, Santiago napisał:

Jak inicjujesz zmienną TemperaturaMin tonadaj jej wartość np 50.  Bo jak ma 0 to co ma być zmieniane ?

Tak też robiłem i nadal nie działało. Ten  kod to po prostu jeden z wielu które próbowałem. 

 

Problem już rozwiązany. Faktycznie problemem było to, że tuż po resecie czujnik "pokazywał" temperaturę 0 stopni. Wystarczyło pierwsze pomiary opóźnić o kilka sekund.

Dziękuję za pomoc.

Edytowano przez gracjuszek10
  • Lubię! 1
  • 2 tygodnie później...

Zadanie 7.2

#define LM35_0 A0   //czujnik temp.
#define B_MIN 8   //przyciski temp. min. oraz max.
#define B_MAX 9

float tempMIN = 150;
float tempMAX = 0;
byte clock = 0;

void setup()
{
  Serial.begin(9600);
  pinMode(B_MIN, INPUT_PULLUP);
  pinMode(B_MAX, INPUT_PULLUP);
}

void loop()
{
  float temp = ((analogRead(LM35_0) * 5.0 / 1024.0) * 100);
  clock ++;  //licznik zegara

  if(temp < tempMIN)   //zapis temp. min. do zmiennej
  {
    tempMIN = temp;
  }

  if(temp > tempMAX)   //zapis temp. max. do zmiennej
  {
    tempMAX = temp;
  }

  if(digitalRead(B_MIN) == LOW)
  {
    Serial.print("Temp. MIN: ");
    Serial.print(tempMIN);
    Serial.println("*C\n");

    while(digitalRead(B_MIN) == LOW);   //blokada ponownego wyświetlania podczas trzymania przycisku
    delay(25);                          //zabezpieczenie przed drganiem styku przycisku
    clock = 0;   //reset zegara

  }else if(digitalRead(B_MAX) == LOW)
    {
      Serial.print("Temp. MAX: ");
      Serial.print(tempMAX);
      Serial.println("*C\n");

      while(digitalRead(B_MAX) == LOW);   //blokada ponownego wyświetlania podczas trzymania przycisku
      delay(25);                          //zabezpieczenie przed drganiem styku przycisku
      clock = 0;   //reset zegara

    }else if(clock == 20)   //zegar odliczający 2 sec. przy pomocy koncowego delay(100)
      {
        Serial.print("Aktualna temp: ");
        Serial.print(temp);
        Serial.println("*C\n");
        clock = 0;   //reset zegara
      }

  delay(100);
}

 

  • 1 miesiąc później...
(edytowany)
Treker
Ta treść została wynagrodzona przez moderatora!

VMax otrzymał odznakę: "Korektor (za znalezienie błędu w artykule)"

Link do biblioteki One-Wire w części #7 wygasł. Sugeruję dodanie linku prowadzącego wprost do biblioteki żeby początkujący nie musieli długo szukać.

Edytowano przez VMax
  • Lubię! 1
  • 3 miesiące później...
(edytowany)

Hej,

Z mojej strony 🙂

Zadanie 7.1:

#define LM35_LEFT A5
#define LM35_RIGHT A4

void setup() {
  Serial.begin(9600);
}

void loop() {
  // Przeliczenie odczytu ADC na temperaturę zgodnie z opisem z kursu
  float temperatureLeft = ((analogRead(LM35_LEFT) * 5.0) / 1024.0) * 100;
  float temperatureRight = ((analogRead(LM35_RIGHT) * 5.0) / 1024.0) * 100;

  // Wyświetlanie wyników z czujników obok siebie

  Serial.print("Left: \t");
  Serial.print(temperatureLeft);
  Serial.print(" *C");
  Serial.print("\t");
  Serial.print("Right: \t");
  Serial.print(temperatureRight);
  Serial.print(" *C");
  Serial.println();
  float tempDiff = temperatureLeft - temperatureRight;
  Serial.print("Roznica pomiarow: ");
  Serial.print(tempDiff);
  Serial.print("*C");
  Serial.println();
  
  delay(200);
}

Zadanie 7.2:

 

#define LM35 A5
#define MINBUTTON 3
#define MAXBUTTON 2

float tempMax = 0;
float tempMin = 150;
 
void setup(){
  Serial.begin(9600);

  pinMode(MINBUTTON, INPUT_PULLUP);
  pinMode(MAXBUTTON, INPUT_PULLUP);


  attachInterrupt(digitalPinToInterrupt(MINBUTTON), displayMinTemp, RISING);
  attachInterrupt(digitalPinToInterrupt(MAXBUTTON), displayMaxTemp, RISING);
}
 
void loop(){
  //Przeliczenie odczytu ADC na temperaturę zgodnie z opisem z kursu
  float temperatura = ((analogRead(LM35) * 5.0) / 1024.0) * 100;

  if (temperatura > tempMax) {
    tempMax = temperatura;
  }

  if (temperatura < tempMin){
    tempMin = temperatura;
  }

  Serial.print("Aktualna temperatura: ");
  Serial.print(temperatura);
  Serial.println();

  delay(2000);
}


void displayMinTemp(){
  Serial.print("Min temp: ");
  Serial.print(tempMin);
  Serial.println();
}

void displayMaxTemp(){
  Serial.print("Max temp: ");
  Serial.print(tempMax);
  Serial.println();
}

 

Edytowano przez FTNewbie
Wycięcie zakomentowanego kodu.
  • Lubię! 1
  • 2 lat(a) później...

stworzylem wlasna biblioteke do lm35 plus jezeli odwrotnie podlaczycie lm35 to zacznie sie grzac zalaczam przykladowy kod oraz link do pobrania biblioteki:

#include "LM35.h"

// czujnik LM35 podłączony do A0
LM35 sensor(A0);

void setup() {
  // start komunikacji z komputerem
  Serial.begin(9600);
}

void loop() {
  // bez zmiennej – od razu wypisanie wyniku
  Serial.print("Temperatura: ");
  Serial.print(sensor.readC());
  Serial.println(" C");

  // 1 sekunda przerwy
  delay(1000);
}

https://mega.nz/file/mXIBCCJD#zGOkBoGAoB6-JhujoY9CkHU97fQa5LrI28Rj_6u4RRY

(edytowany)
Dnia 10.11.2018 o 19:38, D3binski napisał:

Pomocy, czujnik analogowy z przyzwyczajenia podłączyłem jak tranzystor używany w kursie i podłączyłem zasilanie. Po poprawieniu podłączeń czujnik zaczął się grzać, stwierdziłem, że się przepalił więc się z nim pożegnałem. Czujnik cyfrowy podłączyłem już dobrze, a mimo to pokazywał -127*C, a gdy go dotknąłem, to myślałem, że moje palce zamieniły się w pieczeń i ułyszałem syczenie (chyba czujnik, a nie płytka). Wolę zaczerpnąć opinii profesjonalisty przed kolejnym podłączeniem arudino, czy mogło dojść do uszkodzenia płytki, czy czujnik cyfowy był uszkodzony fabrycznie itd. 

@D3binski ,  a dales rezystor 4,7kΩ? moze dlatego pokazalo -127°C. jakby co u mnie sie nie przepalil LM35 nawet jak na chwile podlaczylem odwrotnie .  nie mam pewności, ale spróbuj dac inny termometr cyfrowy . jeśli to nie pomoże to może to oznaczać, że to wina arduino, nie termometru DS18B20

Edytowano przez Igor308

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...