• 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
dlaczego błąd w kodzie
#1
Dzięki jednemu z kolegów na forum zacząłem przygodę z arduino. Mam pierwsze moje wypociny jednak napotkałem na jakiś błąd który mi wyświetla jak weryfikuje cały kod i nie wiem co jest nie tak. Proszę o pomoc.

Błąd (expected unqualified-id before 'if') wyświetla mi pod koniec w linijce:
if (sensors.getTempCByIndex(TH2) <= T1 - H1 || sensors.getTempCByIndex(TH1) <= T2 - H3) {

Kod:
// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 and 3 on the Arduino
#define TH1 2
#define TH2 3

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(TH1&&TH2);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

int przekaznik1 = 8; // zmienna o nazwie przekaźnik1 na pinie 8
int przekaznik2 = 9; // zmienna o nazwie przekaźnik2 na pinie 9

int T1 = 55; // zmienna o nazwie T1 (max temp bojl)
int T2 = 40; // zmienna o nazwie T2 (temp zał podł)
int T3 = 75; // max temperatura TH1 powyżej której elektrozawór się otworzy
int T4 = 25; // min temperatura TH2 przy której elektrozawór się otworzy
int H1 = 5; // zmienna o nazwie H1 (hist wył bojl i podł)
int H2 = 8; // zmienna o nazwie H2 (hist)
int H3 = 5; // zmienna o nazwie H3 (hist wył podł)
/*
   The setup function. We only start the sensors here
*/
void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("Termostat 1.0");

  // Start up the library
  sensors.begin();

  pinMode(przekaznik1, OUTPUT); //pin o nazwie przekaźnik1 ustawiony jako wyjście
  pinMode(przekaznik2, OUTPUT); //pin o nazwie przekaźnik2 ustawiony jako wyjście
  digitalWrite(przekaznik1, LOW); //pin o nazwie przekaźnik1 ustawiony na stan niski
  digitalWrite(przekaznik2, LOW); //pin o nazwie przekaźnik2 ustawiony na stan niski

}

/*
   Main function, get and show the temperature
*/
void loop()
{
  sensors.requestTemperatures(); // wysyła polecenie żeby otrzymać temperaturę

  while (sensors.getTempCByIndex(TH1) < 0 || sensors.getTempCByIndex(TH1) > 100 || sensors.getTempCByIndex(TH2) < 0 || sensors.getTempCByIndex(TH2) > 100) {
    sensors.requestTemperatures(); // wysyła polecenie żeby otrzymać temperaturę
    digitalWrite(przekaznik1, LOW);
    digitalWrite(przekaznik2, LOW);
    if (sensors.getTempCByIndex(TH1) < 0 || sensors.getTempCByIndex(TH1) > 80)
      Serial.println("błąd czujnika 1"); //pokazuje na monitorze
    if (sensors.getTempCByIndex(TH2) < 0 || sensors.getTempCByIndex(TH2) > 80)
      Serial.println("błąd czujnika 2"); //pokazuje na monitorze
  }
  // Używamy funkcji ByIndex, i pokazujemy temperaturę tylko w tym przypadku z jednego czujnika
  Serial.print("Temperatura na czujniku TH1 to: ");
  Serial.println(sensors.getTempCByIndex(TH1));
  Serial.print("Temperatura na czujniku TH2 to: ");
  Serial.println(sensors.getTempCByIndex(TH2));

  /*
    działanie przekaźnika 1:
  */
  if (sensors.getTempCByIndex(TH1) < T3 || sensors.getTempCByIndex(TH2) > T4) { // warunek aby wykonać wykonać dalszy program program związany z przekaźnikiem 1
    if (sensors.getTempCByIndex(TH2) >= T1 || sensors.getTempCByIndex(TH1) <= sensors.getTempCByIndex(TH2)) { //jeśli wartość temperatury z czujnika 2 jest większa lub równa niż T1 lub jeśli temperatura z czujnika 1 jest mniejsza lub równa niż z czujnika 2
      digitalWrite(przekaznik1, HIGH);
    }
    if (sensors.getTempCByIndex(TH2) <= T1 - H1 || sensors.getTempCByIndex(TH1) >= sensors.getTempCByIndex(TH2) + H2) { //jeśli wartość temperatury z czujnika 2 jest mniejsza lub równa niż T1-H1 || jeśli temperatura z czujnika 1 jest większa lub równa niż z czujnika 2+H2
      digitalWrite(przekaznik1, LOW);
    }
  }
  else {
    digitalWrite(przekaznik1, LOW);
  }
}

/*
  działanie przekaźnika 2:
*/
if (sensors.getTempCByIndex(TH2) >= T1 && sensors.getTempCByIndex(TH1) >= T2) { //jeśli wartość temperatury z czujnika 2 jest większa lub równa niż T1 i jednocześnie jeśli temperatura z czujnika 1 jest większa lub równa T2
  digitalWrite(przekaznik2, HIGH);
}
if (sensors.getTempCByIndex(TH2) <= T1 - H1 || sensors.getTempCByIndex(TH1) <= T2 - H3) { //jeśli wartość temperatury z czujnika 2 jest mniejsza lub równa niż T1-H1 lub jeśli temperatura z czujnika 1 jest mniejsza lub równa T2-H3
  digitalWrite(przekaznik2, LOW);
}
}
 
Odpowiedź
#2
Zwróć uwagę, gdzie kończy Ci się pętla loop.
 
Odpowiedź
#3
(08-01-2020, 17:59)Agregacik napisał(a): Zwróć uwagę, gdzie kończy Ci się pętla loop.
Jesteś wielki   Big Grin

Pisząc o jednym z kolegów na forum myślałem właśnie o Tobie. Dobrze, że mnie zmobilizowałeś do nauki bo coraz bardziej mi się to podoba  Big Grin
 
Odpowiedź
#4
Mam kolejny problem. Mój program nie widzi czujników.  Nie jest to problem z samą instalacją na płytce bo jak wgrałem na arduino przykład do czujnika DS18b20 to wszystko działa jak należy. A więc po prostu czegoś w programie nie uwzględniłem. Monitor portu pokazuje mi "Błąd czujnika 1" i "Błąd czujnika 2" z pętli while
Podaje mój program poniżej:

Kod:
// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 and 3 on the Arduino
#define TH1 2
#define TH2 3

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(TH1&&TH2);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzasCyrkulacji = 0;
unsigned long czasCzekaniaCyrkulacji = 1500000; // 25 minut
unsigned long czasPompyCyrkulacji = 60000; // czas działania pompy cyrkulacji 1 minuta

int przekaznik1 = 8; // zmienna o nazwie przekaźnik1 na pinie 8
int przekaznik2 = 9; // zmienna o nazwie przekaźnik2 na pinie 9
int przekaznik3 = 10; // zmienna o nazwie przekaźnik3 na pinie 10

int T1 = 55; // zmienna o nazwie T1 (max temp bojl)
int T2 = 40; // zmienna o nazwie T2 (temp zał podł)
int T3 = 75; // max temperatura TH1 powyżej której elektrozawór się otworzy
int T4 = 25; // min temperatura TH2 przy której elektrozawór się otworzy
int T5 = 50; // temperatura TH1 powyżej której będzie działać cyrkulacja
int T6 = 45; // temperatura TH2 powyżej której będzie działać cyrkulacja
int H1 = 5; // zmienna o nazwie H1 (hist wył bojl i podł)
int H2 = 8; // zmienna o nazwie H2 (hist)
int H3 = 5; // zmienna o nazwie H3 (hist wył podł)
/*
   The setup function. We only start the sensors here
*/
void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("Termostat 1.0");

  // Start up the library
  sensors.begin();

  pinMode(przekaznik1, OUTPUT); //pin o nazwie przekaźnik1 ustawiony jako wyjście
  pinMode(przekaznik2, OUTPUT); //pin o nazwie przekaźnik2 ustawiony jako wyjście
  pinMode(przekaznik3, OUTPUT); //pin o nazwie przekaźnik2 ustawiony jako wyjście
  digitalWrite(przekaznik1, LOW); //pin o nazwie przekaźnik1 ustawiony na stan niski
  digitalWrite(przekaznik2, LOW); //pin o nazwie przekaźnik2 ustawiony na stan niski
  digitalWrite(przekaznik3, LOW); //pin o nazwie przekaźnik3 ustawiony na stan niski
}

/*
   Main function, get and show the temperature
*/
void loop()
{
  aktualnyCzas = millis();
  sensors.requestTemperatures(); // wysyła polecenie żeby otrzymać temperaturę

  while (sensors.getTempCByIndex(TH1) <= 0 || sensors.getTempCByIndex(TH1) > 100 || sensors.getTempCByIndex(TH2) <= 0 || sensors.getTempCByIndex(TH2) > 100) {
    sensors.requestTemperatures(); // wysyła polecenie żeby otrzymać temperaturę
    digitalWrite(przekaznik1, LOW);
    digitalWrite(przekaznik2, LOW);
    if (sensors.getTempCByIndex(TH1) < 0 || sensors.getTempCByIndex(TH1) > 80)
      Serial.println("błąd czujnika 1"); //pokazuje na monitorze
    if (sensors.getTempCByIndex(TH2) < 0 || sensors.getTempCByIndex(TH2) > 80)
      Serial.println("błąd czujnika 2"); //pokazuje na monitorze
  }
  // Używamy funkcji ByIndex, i pokazujemy temperaturę tylko w tym przypadku z jednego czujnika
  Serial.print("Temperatura na czujniku TH1 to: ");
  Serial.println(sensors.getTempCByIndex(TH1));
  Serial.print("Temperatura na czujniku TH2 to: ");
  Serial.println(sensors.getTempCByIndex(TH2));

  /*
    działanie przekaźnika 1:
  */
  if (sensors.getTempCByIndex(TH1) < T3 || sensors.getTempCByIndex(TH2) > T4) { // warunek aby wykonać wykonać dalszy program program związany z przekaźnikiem 1
    if (sensors.getTempCByIndex(TH2) >= T1 || sensors.getTempCByIndex(TH1) <= sensors.getTempCByIndex(TH2)) { //jeśli wartość temperatury z czujnika 2 jest większa lub równa niż T1 lub jeśli temperatura z czujnika 1 jest mniejsza lub równa niż z czujnika 2
      digitalWrite(przekaznik1, HIGH);
    }
    if (sensors.getTempCByIndex(TH2) <= T1 - H1 || sensors.getTempCByIndex(TH1) >= sensors.getTempCByIndex(TH2) + H2) { //jeśli wartość temperatury z czujnika 2 jest mniejsza lub równa niż T1-H1 || jeśli temperatura z czujnika 1 jest większa lub równa niż z czujnika 2+H2
      digitalWrite(przekaznik1, LOW);
    }
  }
  else {
    digitalWrite(przekaznik1, LOW);
  }


  /*
    działanie przekaźnika 2:
  */
  if (sensors.getTempCByIndex(TH2) >= T1 && sensors.getTempCByIndex(TH1) >= T2) { //jeśli wartość temperatury z czujnika 2 jest większa lub równa niż T1 i jednocześnie jeśli temperatura z czujnika 1 jest większa lub równa T2
    digitalWrite(przekaznik2, HIGH);
  }
  if (sensors.getTempCByIndex(TH2) <= T1 - H1 || sensors.getTempCByIndex(TH1) <= T2 - H3) { //jeśli wartość temperatury z czujnika 2 jest mniejsza lub równa niż T1-H1 lub jeśli temperatura z czujnika 1 jest mniejsza lub równa T2-H3
    digitalWrite(przekaznik2, LOW);
  }
  /*
    działanie przekaźnika 3:
  */
  if (sensors.getTempCByIndex(TH1) >= T5 && sensors.getTempCByIndex(TH2) >= T6 && aktualnyCzas - zapamietanyCzasCyrkulacji >= czasCzekaniaCyrkulacji) {
    digitalWrite(przekaznik3, HIGH);
    zapamietanyCzasCyrkulacji = aktualnyCzas;
    if (aktualnyCzas - zapamietanyCzasCyrkulacji >= czasPompyCyrkulacji) {
      digitalWrite(przekaznik3, LOW);
    }
  }
}
 
Odpowiedź
#5
Proponuję najpierw postarać się odczytać i zapisać wartość temperatur do zmiennych np Temperatura_1 i Temperatura_2 i wyświetlić to na konsoli.
Tu jest o tym https://forbot.pl/blog/kurs-arduino-ii-t...20-id18414
Czujniki mogą być podłączone do jednego wejścia, jak jest w przykładzie z dwoma czujnikami.
Ty chcesz odczytać temperaturę z czujników o indeksach 2 i 3 a masz tylko 0 i 1 więc może tu problem. Mylisz indeksy z wejściami.
Pochuchaj na czujniki, sprawdź czy zmienia się temperatura.
Jak to będzie już działać to dopisuj resztę programu, wykorzystując zmienne z odczytaną temperaturą.
Jest trochę namieszane w kodzie jak w "cygańskim tobołku", ale pomału stopniowo dojdziesz do celu.
Brakuje po if nawiasów { }. Zobacz gdzie.
Nie jestem ekspertem i mogę się mylić więc jak coś nie tak napisałem to proszę mnie poprawić.
 
Odpowiedź
#6
Właśnie nie chciałbym podłączać dwóch czujników do jednego pinu. Dlatego zrobiłem transmisje 1-wire na dwóch pinach. I nazwałem je TH1 i TH2. Do każdego pinu podpiąłem jeden czujnik. Trzeba zapisywać wartość temperatury? Nie wystarczy wywołać czujnik i odnosić się do wskazanej przez niego temperatury?

A jaki mam wpisać indeks chcąc odwołać się do temperatury z czujnika wpiętego w określony pin?
 
Odpowiedź
#7
Temperatura jest czytana z "przecinkiem" więc float.
Może lepiej wywołuj czujniki po adresie i wtedy nie będzie problemu. Jest przykład w podanym linku.
Wydaje mi się, że zapis temperatury do zmiennej i jej wyświetlenie na ekranie, jest lepsze podczas budowania programu.
Widzimy co odczytaliśmy i teraz to porównujemy z zadanymi wartościami.
Ciągłe pytać czujnik jaka temperatura to jest natręctwo Smile. Pytaj raz na kilka sekund i to wystarczy. Czasem może się wkurzyć i nie odpowiadać Smile
 
Odpowiedź
#8
No te argumenty mnie przekonały. Więc tak zrobię. Jednak wolałbym na przyszłość jakoś przypisać czujnik z określonego pinu a nie adresu do danej zmiennej. Nie masz jakiegoś pomysłu jak tego dokonać?

Swoją drogą dobrze, że czujnik się na mnie nie wkurzył za to natręctwo :) A masz jakieś doświadczenia jak lepiej go zasilać, tradycyjnie czy pasożytniczo?
 
Odpowiedź
#9
Nie ćwiczyłem podpięcia czujników do różnych pinów. Wywołanie po adresie wydaje się dobrym rozwiązaniem, ale wymaga zmiany adresu w kodzie w razie jego wymiany.
Według mnie lepiej zasilać tradycyjnie i do tego na zasilaniu, jak najbliżej czujnika dać kondensator ceramiczny 100nF.
Nie wiem dlaczego ale spotkałem się z kilkoma czujnikami co "zawieszały" się po pewnym czasie. Dodanie kondensatora rozwiązywało sprawę.
Może jutro poćwiczę z ciekawości z czujnikami na różnych portach.
 
Odpowiedź
#10
Byłoby miło jakbyś mógł to sprawdzić. Chciałbym po prostu zawsze wiedzieć, że jeśli podepnę jakikolwiek czujnik do konkretnego pinu to zawsze program będzie wiedział o co mi chodzi - żebym nie musiał ich zamieniać kolejnością. Ale już mi bardzo dużo pomogłeś. Dziękuję Smile
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości