• 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
#11
Udało uaktywnić dwa czujniki na dwóch różnych pinach. Oczywiście nie bez pomocy internetu  Tongue Masz jakieś sugestie co mógłbym ulepszyć?

Wygląda to teraz tak:
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 ONE_WIRE_BUS_1 2
#define ONE_WIRE_BUS_2 3

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire_1(ONE_WIRE_BUS_1);
OneWire oneWire_2(ONE_WIRE_BUS_2);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature czujnik_TH1(&oneWire_1);
DallasTemperature czujnik_TH2(&oneWire_2);

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

float TH1 = 0; // zapamiętana temperatura z czujnika TH1
float TH2 = 0; // zapamiętana temperatura z czujnika TH2

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
  czujnik_TH1.begin();
  czujnik_TH2.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();
  if (aktualnyCzas - zapamietanyCzasPomiaruTemp >= 5000UL){// sprawdzanie temperatury co 5 sekund
  czujnik_TH1.requestTemperatures(); // wysyła polecenie żeby otrzymać temperaturę z czujnika TH1
  TH1 = czujnik_TH1.getTempCByIndex(0);
  czujnik_TH2.requestTemperatures(); // wysyła polecenie żeby otrzymać temperaturę z czujnika TH2
  TH2 = czujnik_TH2.getTempCByIndex(0);
  zapamietanyCzasPomiaruTemp = aktualnyCzas;
  }
  while (TH1 <= 0 || TH1 > 100 || TH2 <= 0 || TH2 > 100) {
  czujnik_TH1.requestTemperatures(); // wysyła polecenie żeby otrzymać temperaturę z czujnika TH1
  TH1 = czujnik_TH1.getTempCByIndex(0);
  czujnik_TH2.requestTemperatures(); // wysyła polecenie żeby otrzymać temperaturę z czujnika TH2
  TH2 = czujnik_TH2.getTempCByIndex(0);
    digitalWrite(przekaznik1, LOW);
    digitalWrite(przekaznik2, LOW);
    if (TH1 < 0 || TH1 > 80) {
      Serial.println("błąd czujnika 1"); //pokazuje na monitorze
    }
    if (TH2 < 0 || TH2 > 80) {
      Serial.println("błąd czujnika 2"); //pokazuje na monitorze
    }
    delay(3000);
  }
  // Używamy funkcji ByIndex, i pokazujemy temperaturę tylko w tym przypadku z jednego czujnika
  Serial.print("Temperatura na czujniku TH1 to: ");
  Serial.println(TH1);
  Serial.print("Temperatura na czujniku TH2 to: ");
  Serial.println(TH2);

  /*
    działanie przekaźnika 1:
  */
  if (TH1 < T3 || TH2 > T4) { // warunek aby wykonać wykonać dalszy program program związany z przekaźnikiem 1
    if (TH2 >= T1 || TH1 <= 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 (TH2 <= T1 - H1 || TH1 >= 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 (TH2 >= T1 && 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 (TH2 <= T1 - H1 || 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 (TH1 >= T5 && TH2 >= T6 && aktualnyCzas - zapamietanyCzasCyrkulacji >= czasCzekaniaCyrkulacji) {
    digitalWrite(przekaznik3, HIGH);
    zapamietanyCzasCyrkulacji = aktualnyCzas;
  }
  if (aktualnyCzas - zapamietanyCzasCyrkulacji >= czasPompyCyrkulacji) {
    digitalWrite(przekaznik3, LOW);
  }
}
 
Odpowiedź
#12
Zrobiłem sam odczyt temperatury na dwóch pinach A0 i A1 według mnie nie ma potrzeby używać #define bo deklaracja występuje tylko raz w kodzie i to na samym początku.
Odczyt temperatury jest w podprogramie co według mnie jest rozwiązaniem bardziej eleganckim niż pisanie ciurkiem kodu w pętli loop. Staram się pisać programy właśnie w ten sposób, co daje przejrzystość kodu i łatwiej wyłapać błędy.
W załączeniu mój kod. 
Kod:
#include <OneWire.h>
#include <DallasTemperature.h>

OneWire oneWire_1(A0);
OneWire oneWire_2(A1);
DallasTemperature sensors_1(&oneWire_1);
DallasTemperature sensors_2(&oneWire_2);
float Temp_1;
float Temp_2;
unsigned long czasPomiaruTemp;

void setup(void)
{
  Serial.begin(9600);
  sensors_1.begin(); //Inicjalizacja czujnikow
  sensors_2.begin();
}

void loop(void)
{
  pomiarTemp ();
}

void pomiarTemp ()
{
  if (millis() - czasPomiaruTemp > 5000UL) // odczyt tempetatury co 5 sekund
  {
  sensors_1.requestTemperatures();
  sensors_2.requestTemperatures();
  Temp_1 = sensors_1.getTempCByIndex(0);
  Temp_2 = sensors_2.getTempCByIndex(0);
  czasPomiaruTemp = millis();
 
  Serial.print("Pierwszy: ");
  Serial.println(Temp_1);  //Wyswietlenie informacji
  Serial.print("Drugi: ");
  Serial.println(Temp_2);  //Wyswietlenie informacji
 
  }
 
}

EDIT
Widzę, że poradziłeś sobie nieźle z tym sprawdzeniem czy jest prawidłowy odczyt z czujników. Ja bym tylko w warunku dla while dał nie TH1 > 100 i TH2 >100 ale TH1 > 80 i TH2 >80.
Zauważyłem, że w pewnych sytuacjach awaryjnych biblioteka od czujnika wystawia wartość 85 co by spełniało warunek while i nie było by poprawnego sprawdzenia czy odczyt jest OK zwłaszcza, że niżej dajesz warunek TH1 > 80 i TH2 > 80. Efekt były taki że pętla while się kręci ale nie daje informacji na konsolę, czy może w przyszłości na wyświetlacz, że jest awaria.
 
Odpowiedź
#13
Dzięki za pochwałę Smile jeszcze parę dni temu nie uwierzyłbym że coś takiego napiszę.
Też mi raz pokazało 85 jak mi kabelek nie łączył. Zrobię tak jak piszesz. Czyli w pętli loop piszesz jakie ma wykonać pętle, a później piszesz czego te pętle dotyczą? A mam jedno pytanko: dlaczego czasami widzę, że niektórzy piszą void loop(void), a czasami tylko void loop() ? Pewnie zadaje jakieś banalne pytanie Smile

Myślę, że wypadałoby już dodać podgląd temperatur na wyświetlaczu. Korzystniejszy jest wyświetlacz z magistralą I2C czy bez? Jakie są plusy i minusy?
 
Odpowiedź
#14
Zacząłem przygodę z arduino pewnie ze dwa lata temu. Wcześniej wydawało mi się to czarną magią i że tylko święci mogą to robić czyli programować Smile. Jak popatrzyłem synowi z za pleców co on pisał programując to miałem wielki szacun dla niego, teraz też mam. Czasem jak się zjawi w domu to mi coś pomoże, ale głównie przy gotowych bibliotekach coś poprawi, zmieni, dopisze.
Z tym (void) to niech się mądrzejsi wypowiedzą. void o ile wiem znaczy nieważny pusty czy coś w tym rodzaju, czyli pisząc (void) czy ( ) jest obojętne.
Co do wyświetlacza to według mnie tylko po I2C. I2C działa po 4 przewodach razem z + zasilania, więc jest wygodniejsze, może wolniejsze, ale tego nie wiem. Taki wyświetlacz mi się udało "wynieść" na kilkanaście metrów od arduino. Pewnie znowu będę zrugany za to, że o tym piszę, bo I2C nie do tego służy, ale jak się da i nie jest to krytyczne zastosowanie, czyli nie odpowiada za bezpieczeństwo i nie stwarza zagrożenia, to dlaczego nie spróbować. W Twoim przypadku trzeba sprawdzić czy odłączenie I2C od wyświetlacza nie spowoduje zatrzymania się programu w jakimś miejscu czyli zawieszenie programu, nie wyświetlacza bo to wystąpi na pewno.
Lubię eksperymentować, są ludzie, którzy wiedzą, że czegoś nie da się zrobić i nie robią, ale są i tacy co nie wiedzą i robią to Smile.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości