• 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 programem (pomiar temperatury i sygnalizacja za pomocą błysków diody led)
#1
Hej, mam problem z programem. Do płytki prawidłowo podłączony jest analogowy czujnik temperatury LM35 oraz dioda LED.
Program działa tak, że dioda miga określoną liczbę razy (liczba ta jest zależna od temperatury). Przedziały mam prawidłowo dobrane. Napięcie wyjściowe na czujniku wynosi 0.25V, więc powinno działać prawidłowo. Dioda zawsze miga TYLKO dwa razy, czyli sygnalizuje temperaturę mniejszą niż 20 stopni. Zmieniałem widełki, ale nic to nie zmieniało.
Postanowiłem zamiast 'else if' wpisać 'if' i po uruchomieniu programu dioda mrugnęła 6 razy, czyli zasygnalizowała temperaturę powyżej 26 stopni. Również zwiększyłem ten próg do 30 stopni z myślą, że złapię ten środkowy przedział, ale nic z tego... Macie jakieś pomysły co jest nie tak? Może to jakaś głupota, ale siedzę, myślę, myślę i nic.
Dodam tylko, że jest to program z książki Arduino - 65 praktycznych projektów. Jestem początkujący, więc proszę o wyrozumiałość. Może polecicie też jakieś ciekawe książki, kursy? Ten na FORBOT mi nie siedzi...
Tutaj jest cały program:
#define led 3
int blinks = 0;

void setup() {

pinMode(led, OUTPUT);
}

int checkTemp(){
  float voltage = 0;
  float celsius = 0;
  float hotTemp = 26;
  float coldTemp = 20;
  float sensor = 0;
  int result;

  sensor = analogRead(A0);
  voltage = (sensor * 5000) / 1023;
  voltage = voltage - 500;
  celsius = voltage / 10;

  if(celsius < coldTemp){
    result = 2;
  }
  else if (celsius >= coldTemp && celsius <= hotTemp){
    result = 4;
  }
  else {
    result = 6;
  }
  return result;
}

void blinkLed(int cycles, int del){
  for(int i = 0; i < cycles; i++){
    digitalWrite(led, HIGH);
    delay(del);
    digitalWrite(led, LOW);
    delay(del);
  }
}

void loop() {

  blinks = checkTemp();
  blinkLed(blinks, 500);
  delay(3000);
}

Z góry dziękuję!!!
 
Odpowiedź
#2
Wypisuj sobie dane na serial monitor ..każda zmienną... Czyli w setup dodaj serial.begin(9600) a później sobie wstaw serial.println(zmienna); ..sprawdź sobie pisownię tych komend na necie w sensie wielkość liter ..zobaczysz sobie gdzi jest problem ...zwłaszcza sprawdź odczyt analogu jakie wartości ci wywala..przykład z neta :


const int lm35_pin = A0; /* LM35 O/P pin */

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

void loop() {
  int temp_adc_val;
  float temp_val;
  temp_adc_val = analogRead(lm35_pin); /* Read Temperature */
  temp_val = (temp_adc_val * 4.88); /* Convert adc value to equivalent voltage */
  temp_val = (temp_val/10); /* LM35 gives output of 10mv/°C */
  Serial.print("Temperature = ");
  Serial.print(temp_val);
  Serial.print(" Degree Celsius\n");
  delay(1000);
}



Strona :
https://www.electronicwings.com/arduino/...rduino-uno
 
Odpowiedź
#3
Mam problem z umiejscowieniem Serial,println(zmienna). Nie wiem gdzie ją wstawić. Jak wrzucam ją do loop(), to wyskakuje błąd, że w tej funkcji nie zdefiniowano tej zmiennej. Coś w tym stylu. Projekt mam podzielony na więcej funkcji niż void setup oraz void loop i nie wiem jak to zrobić.
 
Odpowiedź
#4
(05-11-2025, 19:38)PATRO0902 napisał(a): Mam problem z umiejscowieniem Serial,println(zmienna). Nie wiem gdzie ją wstawić. Jak wrzucam ją do loop(), to wyskakuje błąd, że w tej funkcji nie zdefiniowano tej zmiennej. Coś w tym stylu. Projekt mam podzielony na więcej funkcji niż void setup oraz void loop i nie wiem jak to zrobić.
 
Wypisz zmienną sensor - zaraz po odczytaniu analogRead() w checkTemp().
Tylko że ta zmienna jest float - trochę niepotrzebnie, wystarczy int, ale na początek może być.
Nie wiem czy wejścia analogowego, a konkretnie przetwornika ADC nie trzeba skonfigurować - musi wiedzieć jakie jest napięcie odniesienia, tryb pomiary itp.
LM35 o ile pamiętam, ma 10mV na stopień, przetwornik w AVR ma 10 bitów, czyli 1024 poziomy. Jeśli podasz 5V jako napięcie odniesienia, rozdzielczość pomiaru napięcia będzie wynosiła 5V/1024 daje jakieś 5mV, więc zmiana temperatury o 1 stopien to tylko różnica wartości odczytanej o 2, to trochę mało, wyniki ADC zwykle trochę pływają.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości