• 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
Podajnik sterowany przez UNO + LCD
#1
Witam! Na wstępie chcę powiedzieć, że jestem całkiem zielony z pisania kodów zrozumiałych dla Arduino. Swoją płytkę posiadam od trzech tygodni.  Ale nie o tym. Narodził mi się pomysł do dorobienia palnika na pellet do mojego pieca c.o.
Palnik z podajnikiem jest i w miarę funkcjonuje. Ale na razie zasilanie załączam ręcznie. Czas na sterowanie. Do pracy jako sterownik działa moje UNO i ProMini.
Skleiłem kody do obsługi LCD + OneWire do ds18b20 dostępne w arduino IDE.  Do tego dwoma przyciskami załączam stan wysoki na dwóch pinach płytki UNO, które są podłączone do pinów Pro mini. Po wciśnięciu "1" promini załącza przekaźnik w pewnej sekwencji czasowej(jeszcze nie ustalona). Po wciśnięciu "2" promini również załącza ten sam przekaźnik ale w innej sekwencji czasowej. Wyświetlacz wskazuje, który " program" jest załączony oraz podaje obecną temperaturę pieca.
Więc o co mi chodzi? Chciałbym to wszystko osiągnąć na jednym Arduino a ponad to potrzebna by mi była "funkcja" żeby UNO po zaniku napięcia "czekało" na wciśnięcie "1 lub 2", bo nie wiem czy po powrocie zasilania na palniku będzie żar.
Ten stan po zaniku napięcia, też ogarnąłem za pomocą dodatkowego przekaźnika (poza arduino) ale jak wspomniałem wolałbym to wszystko zamknąć w kodzie do mojego UNO. Jeśli zdało by to egzamin docelowo chcę wykorzystać do tych celów moje ProMini a z UNO chcę pogłębiać wiedzę w C.
Proszę o podpowiedź czy taka opcja istnieje? Ale z tego co widziałem na you..... jest filmik o nazwie GreenLogic controller testing. Chciałbym osiągnąć coś na wzór tylko prostszy.
Bardzo proszę o wskazówki.

Ps. To może chociaż podpowiedzcie jak zrobić żeby szkic BLINK był uruchamiany tylko i wyłącznie przez chwilowe naciśnięcie przycisku??? A potem żeby działał samoczynnie.
 
Odpowiedź
#2
Wszystko jesteś w stanie zrobić na jednym arduino.
Wskazówki dostaniesz jak zaczniesz pisać konkretnie.
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ź
#3
Dobra inaczej. Jak ja to widzę.
Załączenie zasilania Arduino -> nic się nie dzieje.
Podchodzę , wciskam przycisk (mam na myśli tact switch) o numerze "1" i w tej chwili Arduino załącza przekaźnik na 10sek co uruchamia podajnik pelletu. Potem odczekuje 3min. i znów załącza przekaźnik na 10sek. i tak w koło. Odpowiadało by to stałemu utrzymaniu temp. w granicach 50 - 53 'C.
Ewentualnie podchodzę wciskam przycisk nr "2" i Arduino załącza przekaźnik na 10sek. i odczekuje 5min. Ta pętla również ma trwać do momentu wciśnięcia "1" lub zaniku zasilania. Ta druga pętla utrzymuje temp. na poziomie 40 - 44 'C.  Jest jeszcze jeden przekaźnik, który załącza dmuchawę. Dmuchawa ma działać tylko z programem przycisku "1".
W programie "2" dmuchawa nie jest potrzebna bo ciąg komina i tak robi swoje.
Tak jak napisałem wcześniej wizualizacja wciśniętego przycisku "1 lub 2" na wyświetlaczu LCD 16x2 wraz z obecną temp. na piecu mam już załatwione.
No i kwestia przerw. Jeśli zrobię je na poleceniu delay() to odczyt temperatury może być błędny. Przychodzi mi do głowy tylko polecenie millis() ale nie mam jeszcze wiedzy na ten temat. I nie wiem czy to dobry wybór. Ustawienie czasów podawania oraz przerw jest jeszcze do skorygowania.
Chyba to wszystko .
 
Odpowiedź
#4
A gdzie pytanie?
Skoro wiesz że nie powinieneś używać delay() to nie używaj. Naucz się millis(Przykłady-02.Digital-BlinkWithoutDelay). Dla zrozumienia zasady dziłałania użyj symulatora: https://www.sites.google.com/site/unoardusim/home
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 dzięki Ci za pomoc. Czytam kursy i poradniki odnośnie Arduinio ale za grom nie potrafię uruchomić nawet zwykłego blink'a za pomocą przycisku. A to jest główny problem tego projektu. W związku z tym moja prośba o nakierowanie na polecenia dla UNO aby to działało:
- załączam napięcie -> arduino czeka == nic się nie dzieje;
- wciskam przycisk -> LED MIGA;
- puszczam przycisk -> LED MIGA dalej;
Czas migania LED (180sek -> LOW) oraz ( 10sek -> HIGH) i tak w kółko.
Moje pytanie? Jak tego dokonać?
Ps. Dzięki za symulator. Przyda się.
 
Odpowiedź
#6
(07-03-2017, 19:35)Fuks81 napisał(a): W związku z tym moja prośba o nakierowanie na polecenia dla UNO aby to działało:
 - załączam napięcie -> arduino czeka == nic się nie dzieje;
 - wciskam przycisk -> LED MIGA;
 - puszczam przycisk -> LED MIGA dalej;
Czas migania LED (180sek -> LOW) oraz ( 10sek -> HIGH) i tak w kółko.
Moje pytanie? Jak tego dokonać?
millis().

1. Opanuj symulator - przeczytaj całą dokumentację, zwróć uwagę na pracę krokową, animację.
2. Odpal w symulatorze Blink, z włączoną animacją zobacz że program "stoi" na delay().
3. Odpal BlinkWithoutDelay, zobacz z włączoną animacją że program "nigdzie nie stoi".
4. Przejdź do pracy krokowej aby zrozumieć co się dzieje, jak działa millis(). Proponuję zmienić wtedy interval na mniejszą wartość np 10(bo inaczej Cię palec zaboli).
5. Zmień program aby nie migał od razu ale zaczął parę sekund po starcie.
6. Jak to wszystko opanujesz to wróć po resztę.
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ź
#7
Ta opcja działa tylko na symulatorze. Na UNO niestety NIE. Mam nadzieję, że idę w dobrym kierunku.

Kod:
//BlinkWithoutDelayCount:

const int ledPin =  LED_BUILTIN;

int ledState = LOW;  
int count;

unsigned long previousMillis = 0;  


const long interval = 1000;          

void setup() {
pinMode(ledPin, OUTPUT);
count=0;

}

void loop() {
count=count+1;
if (count>= 5000) {
unsigned long currentMillis = millis();

if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;

if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
digitalWrite(ledPin, ledState);

if (count >= 10000) { //ta opcja- bo licznik przekracza 30 000 i liczy do zera- LED=HIGH:
count = 5000;
}

}
}
}
 
Odpowiedź
#8
Kolego masz w internecie mnóstwo kursów arduino,. Poczytaj zbuduj zobaczysz jak ślicznie dioda potrafi świecić . Każdy z nas zaczął o błyskania 1 potem 2 diodą potem przyciski potencjometr PWN i każdemu z nas dioda świeciła najładniej .
 
Odpowiedź
#9
(07-03-2017, 22:39)Fuks81 napisał(a): Ta opcja działa tylko na symulatorze. Na UNO niestety NIE.
Jaka opcja? 

Cytat:Mam nadzieję, że idę w dobrym kierunku.
Kierunek może i dobry ale wykonanie fatalnie. Skoro nie wykorzystałeś millis() do opóźnienia migania to znaczy że nie rozumiesz jak działa.
Jeśli nie rozumiesz dokumentacji: https://www.arduino.cc/en/Reference/Millis to szukaj w internecie. Arduino jest opisane na wszystkie możliwe sposoby.

Włącz ostrzeżenia kompilatora i wszystkie ostrzeżenia traktuj jak błędy nawet jeśli kompilator powie że kompilacja przebiegła pomyślnie.
Kod programu wstawiaj w tagach code, dodatkowo ma być poprawnie sformatowany(da się to wyklikać). Proponuje też zwiększyć wcięcia(plik preferences.txt pozycja editor.tabs.size=4)
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ź
#10
Witam. Po kilku godzinach analizowania "BlinkWithoutDelay" przerobiłem go, żeby startował z 5-cio sekundowym opóźnieniem. A to linie kodu. DZIAŁA!!!


Kod:
// Blink without Delay



const int ledPin =  LED_BUILTIN;


int ledState = LOW;            

const long interval = 1000;          

void setup() {
 
    pinMode(ledPin, OUTPUT);
    
}

void loop() {
 
    unsigned long currentMillis = millis();
    
    if (currentMillis - previousMillis >= interval) {
        // save the last time you blinked the LED
        
        if (currentMillis < 5000) {    
            previousMillis == 0;
        } else {
            previousMillis = currentMillis;
   
   
                      if (ledState == LOW) {
                ledState = HIGH;
            } else {
                ledState = LOW;
            }
   
   
                      digitalWrite(ledPin, ledState);
        }
    }
}
 Moja interpretacja oryginalnego kodu blink_without_delay:
Kontroler sprawdza czy różnica dwóch zmiennych jest >= interwałowi.
Jeśli warunek jest (false) pomija resztę zadań i dodaje milisekundę do pierwszej zmiennej i sprawdza warunek. I tak do skutku.
Jeśli warunek jest spełniony, wykonuje zadanie czyli:
-zrównuje wartość drugiej zmiennej do wartości pierwszej 
-sprawdza stan diody LED i zmienia go na przeciwny
-itd...

Jeżel zamiast wartości (currentMillis <500) bym podstawił (currentMillis <-1) to program nie ruszy bo warunek nie będzie spełniony.
Co prawda nie wiem co się dzieje gdy odliczanie millis() dojdzie do końcowej wartości (unsigned long).
Jeśli moje założenie jest prawdą to wystarczy dołożyć przycisk i funkcję zmieniającą wartość (<-1) na ( <=0) i jest odpowiedź na moje pytanie z pierwszego postu.
Dobrze myślę?

Ale wymagało to ode mnie nadludzkiego wysiłku umysłowego. A efekt ???
Ps. Mimo wskazówek i tak chyba źle wkleiłem kod.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości