Skocz do zawartości

Pomocna odpowiedź

Napisano

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

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?

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ę.

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ć.

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ć.

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ć...

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 🙂

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.

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

A co Ty byś zrobił gdybyś siedział przed żarówką i miał za zadanie krótko krzyknąć gdy zgaśnie? Nie krzyczeć cały czas gdy jest ciemno. Zastanów się przez chwilę zanim odpowiesz.

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 🙂

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.

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 🙂

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...