Arduino Mega zawiesza się.

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
ODPOWIEDZ
Awatar użytkownika
gwalento
Młodszy majsterkowicz
Posty: 2
Rejestracja: 30 maja 2016, 23:46

Arduino Mega zawiesza się.

Post autor: gwalento » 21 wrz 2018, 15:59

Witam majsterkowiczów,

Obecnie jestem w fazie tworzenia kontrolera do terrarium który odpowiadałby za wilgotność pory dnia oraz temperaturę.
Niestety utknąłem w martwym punkcie, otóż mój program raz na jakiś czas się zawiesza i nie jest to cyklicznie np. co 2 godziny.
Wyczerpała się już moja wiedza ale może któremuś z was uda się odnaleźć błąd w kodzie, będę bardzo wdzięczny za pomoc.

Kod: Zaznacz cały

#include <OneWire.h> //biblioteka od ds18b20 
#include <DS18B20.h> //biblioteka od ds18b20 
#include <DHT.h> //biblioteka od DHT22
#include <DS3231.h> //biblioteka od zegara czasu 
#include <Wire.h>   //biblioteka od wyświetlacza 
#include <LiquidCrystal_I2C.h> //biblioteka od wyświetlacza 4x20 po i2c

#define DHT1PIN 3 //piny dht22
#define DHT2PIN 4 //piny dht22
#define DHT3PIN 5 //piny dht22

#define DHT2TYPE DHT22 //deklaracja typu czujnika

DHT dht1(DHT1PIN, DHT2TYPE); //przypisanie typu czujnika do pinu
DHT dht2(DHT2PIN, DHT2TYPE); //przypisanie typu czujnika do pinu
DHT dht3(DHT3PIN, DHT2TYPE); //przypisanie typu czujnika do pinu

DS3231  rtc(SDA, SCL); //przypisanie pinów do zegara czasu

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  //przypisanie adresu 0x27 w i2c jako wyświetlacz


#define ONEWIRE_PIN 2 //pin czujników DS18B20

#define SENSORS_NUM 4 //ilość czujników DS18B20

const byte address[SENSORS_NUM][8] PROGMEM = 
  { //adresy czujników DS18B20
    0x28, 0xBE, 0x13, 0x30, 0xA, 0x0, 0x0, 0x1A,
    0x28, 0x20, 0x44, 0x2F, 0xA, 0x0, 0x0, 0xDE,
    0x28, 0xD3, 0x3F, 0x2F, 0xA, 0x0, 0x0, 0xE8,
    0x28, 0xB, 0xF3, 0x2F, 0xA, 0x0, 0x0, 0x8E
  };

OneWire onewire(ONEWIRE_PIN);
DS18B20 sensors(&onewire);

int p1 = 30; //przypisanie pinu do przekaźnika
int p2 = 32; //przypisanie pinu do przekaźnika
int p3 = 34; //przypisanie pinu do przekaźnika
int p4 = 36; //przypisanie pinu do przekaźnika
int p5 = 38; //przypisanie pinu do przekaźnika
int p6 = 40; //przypisanie pinu do przekaźnika
int p7 = 42; //przypisanie pinu do przekaźnika
int p8 = 44; //przypisanie pinu do przekaźnika

int zmienna = 0; //zmienna dodatkowa do sprawdzenia działania

void setup() 
{
  rtc.begin(); //urochomieni/wywołanie zegara czasu
  
  sensors.begin(); //uruchomienie DS18B20
  sensors.request(); //uruchomienie DS18B20

  dht1.begin(); //uruchomienie DHT22
  dht2.begin(); //uruchomienie DHT22
  dht3.begin(); //uruchomienie DHT22

  pinMode(p1, OUTPUT); //przekaznik1 jako wyjście
  pinMode(p2, OUTPUT); //przekaznik1 jako wyjście
  pinMode(p3, OUTPUT); //przekaznik1 jako wyjście
  pinMode(p4, OUTPUT); //przekaznik1 jako wyjście
  pinMode(p5, OUTPUT); //przekaznik1 jako wyjście
  pinMode(p6, OUTPUT); //przekaznik1 jako wyjście
  pinMode(p7, OUTPUT); //przekaznik1 jako wyjście
  pinMode(p8, OUTPUT); //przekaznik1 jako wyjście

  digitalWrite(p1, HIGH); //stan początkowy wysoki
  digitalWrite(p2, HIGH); //stan początkowy wysoki
  digitalWrite(p3, HIGH); //stan początkowy wysoki
  digitalWrite(p4, HIGH); //stan początkowy wysoki
  digitalWrite(p5, HIGH); //stan początkowy wysoki
  digitalWrite(p6, HIGH); //stan początkowy wysoki
  digitalWrite(p7, HIGH); //stan początkowy wysoki
  digitalWrite(p8, HIGH); //stan początkowy wysokiki

  lcd.begin(20,4); //uruchomienie LCD 20x4
  lcd.backlight(); //włączenie podwietlenia LCD
  
}

