• 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 przy obsłudze przerwań
#1
Witam,
Napisałem 2 programy które teraz chcę połączyć w jeden, ale ciągle nie działa to tak jak bym chciał. Pierwszy program odczytuje z ds18b20 temperaturę i wyświetla na lcd. Drugi program to alarm z czujnikiem pir, buzzerem i klawiaturą, który początkowo wykonałem na switchach,  ale o tym za chwilę. Alarm składa się z 3 trybów monitirowania, gdzie pir jest nieaktywny, czuwania gdzie pir zostaje aktywowany i trzeci tryb alarmu po wykryciu ruchu przez pir. Tak więc oba programy osobno działają tak jak chce problem pojawia się przy próbie równoległego działania. Temperatura wyświetla się poprawenie, jednak sam alarm nie działa optymalnie, znaczące opóźnienia. Zdaję sobię sprawę, że jest to spowodowane pętlami w moim programie, dlatego chciałem przerobić alarm, aby wykonywał się na przerwaniach i tu pojawią się problemy. Alarm praktycznie nie działa. Problem tkwi w przerwaniach, jednak nie jestem w stanie go rozwiązać, czy mógłby mi ktoś pomóc?
Kod:
#define BUZZER 12
#define PIR 2
#define DIODA1 8
#define DIODA2 11
#define dioda 13

#include <Keypad.h> //biblioteka od klawiatury
#include <OneWire.h>                         //dodaj biblitekę LiquidCrystal.h
#include <DallasTemperature.h>               //dodaj biblitekę LiquidCrystal.h
#include <LiquidCrystal_I2C.h>                 //dodaj biblitekę LiquidCrystal.h


int pine_one_wire = A5;                           //Transmisja 1-Wire na pinie A5
OneWire oneWire(pine_one_wire);                   //wywołujemy transmisję 1-Wire na pinie A5




const byte ROWS = 4; // ile wierszy
const byte COLS = 3; //ile kolumn

byte rowPins[ROWS] = {3, 4, 5, 6}; //piny wierszy
byte colPins[COLS] = {7, 9, 10}; //piny kolumn


char keys[ROWS][COLS] = { //mapowanie klawiatury
 {'1','2','3'},
 {'4','5','6'},
 {'7','8','9'},
 {'*','0','#'}
};
Keypad klawiatura = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); //inicjalizacja klawiatury

volatile int stanAlarmu = 1;
int pinAlarmuPozycja = 1;
char pinCyfra1 = '1';
char pinCyfra2 = '2';
char pinCyfra3 = '3';
char pinCyfra4 = '4';


DallasTemperature sensors(&oneWire);         //informujemy Arduino, ze przy pomocy 1-Wire
//chcemy komunikowac sie z czujnikiem

LiquidCrystal_I2C lcd(0x3f, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Ustawienie adresu ukladu na 0x3f

byte znak_stopnia[8] = {                     //tworzymy znak stopnia
 0b00100,
 0b01010,
 0b10001,
 0b01010,
 0b00100,
 0b00000,
 0b00000,
 0b00000
};

void alarm();
void setup() {

 lcd.begin(20,4);   // Inicjalizacja LCD 2x16
 
 lcd.backlight(); // zalaczenie podwietlenia
 lcd.createChar(0, znak_stopnia);           //utworz znak stopnia
 sensors.begin();                           //rozpocznij odczyt z czujnika
 lcd.begin(20, 4);                          //ustaw rozdzielczość ekranu 16x2
 lcd.setCursor(0, 0);                      //ustaw kursor w pozycji 0,0
 lcd.print("Temperatura: ");               //wyswietl "Temperatura: "
 pinMode(dioda, OUTPUT);                       //wyjscie diody
 digitalWrite(dioda, LOW);                     //wylacznie diody

 //------------------------------
 pinMode(BUZZER, OUTPUT);
 //pinMode(KONTAKTRON, INPUT_PULLUP);
 pinMode(PIR, INPUT_PULLUP);
  pinMode(DIODA1,OUTPUT);
  pinMode(DIODA2,OUTPUT);
 digitalWrite(DIODA1,LOW);
 digitalWrite(DIODA2,LOW);

 attachInterrupt(digitalPinToInterrupt(PIR),alarm, RISING);
 

}

void loop() {

   
    lcd.backlight(); // zalaczenie podswietlenia

     sensors.requestTemperatures();            //zazadaj odczyt temperatury z czujnika
     lcd.setCursor(0, 1);
     lcd.print(sensors.getTempCByIndex(0));    //wyswietl wartosc z czujnika 0
     lcd.print((char)0);                       //wyswietl znak stopnia
     lcd.print("C");
     delay(50);                                //odczekaj 50ms
     
     
     //if(stanAlarmu==4)
         //interrupts();
     //else
         //noInterrupts();


   //regulator dwustawny
 if ((sensors.getTempCByIndex(0)) < 24)
 {
       grzalka_on();
   //lcd.print("Grz ON");
 }
 if ((sensors.getTempCByIndex(0)) >= 24)
 {
     grzalka_off();
   //lcd.print("Grz OFF");
 }





 
 char klawisz = 0; //zmienna do przetrzymywania znakow z klawiatury
 int i = 0; //zmienna pomocnicza do pętli
 
 switch(stanAlarmu) { //Wykonywania akcji odpowiedniej dla danego stanu
   case 1:
     //Czuwanie
     digitalWrite(DIODA1,HIGH);
     digitalWrite(DIODA2,LOW);
     //----------------------------------------
     
     klawisz = klawiatura.getKey();
     if (klawisz == '#') { //Czy uzbroic alarm?
       stanAlarmu = 2;
     }  
     
     noTone(BUZZER);  
   break;
   
   case 2:
     //Monitorowanie
      noInterrupts();
     digitalWrite(DIODA1,LOW);
     digitalWrite(DIODA2,HIGH);
     noTone(BUZZER);  

     klawisz = klawiatura.getKey();
     if (digitalRead(PIR) == HIGH) {
       interrupts();
       stanAlarmu = 4; //Natychmiast uruchamiamy alarm
     }
     //-------------------------------------------
     
     else if(klawiatura.getKey()=='*'){
       stanAlarmu = 1;
     }
   break;
 }
}



void grzalka_on(){
   digitalWrite(dioda, HIGH);//stan wysoki
   lcd.setCursor(9, 1);
}

void grzalka_off(){
   digitalWrite(dioda, LOW);//stan niski
   lcd.setCursor(9, 1);
}

     
//      klawisz = klawiatura.getKey();
//      if (klawisz) {
//        //Czy kolejna podana cyfra jest poprawna?
//        if (pinAlarmuPozycja == 1 && klawisz == pinCyfra1) { //Jesli sprawdzamy 1 pozycje PINu
//          pinAlarmuPozycja++; //Cyfra poprawna, mozna sprawdzic na kolejna
//        } else if (pinAlarmuPozycja == 2 && klawisz == pinCyfra2) { //Jesli sprawdzamy 2 pozycje PINu
//          pinAlarmuPozycja++; //Cyfra poprawna, mozna sprawdzic na kolejna        
//        } else if (pinAlarmuPozycja == 3 && klawisz == pinCyfra3) { //Jesli sprawdzamy 3 pozycje PINu
//          pinAlarmuPozycja++; //Cyfra poprawna, mozna sprawdzic na kolejna        
//        } else if (pinAlarmuPozycja == 4 && klawisz == pinCyfra4) { //Jesli sprawdzamy 4 pozycje PINu
//            stanAlarmu = 1; //Wszystkie 4 cyfry kodu sa poprawne      
//        } else {
//           stanAlarmu = 4; //Blad w kodzie PIN - wlacz alarm
//        }
//      }
//    break;    


void alarm(){
     tone(BUZZER, 4300);
//      digitalWrite(DIODA1,HIGH);
//      digitalWrite(DIODA2,HIGH);
//      //delay(50);
//      if(klawiatura.getKey()=='*'){
//        stanAlarmu = 1;
//        //noInterrupts();
//      }
//      tone(BUZZER, 3500);
//      digitalWrite(DIODA1,LOW);
//      digitalWrite(DIODA2,LOW);
//      //delay(50);  
}
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości