Skocz do zawartości

Alarm na arduino


Florian

Pomocna odpowiedź

Witam robię alarm na arduino i mam pewien problem a w zasadzie 2 🙂

Kod wygląda tak :

#include <PCF8574.h>
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <DS3231.h>
#define d1 7//diody
#define d2 8
#define d3 9
#define d4 13

#define d5 10

#define g1 0//guziki
#define g2 1
#define g3 11
#define g4 4

LiquidCrystal_I2C  lcd(0x27,2,1,0,4,5,6,7); // 0x27 is the I2C bus address for an unmodified backpack
PCF8574 expander;
PCF8574 expander2;
DS3231 clock;
RTCDateTime dt;


//String odebraneDane = "";
int guzik1 = LOW;
int guzik2 = LOW;
int guzik3 = LOW;
//unsigned long
unsigned long czas1 = millis();
unsigned long czas2 = millis();
unsigned long czas3 = millis();
unsigned long czas4 = millis();

void setup() {

// activate Expander

expander.begin(0x20);
clock.begin();
 // Set sketch compiling time
 clock.setDateTime(__DATE__, __TIME__);

// activate LCD module
 lcd.begin (16,2); // for 16 x 2 LCD module
 lcd.setBacklightPin(3,POSITIVE);
 lcd.setBacklight(HIGH);
// delay(1000);
 lcd.clear();

Serial.begin(9600);
 pinMode(d1,OUTPUT);
 pinMode(d2,OUTPUT);
 pinMode(d3,OUTPUT);
 pinMode(d4,OUTPUT);
 pinMode(d5,OUTPUT);

 expander.pinMode(g1,INPUT);
 expander.pinMode(g2,INPUT);


 pinMode(g3,INPUT);
 pinMode(g4,INPUT);



 digitalWrite(d1, LOW); //Wyłączenie diod
 digitalWrite(d2, LOW);
 digitalWrite(d3, LOW);
 digitalWrite(d4, LOW);
 digitalWrite(d5, LOW);
}

void loop() {
 dt = clock.getDateTime();

   if (digitalRead(g4) == LOW)
     digitalWrite(d4,HIGH);
     else digitalWrite(d4,LOW);


 if(digitalRead(d5) == HIGH) {
      if(millis() >= czas4){
       digitalWrite(d5, LOW);
      }
     }

         if (digitalRead(d4) == HIGH) {


   lcd.setCursor (0, 1);
   lcd.print("Alarm UZBROJNY");


if (expander.digitalRead(g1) == HIGH) {
     delay(50);
     digitalWrite(d1, HIGH);

     digitalWrite(d2, HIGH);
     digitalWrite(d3, HIGH);
     digitalWrite(d5, HIGH);
     czas4 = millis() + 4000;





     while(digitalRead(d4) == LOW);
     delay(20);
   lcd.setCursor (0, 0);
   lcd.print("Strefa Pierwsza");
    }

     if (expander.digitalRead(g2) == HIGH) {
     delay(50);
     digitalWrite(d2, HIGH);
     digitalWrite(d5, HIGH);
//      tone (d5, 3000, 5000);
     digitalWrite(d1, HIGH);
     digitalWrite(d3, HIGH);
     czas4 = millis() + 4000;
     while(digitalRead(d4) == LOW);
     delay(20);
    lcd.setCursor (0, 0);
    lcd.print("Strefa    Druga");
     }
      if (digitalRead(g3) == HIGH) {
     delay(50);
     digitalWrite(d3, HIGH);
   //   tone (d5, 2000, 5000);
     digitalWrite(d5, HIGH);
     digitalWrite(d1, HIGH);
     digitalWrite(d2, HIGH);
     czas4 = millis() + 4000;
     while(digitalRead(d4) == LOW)
     delay(20);
   lcd.setCursor (0, 0);
   lcd.print("Strefa  Trzecia");
      }


}



else {

  lcd.setCursor (0, 1);
  lcd.print("Alarm ROZBROJONY");

//  lcd.setCursor (7,0);
//  lcd.print("Witaj");
lcd.setCursor ( 0, 0 );
   lcd.print("    ");
   lcd.print(dt.hour);   lcd.print(":");
   lcd.print(dt.minute); lcd.print(":");
   lcd.print(dt.second); 
lcd.setCursor ( 13, 0 );
lcd.print("   ");

 guzik1 = expander.digitalRead(g1);

 if(guzik1 == HIGH) {
   delay(25);
   digitalWrite(d1, HIGH);
   czas1 = millis() + 4000;
 }
  if(guzik1 == LOW) {
   if(millis() >= czas1){
       digitalWrite(d1, LOW);
     }
 }
guzik2 = expander.digitalRead(g2);
 if(guzik2 == HIGH) {
   delay(25);
   digitalWrite(d2, HIGH);
   czas2 = millis() + 4000;
 }
  if(guzik2 == LOW) {
   if(millis() >= czas2){
       digitalWrite(d2, LOW);

     }
 } 
guzik3 = digitalRead(g3);
 if(guzik3 == HIGH) {
   delay(25);
   digitalWrite(d3, HIGH);
   czas3 = millis() + 4000;
 }
  if(guzik3 == LOW) {
   if(millis() >= czas3){
       digitalWrite(d3, LOW);
     }
 }

}
}

diody podpięte przez rezystor a guziki przez rezystor pull down

problem mam z wygaszeniem wszystkich diod jak d4 przechodzi ze stanu niskiego na wysoki,
a drugi problem to zrobienie jakiejś funkcji co by nie trzeba było pisać stałych elementów pod każdy guzik

Link do komentarza
Share on other sites

Chyba żartujesz 😃

Co możemy na to poradzić, że coś Ci nie działa? Napisać kod od początku? Zacząć tłumaczyć Ci jak się pisze takie programy? Skierować do przeczytania jakichś książek? Poradzić, byś przemyślał to raz jeszcze? Może wstawił jakieś komunikaty kontrolne i zaczął analizować co tam takiego sknociłeś, że nie działa? Bo chyba nie myślisz, że będziemy tu przeglądać Twój kod w poszukiwaniu Twoich błędów. Masz kompilator, dwie ręce i mózg. Ty jesteś autorem, sam to napisałeś to sam szukaj błędów i uruchamiaj ten program. Tylko Ty wiesz jak on ma działać i jak działa obecnie. To normalne, że nie działa. To właśnie teraz masz szansę wykazania się tym, że rozumiesz co robisz. Klepać w klawiaturę to i małpa potrafi.

Ale chętnie pokibicujemy, raportuj o postępach.

EDIT: Hm, ciekawa zbieżność poglądów 🙂 To już jakaś plaga z tym wrzucaniem całych programów napisanych na kolanie. Czym to Forum ściąga takich bezradnych ludzi? Czy dzisiaj programy się już tylko pisze, a uruchamiają i debugują się same - dzięki internetowi? Może zostaliśmy w tyle?

Link do komentarza
Share on other sites

marek1707, Popatrz kiedy pojawiły się takie tematy.

Kiedy rejestrowałem się na tym forum 80% postów to były opisy robotów, worklogi i poradniki.

Teraz 80% jest w dziale Arduino i polega na "Napisany w 3 minuty kod mi nie działa, niczego nie próbowałem i nie pomogło, przepiszcie go za mnie!".

EDIT: I ma 0 wspólnego z robotyką. Forum się rozrasta, numerki idą w górę.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

No dobrze, ale czy możemy coś na to poradzić? Czy za mało jest informacji o tym jak uruchamiać (własne!) programy? Jak je najpierw planować, jak budować sensowne struktury danych, jak pisać kod by był debugowalny i testowalny? Chyba nie, przecież to wszystko jest. Napisano na ten temat setki książek, ale.. początkujący chyba o tym nie wiedzą. Może jest to dobry przyczynek do stworzenia kolejnego (obowiązkowego 🙂 ) kursu. Nie o "programowaniu w Arduino", nie o mruganiu diodkami tylko właśnie o tym co i jak zrobić by mrugały jak chcemy. Tylko że to nie jest wykład na godzinę i na trzy strony tekstu 🙁 choć może kilka(set?) przykładów by pomogło 😐

Ja widzę dwa główne problemy: programy opierane na opóźnieniach a mające robić wszystko na raz, oraz całkowity brak podejrzliwości i umiejętności modyfikowania własnego kodu tak by zaczął dobrze działać. Wygląda, jakby program raz napisany miał po prostu działać i albo coś jest popsute albo.. pomóżcie 😥

Florian akurat wykazał się na polu pomiaru czasu i korzysta z millis() - to akurat na plus.

Sprawa odbiegania od tematu Forum to zupełnie inna rzecz. Skoro został założony dział Arduino, to chyba naturalne, że ludzie piszący w tym środowisku przynoszą tu swoje problemy. Dopóki Administracja Forum tego nie czyści, nic mi do tego. Sam nie znam się na robotach ani trochę więc pomagam tam gdzie coś mogę sensownego dorzucić.

Link do komentarza
Share on other sites

Florian, możesz zapisywać poprzedni stan diody i sprawdzać czy się zmienił. Nie czytałem twojego kodu, ale to jest najprostszy sposób na osiągnięcie wykonania czegoś po zmianie jej stanu.

Możesz też zmieniać jej stan wywołując stworzoną do tego funkcję która zrobi to coś zamiast zmieniać stan bezpośrednio.

marek1707, myślę że byłby rynek na tego typu filmiki na YT, typu właśnie "opóźnienia a przerwania, co i kiedy", "debugowanie kodu dla niesamowicie opornych" i tak dalej.

A co do Twojej pomocy to szanuję niesamowicie ogrom wiedzy jaki posiadasz na chyba każdy temat i niesamowicie czytelny sposób w jaki potrafisz się nią dzielić.

Link do komentarza
Share on other sites

Może to dlatego, że przy takich tematach jest jakaś dyskusja, choćby i niekoniecznie taka, jakiej się pytający spodziewał, a pod worklogiem to można co najwyżej przeczytać "fajny robot, gratulacje" i niezbyt jest o czym więcej mówić...

Link do komentarza
Share on other sites

Jestem początkującym "programistą" 🙂 i to jest mój pierwszy projekt i cały czas się uczę stosując to czego już się nauczyłem, myślę ze jak się więcej nauczę to przerobie swój projekt.

Do tej pory nie zajmowałem się zmiennymi bo jakoś mi nie szło w tym temacie, nie wiem która zmienną gdzie zastosować (czy int czy boolean) .

Przyjmę każda pomoc 🙂

Link do komentarza
Share on other sites

To zrób tak, jak ci koledzy wyżej poradzili -- powstawiaj printy i spróbuj zrozumieć co się dzieje. A najlepiej, to napisz mniejszy program który robi tylko to, z czym masz problem -- łatwiej się debuguje wtedy. Jak już dojdziesz co jest źle, to poprawisz w dużym.

Link do komentarza
Share on other sites

zostawiłem 2 diody z kodu d4 i d3

dodałem zmienną :

boolean stan;

w loop dodałem coś takiego:

stan = digitalRead(d4);

if (stan==true)

digitalWrite(d3,LOW);

ale nie wiem jak zrobić żeby wykonało się to tylko raz przy zmianie stanu z false na true

Link do komentarza
Share on other sites

Nie ułatwiasz 🙂

dodam tylko ze cały kod działa i to tak jak chce, mam tylko malutki problemik z którym mogę sobie poradzić 2 razy załączając alarm 🙂

Myślę ze jak poukładam wszystko w bloki i poopisuje to wielu początkujących będzie mogło czerpać przykłady bloków na rożne działania 🙂

Link do komentarza
Share on other sites

Wielu początkujących ma właśnie ten problem, że bezmyślnie kopiuje i skleja kod innych ludzi nie rozumiejąc do końca jak on działa ani nie mając dobrej idei na algorytm własnego programu. Piszą szybciej niż myślą a myślą, że gdy w jednym miejscu kodu umieszczą dwie pętle: jedna mrugająca jedną diodką a druga mrugająca drugą, to będą mrugały dwie.

Nie odpowiedziałeś na pytanie. To nie był żart. Prosisz o pomoc więc też się trochę wysil.

Link do komentarza
Share on other sites

No właśnie cały czas próbuje krótko krzyknąć tylko nie wiem jak i nie wziąłem tego za żart tylko nad tym pracuje 🙂

A co do przykładów to nie każdy kopiuje, niektórzy analizują i tak się dowiadują jak działa jakaś funkcja 🙂

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.