07-06-2017, 02:17
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?
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);
}