void loop() 
{
  
  float t1 = sensors.readTemperature(FA(address[0])); //sprawdzenie temperatury DS18B20
  float t2 = sensors.readTemperature(FA(address[1])); //sprawdzenie temperatury DS18B20
  float t3 = sensors.readTemperature(FA(address[2])); //sprawdzenie temperatury DS18B20
  float t4 = sensors.readTemperature(FA(address[3])); //sprawdzenie temperatury DS18B20

  float h1 = dht1.readHumidity(); //sprawdzenie wilgotności DHT22
  float tt1 = dht1.readTemperature(); //sprawdzenie temperatury DHT22
  float h2 = dht2.readHumidity(); //sprawdzenie wilgotności DHT22
  float tt2 = dht2.readTemperature(); //sprawdzenie temperatury DHT22
  float h3 = dht3.readHumidity(); //sprawdzenie wilgotności DHT22
  float tt3 = dht3.readTemperature(); //sprawdzenie temperatury DHT22
  
  lcd.setCursor(19,3); //ustawienie kursora na pozycji
  lcd.print(zmienna); //wyświetlenie zmiennej s[prawdzającej działanie 0 lub 1 zmiana co cykl

  if (zmienna == 1){ //zmiana zmiennej z 0 na 1 lub z 1 na 0 co jeden cykl
    zmienna=0;
    }else{
      zmienna++;}

  lcd.setCursor(0,0); //ustawienie kursora na pozycji
  lcd.print(t1); //wyświetlenie temperatury z DS18B20
  lcd.setCursor(0,1); //ustawienie kursora na pozycji
  lcd.print(t2); //wyświetlenie temperatury z DS18B20
  lcd.setCursor(0,2); //ustawienie kursora na pozycji
  lcd.print(t3); //wyświetlenie temperatury z DS18B20
  lcd.setCursor(0,3); //ustawienie kursora na pozycji
  lcd.print(t4); //wyświetlenie temperatury z DS18B20


  lcd.setCursor(7,0); //ustawienie kursora na pozycji
  lcd.print(tt1); //wyświetlenie temperatury z DHT22
  lcd.setCursor(9,0); //ustawienie kursora na pozycji
  lcd.print("/"); //wyświetlenie znaku dodatkowego pomiędzy 
  lcd.setCursor(10,0); //ustawienie kursora na pozycji
  lcd.print(h1); //wyświetlenie wilgotności z DHT22
  lcd.setCursor(7,1); //ustawienie kursora na pozycji
  lcd.print(tt2); //wyświetlenie temperatury z DHT22
  lcd.setCursor(9,1); //ustawienie kursora na pozycji
  lcd.print("/"); //wyświetlenie znaku dodatkowego pomiędzy
  lcd.setCursor(10,1); //ustawienie kursora na pozycji
  lcd.print(h2);//wyświetlenie wilgotności z DHT22
  lcd.setCursor(7,2); //ustawienie kursora na pozycji
  lcd.print(tt3); //wyświetlenie temperatury z DHT22
  lcd.setCursor(9,2); //ustawienie kursora na pozycji
  lcd.print("/"); //wyświetlenie znaku dodatkowego pomiędzy
  lcd.setCursor(10,2); //ustawienie kursora na pozycji
  lcd.print(h3); //wyświetlenie wilgotności z DHT22

  lcd.setCursor(7,3); //ustawienie kursora na pozycji
  lcd.print(rtc.getTimeStr()); //wyświetlenie czasu

  if(t1>=31)
    {
      lcd.setCursor(3,0); //ustawienie kursora na pozycji
      lcd.print("OFF"); //wyświetlenie stanu przekaźnika na lcd 
      digitalWrite(p1, HIGH); //ustawienie stanu wysoki dla przekaźnika
    }
  if(t1<=28)
    {
      lcd.setCursor(3,0); //ustawienie kursora na pozycji
      lcd.print("ON "); //wyświetlenie stanu przekaźnika na lcd
      digitalWrite(p1, LOW); //ustawienie stanu niski dla przekaźnika
    }
  if(t2>=31)
    {
      lcd.setCursor(3,1); //ustawienie kursora na pozycji
      lcd.print("OFF"); //wyświetlenie stanu przekaźnika na lcd
      digitalWrite(p2, HIGH); //ustawienie stanu wysoki dla przekaźnika
    }
  if(t2<=28)
    {
      lcd.setCursor(3,1); //ustawienie kursora na pozycji
      lcd.print("ON "); //wyświetlenie stanu przekaźnika na lcd
      digitalWrite(p2, LOW); //ustawienie stanu niski dla przekaźnika
    }
  if(t3>=31)
    {
      lcd.setCursor(3,2); //ustawienie kursora na pozycji
      lcd.print("OFF"); //wyświetlenie stanu przekaźnika na lcd
      digitalWrite(p3, HIGH); //ustawienie stanu wysoki dla przekaźnika
    }
  if(t3<=28)
    {
      lcd.setCursor(3,2); //ustawienie kursora na pozycji
      lcd.print("ON "); //wyświetlenie stanu przekaźnika na lcd
      digitalWrite(p3, LOW); //ustawienie stanu niski dla przekaźnika
    }
  if(t4>=34)
    {
      lcd.setCursor(3,3); //ustawienie kursora na pozycji
      lcd.print("OFF"); //wyświetlenie stanu przekaźnika na lcd
      digitalWrite(p4, HIGH); //ustawienie stanu wysoki dla przekaźnika
    }
  if(t4<=31)
    {
      lcd.setCursor(3,3); //ustawienie kursora na pozycji
      lcd.print("ON "); //wyświetlenie stanu przekaźnika na lcd
      digitalWrite(p4, LOW); //ustawienie stanu niski dla przekaźnika
    }

  if(h1>=62 && h2>=62 && h3>=62)
    {
      lcd.setCursor(13,0); //ustawienie kursora na pozycji
      lcd.print("OFF");  //wyświetlenie stanu przekaźnika na lcd
      lcd.setCursor(13,1); //ustawienie kursora na pozycji
      lcd.print("OFF"); //wyświetlenie stanu przekaźnika na lcd
      lcd.setCursor(13,2); //ustawienie kursora na pozycji
      lcd.print("OFF"); //wyświetlenie stanu przekaźnika na lcd
    }
  if(h1<=55 || h2<=55 || h3<=55)
    {
      lcd.setCursor(13,0); //ustawienie kursora na pozycji
      lcd.print("ON "); //wyświetlenie stanu przekaźnika na lcd
      lcd.setCursor(13,1); //ustawienie kursora na pozycji
      lcd.print("ON "); //wyświetlenie stanu przekaźnika na lcd
      lcd.setCursor(13,2); //ustawienie kursora na pozycji
      lcd.print("ON "); //wyświetlenie stanu przekaźnika na lcd
    }
    
  delay(1000); //czekaj 1 seknudę
  
  sensors.request(); //wywołanie czujników DS18B20

}

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Awatar użytkownika
Marhef
Złota rączka
Posty: 1061
Rejestracja: 18 lis 2011, 02:18

Re: Arduino Mega zawiesza się.

Post autor: Marhef » 21 wrz 2018, 18:35

Jak masz podłączone przekaźniki?
wchpikus
Młodszy majsterkowicz
Posty: 44
Rejestracja: 7 lut 2015, 20:59

Re: Arduino Mega zawiesza się.

Post autor: wchpikus » 21 wrz 2018, 18:58

Ja mam zle doswiadczenia z czujnikami dth11 oraz dth22.
Po pierwsze czesto nie odpowiadaja crc poprawnie, jesli wyliczasz crc.
Biblioteka oparta na delay, wiec w czasie odczytu zapomnij o reszcie kodu..nie wiem jak w arduino jest.
Obsluga dth..biblioteka jest taka sobie, ja ja musialem poprawiac.
Trwalosc tego czujnika tez daje wiele do zyczenia..nie nadaje sie na zewatrz oraz do wilgotnych srodowisk..koroduje.
Jesli mozesz zamien go na inny czujnik, np si7021.
O wiele lepszy.

Wysłane z mojego SM-G950F przy użyciu Tapatalka



Awatar użytkownika
gwalento
Młodszy majsterkowicz
Posty: 2
Rejestracja: 30 maja 2016, 23:46

Re: Arduino Mega zawiesza się.

Post autor: gwalento » 21 wrz 2018, 19:32

Marhef pisze:
21 wrz 2018, 18:35
Jak masz podłączone przekaźniki?
Przekaźniki to zwykły moduł z aledrogo 8 przekaźników, masa zasilanie 5v i każdy z nich na swój osobny pin wszystko łączone na płytkach stykowych
pawel_123
Młodszy majsterkowicz
Posty: 8
Rejestracja: 6 sie 2018, 12:32

Re: Arduino Mega zawiesza się.

Post autor: pawel_123 » 17 paź 2018, 11:36

Miałem podobnie, przypadkowe zawieszanie arduino, jeśli już sobie poradziłeś, to napiszę dla potomnych.
Sprawdź działanie urządzenia w innym miejscu, u kolegi, z dala od dużych odbiorników, możliwe, że u siebie masz spore zakłócenia, które wywalają arduino, jeśli w innej lokalizacji będzie działać to znaczy kod jest dobry. Wtedy tak jak w moim przypadku rozwiązaniem będzie uruchomienie watchdoga. Arduino samo się zresetuje i będzie działać, w moim przypadku chwilowe restartowanie nie wpływa znacząco na funkcjonalność.
ODPOWIEDZ

Strony partnerskie: