• 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 po dodaniu komend
#1
Witam
Mam zbudowany termometr czterokanałowy z obsługą 2 wyświetlaczy . Wszystko chodziło dobrze , lecz musiałem dodać wyzwalanie pinu cyfrowego po odpowiednim czasie :
Kod:
pinMode(3, OUTPUT);
digitalWrite(3, HIGH);
 delay(1800000 );
 digitalWrite(3, LOW);

Po wstawieniu tego do void setup wyświetlacze nie pokazują już niczego - tylko świecą . Gdzie popełniłem błąd ?
Program przed modyfikacją wyglądał tak:
Kod:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define BACKLIGHT_PIN 3
LiquidCrystal_I2C  lcd(0x27, 2, 1, 0, 4, 5, 6, 7);
LiquidCrystal_I2C  lcd2(0x26, 2, 1, 0, 4, 5, 6, 7);

#define ONE_WIRE_BUS 4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);




DeviceAddress P1 = { 0x28, 0xFF, 0xB6, 0x35, 0xB0, 0x15, 0x3, 0x1F };
DeviceAddress P2 = { 0x28, 0xFF, 0xF5, 0x31, 0xB1, 0x15, 0x1, 0xA1 };
DeviceAddress P3 = { 0x28, 0xFF, 0x42, 0x2F, 0xB0, 0x15, 0x3, 0x85 };
DeviceAddress P4 = { 0x28, 0xFF, 0xDE, 0x2F, 0xB1, 0x15, 0x1, 0x4 };

void setup()
{
 Serial.begin(9600);
 sensors.begin();
 Wire.begin();
 lcd.begin(16, 2);
 lcd2.begin(20,4);
 lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
 lcd.setBacklight(HIGH);
 lcd2.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
 lcd2.setBacklight(HIGH);
 

}
void loop() {
 sensors.requestTemperatures();
 
 int tempC1 = sensors.getTempC(P1);
 int tempC2 = sensors.getTempC(P2);
 int tempC3 = sensors.getTempC(P3);
 int tempC4 = sensors.getTempC(P4);

 lcd.setCursor (0, 0);
 lcd.write("PIEC ");
 lcd.print(tempC1, 1);
 lcd.write(byte(223));

 lcd.setCursor (9, 0);
 lcd.write("WYJ ");
 lcd.print(tempC2, 1);
 lcd.write(byte(223));

 lcd.setCursor (0, 1);
 lcd.write("POWR ");
 lcd.print(tempC3, 1);
 lcd.write(byte(223));

 lcd.setCursor (9, 1);
 lcd.write("MIE ");
 lcd.print(tempC4, 1);
 lcd.write(byte(223));

 

 
   
 sensors.requestTemperatures();{
     

 float tempC1 = sensors.getTempC(P1);
 float tempC2 = sensors.getTempC(P2);
 float tempC3 = sensors.getTempC(P3);
 float tempC4 = sensors.getTempC(P4);
 

 

 lcd2.setCursor (0, 0);
 lcd2.write("TEMP.PIEC    ");
 lcd2.print(tempC1, 1);
 lcd2.write(byte(223));
 
 lcd2.setCursor (0, 1);
 lcd2.write("WYJSCIE PIEC ");
 lcd2.print(tempC2, 1);
 lcd2.write(byte(223));

 lcd2.setCursor (0, 2);
 lcd2.write("POWROT WODY  ");
 lcd2.print(tempC3, 1);
 lcd2.write(byte(223));

 lcd2.setCursor (0, 3);
 lcd2.write("MIESZAJACY   ");
 lcd2.print(tempC4, 1);
 lcd2.write(byte(223));
}




   
}
A po modyfikacji , już nie działający wygląda tak

Kod:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define BACKLIGHT_PIN 3
LiquidCrystal_I2C  lcd(0x27, 2, 1, 0, 4, 5, 6, 7);
LiquidCrystal_I2C  lcd2(0x26, 2, 1, 0, 4, 5, 6, 7);

#define ONE_WIRE_BUS 4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);




DeviceAddress P1 = { 0x28, 0xFF, 0xB6, 0x35, 0xB0, 0x15, 0x3, 0x1F };
DeviceAddress P2 = { 0x28, 0xFF, 0xF5, 0x31, 0xB1, 0x15, 0x1, 0xA1 };
DeviceAddress P3 = { 0x28, 0xFF, 0x42, 0x2F, 0xB0, 0x15, 0x3, 0x85 };
DeviceAddress P4 = { 0x28, 0xFF, 0xDE, 0x2F, 0xB1, 0x15, 0x1, 0x4 };

void setup()
{
 Serial.begin(9600);
 sensors.begin();
 Wire.begin();
 lcd.begin(16, 2);
 lcd2.begin(20,4);
 lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
 lcd.setBacklight(HIGH);
 lcd2.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
 lcd2.setBacklight(HIGH);
 pinMode(3, OUTPUT);
digitalWrite(3, HIGH);
 delay(1800000 );
 digitalWrite(3, LOW);
 
}
void loop() {
 sensors.requestTemperatures();
 
 int tempC1 = sensors.getTempC(P1);
 int tempC2 = sensors.getTempC(P2);
 int tempC3 = sensors.getTempC(P3);
 int tempC4 = sensors.getTempC(P4);

 lcd.setCursor (0, 0);
 lcd.write("PIEC ");
 lcd.print(tempC1, 1);
 lcd.write(byte(223));

 lcd.setCursor (9, 0);
 lcd.write("WYJ ");
 lcd.print(tempC2, 1);
 lcd.write(byte(223));

 lcd.setCursor (0, 1);
 lcd.write("POWR ");
 lcd.print(tempC3, 1);
 lcd.write(byte(223));

 lcd.setCursor (9, 1);
 lcd.write("MIE ");
 lcd.print(tempC4, 1);
 lcd.write(byte(223));


 lcd2.setCursor (0, 0);
 lcd2.write("TEMP.PIEC    ");
 lcd2.print(tempC1, 1);
 lcd2.write(byte(223));
 
 lcd2.setCursor (0, 1);
 lcd2.write("WYJSCIE PIEC ");
 lcd2.print(tempC2, 1);
 lcd2.write(byte(223));

 lcd2.setCursor (0, 2);
 lcd2.write("POWROT WODY  ");
 lcd2.print(tempC3, 1);
 lcd2.write(byte(223));

 lcd2.setCursor (0, 3);
 lcd2.write("MIESZAJACY   ");
 lcd2.print(tempC4, 1);
 lcd2.write(byte(223));





   
}
 
Odpowiedź
#2
Funkcja delay jest odpowiedzialna za ten błąd ten wątek juz tu był gdzieś poruszony musisz użyć innej funkcji np millis
 
Odpowiedź
#3
Tak właśnie się domyślałem . Może ktoś pomoże to zmienić .
 
Odpowiedź
#4
Pomożesz sobie sam tylko przeczytaj: https://techniczny.wordpress.com/2012/04...w-arduino/
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#5
namok teoria słuszna tylko jak zacznie mieszać to z podziwu nie wyjdzie tu masz 1 linijkę do dołożenia efekt ten sam

powinno działać daj zamiast 1800 sek 5 sek i sprawdź

Kod:
void setup() {

pinMode(8 , OUTPUT);  // przekaźnik daj pin jaki tam potrzebujesz

}

void loop() {
  
  if ( (millis()/1000)  < 1800 )digitalWrite(8,HIGH);else digitalWrite(8,LOW); // 1800 to czas do wyłączenia

}
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#6
(30-11-2016, 00:48)Automatyk napisał(a): Funkcja delay jest odpowiedzialna za ten błąd ten wątek juz tu był gdzieś poruszony musisz użyć innej funkcji np millis

(30-11-2016, 08:28)JasQ napisał(a): namok teoria słuszna tylko jak zacznie mieszać to z podziwu nie wyjdzie tu masz 1 linijkę do dołożenia efekt ten sam

powinno działać daj zamiast 1800 sek 5 sek i sprawdź

Kod:
void setup() {

pinMode(8 , OUTPUT);  // przekaźnik daj pin jaki tam potrzebujesz

}

void loop() {
 
 if ( (millis()/1000)  < 1800 )digitalWrite(8,HIGH);else digitalWrite(8,LOW); // 1800 to czas do wyłączenia

}


Dziękuję serdecznie za tą pomoc . Oczywiście  pomogła i uzyskałem zamierzony efekt ale ..... Jeżeli umieściłem fragment :


Kod:
if ( (millis()/1000)  < 20 )digitalWrite(3,HIGH);else digitalWrite(3,LOW);
 sensors.requestTemperatures();

na końcu sekcji void loop() {
to działało jak uprzednio , natomiast dopiero przeniesieniu tego na sam początek void loop() {
zadziałało tak jak trzeba ale .....
I tu muszę wrócić na sam początek i wytłumaczyć po co było potrzebne mi wyzwalanie tego pinu cyfrowego po określonym czasie .
Jak już wspomniałem układ który zbudowałem z "klocków' arduino potrzebny był mi do pomiaru temperatury na piecu CO . Ponieważ mieszkanie jest na piętrze pierwszym a kotłownia w piwnicy a chciałem mieć dokładny podgląd na temperatury zarówno w domu jak i w piwnicy , to zbudowałem taki układ na arduino, że cała centralka i jeden wyświetlacz dwuliniowy jest umieszczony przy piecu , natomiast drugi wyświetlacz czteroliniowy wisi w domu na 10 metrowym kablu połączonym z centralką w piwnicy (wiem że to za duża odległość) . Oba wyświetlacze są na magistrali I2C . I niby cały układzik fajnie hula pokazując wszystkie temperatury . Lekkie problemy pojawiają się po kilkudziesięciu godzinach , gdy czasami wyświetlacz w domu wyświetla jakieś dodatkowe symbole lub zatrzymuje się na jakiejś temperaturze i tak wisi pokazując cały czas to samo . Do tej pory radziłem sobie tak że schodziłem do piwnicy odłączałem na chwilkę zasilanie od arduino i po załączeniu układ znowu działał kilkadziesiąt godzin . Postanowiłem to zmienić . I tu właśnie jest to potrzebne mi wyjście cyfrowe uruchamiane po pewnym czasie . Wymyśliłem sobie że wykorzystam moduł z przekaznikiem który to miał sterować owy pin cyfrowy . Przeciąłem ścieżkę vcc podającą zasilanie do arduinio i przecięte ścieżki podłączyłem do styków przekaznika . Miało to działać tak : Załączam arduino styki przekaznika pozostają zwarte i arduino jest normalnie zasilane . Po upływie zadanego czasu zostaje wyzwolony omawiany pin cyfrowy który wyzwala przekaznik i przekaznik rozłącza zasilanie do arduino . Oczywiście dzieje się to bardzo krótko bo nie mając zasilania przekaznik puszcza i wraca do swojego pierwotnego położenia i znowu włącza zasilanie do arduino . Niestety był to czas za krótki by dobrze zrestartować arduino , a zwiększyć tego czasu nie było jak - chyba przez dodanie jakiegoś elektrolitu podtrzymującego przekaznik jakiś czas bez napięcia . Do tego przeważnie było czasami tak że po ponownym załączeniu przekaznik "cykał cały czas co sekundę . Zostawiłem to i postanowiłem wykorzystać przycisk reset znajdujący się na płytce arduino . Wyprowadziłem od resetu dwa kabelki i podłączyłem do styków przekaznika . I teraz działa to tak że po zadanym czasie arduino uruchamia przekaznik a on zwierając styki powoduje reset arduino . Ale ...... Nie może być dobrze bo po resecie wyświetlacze wskazują już coś takiego jak na zdjęciu drugim (zdjęcie pierwsze pokazuje wskazania wyświetlacza przed wyzwoleniem przycisku reset) Oczywiście sytuacja wraca dopiero do normy po odłączeniu zasilania . Już mi pomału ręce opadają . może ma ktoś jeszcze jakieś pomysły ? 

[Obrazek: przed%20reset.jpg]

[Obrazek: po%20reset.jpg]
 
Odpowiedź
#7
Jeśli to 10m to rs232 powinien działać. Kup zwykłą atmegę 328, zaprogramuj żeby wyświetlała pomiary i czytała dane z arduino przy piecu. Gdyby były problemy to zawsze możesz zastosować konwertery na rs485.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#8
Ja wyświetlanie zrobił bym na przerwaniu programowym w zasadzie ta opcja ma dużo zastosowań.
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#9
Jakiś czas temu walczyłem z identycznym problemem . Niestety te wyświetlacze i na i2c i tak jak ja używam shiftreg są bardzo czułe na różnego rodzaju wyładowania elektrostatyczne jak i potrafią się same wysypać  . Jeżeli tylko wyświetlacz się wyłącza a program pracuje normalnie to nie ma strachu wystarczy dodać

Kod:
long pm = 0;

void setup() {

//twoje setup

}

void loop() {

long cm = millis()/1000;

if ( (cm - pm)  > 60 ){  // 60 czas w sekundach
 lcd2.begin(20,4);
 lcd2.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
 lcd2.setBacklight(HIGH);
}

//tu reszta twojego kodu
}

a jak to nie pomoże ( powinno ale... )

tutaj masz kod dla twojego programu bez przekaźników łączysz jak masz w programie pin 3 z pinem reset zworką ,( to jest tylko dla pinu 3 )


Kod:
void setup() {

DDRD = B00001000;
PORTD = B00001000;
pinMode(5 , OUTPUT);  // przekaźnik daj pin jaki tam potrzebujesz

// tutaj reszta twojego setup

}

void loop() {

 if ( (millis()/1000)  > 8 )digitalWrite(3,LOW); // reset po 8 sekundach
 if ( (millis()/1000)  < 3 )digitalWrite(5,HIGH);else digitalWrite(5,LOW); // dioda kontrolna świeczi 3sek

// tutaj reszta twojego loop

}

można też użyć software reset ale wchodzą w to funkcje związane z wachdog a tego nawet producent atmegi nie zaleca

[Obrazek: OOFjh.jpg]
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#10
Jeszcze raz dzięki . Będę dalej próbował . Ale jeszcze dzisiaj jedną bardzo dziwną rzecz zauważyłem . Pierwsze próby robiłem na nierozpalonym piecu (jak widać na załączonych zdjęciach z temperaturami) I te dziwne wyświetlanie liczb po każdym resecie następowały na zimnym piecu . Natomiast dzisiaj po południu rozpaliłem piec i od tej pory temperatura wyświetlana jest prawidłowo nawet po każdym sprzętowym resecie . Nie wiem o co tu biega . A i przypomniałem sobie że gdy nie miałem jeszcze tego przekaznika resetującego to gdy rozpalałem piec to wszystko wskazywało dobrze a gdy na drugi dzień budziłem się rano to piec już był zimny a na wyświetlaczu wyswietlały się jakieś dziwne znaki . Czy to możliwe aby to prawidłowo chodziło gdy piec jest rozpalony .
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości