• 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
Klawiatura_przerwanie
#1
Witam 
Konstruuje projekt który ma być docelowo systemem monitorowania i bezpieczeństwa układu laboratoryjnego. Mój problem polega na tym że: 

Chciałbym aby po wciśnięciu określonego przycisku na klawiaturze numerycznej program na chwile zatrzymał się pozwolił na wpisanie hasła a później wrócił do normalnej pracy(zbierania danych z czujników) oczywiście w zależności czy hasło jest poprawne. Obecnie program działa w pętli czyli po wciśnięciu przycisku wykonuje się milion innych operacji przez co nie jest możliwe wpisanie hasła. Jak to zozwiązać? Przerwaniem ale czym go zainicjować? Macie jakieś pomysły? 

Poniżej mój kod : 
  

Kod:
// Urzywane biblioteki
#include "DHT.h" // Biblioteka DHT22
#include <OneWire.h> // Biblioteka komunikacji portu szeregowego
#include <DallasTemperature.h> // Biblioteka dla DS18B20
#include <Wire.h> // Biblioteki dla BMP085
#include "Adafruit_BMP085.h"
#include <LiquidCrystal_I2C.h> // Biblioteka dla wyswietlacza
#include <BH1750.h> // Biblioteka  swiatlo
#include <DS3231.h>
#include <SPI.h> // Otwiera port SPI do komunikacji z ethernet shield
#include <SD.h> // Biblioteka karty
#include <Password.h>// Biblioteka dotycząca chasła
#include <Keypad.h> // Klawiatura
                        // Definicje portow dla DHT22
 #define DHTPIN 3  // pin sygnałowy z DHT22
 #define DHTTYPE DHT22 // Wybranie typy detektora DHT22/DHT11
 DHT dht(DHTPIN, DHTTYPE); // Złożenie w jedną zmienna tych dwuch zmiennych

                       // Definicje portow i komunikacji dla DS18B20
 #define ONE_WIRE_BUS 2 // Wejscie pinu sygnałowego jako pin 2
 OneWire oneWire(ONE_WIRE_BUS); // Ustalenie komunikacji z czujnikiem
 DallasTemperature sensors(&oneWire); // definicje portu dotyczące czujnika
 //int tc;
                       // Definicje zmiennych dla BMP 180
 int P;
 Adafruit_BMP085 bmp;
                       // Definicje komunikacji dla BH1750
 BH1750 lightMeter;
                      // Definicje zmiennych czasu
 DS3231 clock;
 RTCDateTime dt;                      
                    // Definicje komunikacji i miennych dla LCD
 #define BACKLIGHT_PIN 3 // pin regulujący podswietlenie ustawiony jako pin 3
 LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7);// adres magistrali 12c wyswietlaca / lub 20
                 // definicje Pinów i zapoczątkowanie działania klawiatury
int ledz = 52;
int pir=53;                  
Password password = Password( "1234" ); // Hasło
const byte ROWS = 4; // Wiersze
const byte COLS = 4; //  Kolumny
char keys[ROWS][COLS] = {
 {'1','2','3','A'},
 {'4','5','6','B'},
 {'7','8','9','C'},
 {'*','0','#','D'}
};
byte rowPins[ROWS] = { 23,25,27,29};// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte colPins[COLS] = { 31,33,35,37 };// Connect keypad COL0, COL1 and COL2 to these Arduino pins.
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

 
void setup() {
Serial.begin(9600);// Dwfinicja odbioru danych  daną prędkoscia
sensors.begin(); // Rozpoczęcie biblioteki DS18b20 // moliwe ustawienie bitów z jakimi ma pracować detektor
dht.begin(); // Rozpoczęcie działąnia DHT22
bmp.begin();  // Rozpoczęcie działania BMP180
lightMeter.begin(); // Rozpoczęcie odczytu z BH1750
clock.begin();// Rozpoczecie odczytu z zegara
clock.setDateTime(__DATE__, __TIME__); // Format casowy
SD.begin(4); // Ropoczęcie komunikacji z modułem sd

lcd.begin(20,4); // Romiar wyswietlacza
lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE); // Ustawienie podswietlenia
lcd.setBacklight(HIGH);// Wlaczenie podswietlenia
pinMode(52, OUTPUT);
pinMode(53,OUTPUT);
keypad.addEventListener(keypadEvent); //Inicjalizacja
}

void loop()  {
 //Klawiatura

keypad.getKey(); // Pobieranie klucza}


              // DHT22
float h = dht.readHumidity();// Odczyt wilgotnosci
float t = dht.readTemperature();// Odczyt temperatury

             //DS18b20
sensors.requestTemperatures(); // Ustabilizuj DS18b20
sensors.getTempCByIndex(0); // odczyt wartossci z DS18b20

            //BMP 180
P = bmp.readPressure()/100; // odczyt cisnienia i wyswietlanie w hPa

            //BH1750
uint16_t l = lightMeter.readLightLevel(); // Odczyt oswietlenia BH1750

             // CZas DS3231
dt = clock.getDateTime(); // przypisanie zmienenj do czasu

            // Wyswietlanie danych w serial monitoże
Serial.println("");
Serial.print(dt.month);  Serial.print("_");
Serial.print(dt.day);    Serial.print("  ");
Serial.print(dt.hour);   Serial.print(":");
Serial.print(dt.minute); Serial.print(":");
Serial.print(dt.second); Serial.println("");
Serial.print("H=");
Serial.print(h);
Serial.print("% ");
Serial.print("Tw=");
Serial.print(t);
Serial.print("*C ");
Serial.print("Tz=");
Serial.print(sensors.getTempCByIndex(0));
Serial.print("*C ");
Serial.print("P=");
Serial.print(P);
Serial.print("hPa ");
Serial.print("E=");
Serial.print(l/10);
Serial.print("lux ");
             // Wyswietlanie danych na lcd
lcd.home();
lcd.print(dt.year);   lcd.print("_");
lcd.print(dt.month);  lcd.print("_");
lcd.print(dt.day);    lcd.print("  ");
lcd.print(dt.hour);   lcd.print(":");
lcd.print(dt.minute); lcd.print(":");
lcd.print(dt.second);
lcd.setCursor(0,1);
lcd.print("Tw=");   lcd.print(t); lcd.print("C");
lcd.setCursor(10,1);
lcd.print("Tz="); lcd.print(sensors.getTempCByIndex(0)); lcd.print("C");
lcd.setCursor(0,2);
lcd.print("P="); lcd.print(P); lcd.print("hPa");
lcd.setCursor(10,2);
lcd.print("E="); lcd.print(l); lcd.print(" lux");
lcd.setCursor(0,3);
lcd.print("H="); lcd.print(h); lcd.print("%");
delay(1000);
// Zapis danych na karte SD

File plik = SD.open("Czyjniki.txt", FILE_WRITE); //otwarcie pliku do zapisu
 if (plik) {
 plik.print("");
 plik.print(dt.year);  plik.print("_");
 plik.print(dt.month);   plik.print("_");
 plik.print(dt.day);     plik.print("  ");
 plik.print(dt.hour);    plik.print(":");
 plik.print(dt.minute);  plik.print(":");
 plik.print(dt.second);
 plik.print(" Tz= "); plik.print(sensors.getTempCByIndex(0)); plik.print("*C");
 plik.print(" Tw= "); plik.print(t); plik.print("*C");  
 plik.print(" H=  ");  plik.print(h); plik.print("%");  
 plik.print(" P=  ");  plik.print(P); plik.print("hPa");
 plik.print(" E=  ");    plik.print(l); plik.print("lux");
 plik.close();
 }
 else {
   Serial.println("Blad przy otwieraniu pliku.");
 }

}
 void keypadEvent(KeypadEvent eKey){
 switch (keypad.getState()){
   case PRESSED:
 Serial.print("Wprowadz haslo: ");
 Serial.println(eKey);
 switch (eKey){
   case '*': checkPassword(); break;
   case '#': password.reset(); break;
   default: password.append(eKey);
    }}}
//Jesli haslo jest poprawne
void checkPassword(){
 if (password.evaluate()){
   Serial.println("Poprawne");
   digitalWrite(52,HIGH);
   digitalWrite(53,LOW);}
  // Jesli nie  
 else{
   Serial.println("Niepoprawne");
   digitalWrite(52,LOW);
   digitalWrite(53, HIGH);
}
}

Z góry dziękuje za każdą pomoc bo zatrzymałem się na tym a jeszcze wiele pracy przedemna a terminy krótkie. 

Pozdrawiam
 
Odpowiedź
#2
Najpierw usuń delay z programu. Dlaczego wyjaśni się po przeczytaniu przewodnika: http://playground.arduino.cc/Main/KeypadTutorial. Zamiast delay użyj millis albo lepiej biblioteki pozwalającej zarządzać zadaniami: ArduinoThreads, SoftTimer itp.
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
Spoko delay usunięte...
Ale to nie rozwiązało problemu.. Nadal nie da się wpisać poprawnego hasła i go sprawdzić. Za każda próba wpisania hasła i sprawdzenia go po wciśnięciu * hasło jest nie poprawne ponieważ program nie przerywa pracy na wpisywanie hasła i jego cyfry są przeplatane z wynikami z czujników.
Macie jakieś propozycje jak to rozwiązać?

W załączniku prt sc jak wyglada serail monitor przy prubie sprawdzenia hasła.
 
Odpowiedź
#4
Programu nie załączyłęś więc ...

Czy wpisywanie hasła działa prawidłowo jeśli usuniesz odpytywanie wszystkich czujników?
Jeśli tak to w momencie wpisywania hasła ustaw zmienną która będzie blokować odpytywanie czujników. Po zakończeniu operacji z hasłem zmienną skasujesz.
Przetestuj to z diodą która normalnie ma migać a w momencie wpisywania hasła nie(użyj millis a nie delay).
Jak to opanujesz to dołącz czujniki.
Aby łatwiej było sterować programem przenieć odpytywanie czujników do funkcji(najlepiej kilku bo nie wszystkie czujniki potrzebujesz odczytywać jednocześnie).
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ź
  


Skocz do:


Przeglądający: 1 gości