Stránka 1 z 1

Konflikt knihoven

Napsal: 27 pro 2020, 19:03
od Axamith
Pracuji na projektu, ve kterém používám membránovou klávesnici Matrix 4x4 a teplotní čidlo dallas DS18B20.
Samostatně procují obě periferie bez potíží, viz příklady :

Kód: Vybrat vše

/* @file CustomKeypad.pde
|| @version 1.0
|| @author Alexander Brevig
|| @contact alexanderbrevig@gmail.com
||
|| @description
|| | Demonstrates changing the keypad size and key values.
|| #
*/
#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
  {'0','1','2','3'},
  {'4','5','6','7'},
  {'8','9','A','B'},
  {'C','D','E','F'}
};
byte rowPins[ROWS] = {3, 2, 1, 0}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {7, 6, 5, 4}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 

void setup(){
  Serial.begin(9600);
}
  
void loop(){
  char customKey = customKeypad.getKey();
  
  if (customKey){
    Serial.println(customKey);
  }
}

Kód: Vybrat vše

/********************************************************************/
// First we include the libraries
#include <OneWire.h> 
#include <DallasTemperature.h>
/********************************************************************/
// Data wire is plugged into pin 2 on the Arduino 
#define ONE_WIRE_BUS 2 
/********************************************************************/
// Setup a oneWire instance to communicate with any OneWire devices  
// (not just Maxim/Dallas temperature ICs) 
OneWire oneWire(ONE_WIRE_BUS); 
/********************************************************************/
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);
/********************************************************************/ 
void setup(void) 
{ 
 // start serial port 
 Serial.begin(9600); 
 Serial.println("Dallas Temperature IC Control Library Demo"); 
 // Start up the library 
 sensors.begin(); 
} 
void loop(void) 
{ 
 // call sensors.requestTemperatures() to issue a global temperature 
 // request to all devices on the bus 
/********************************************************************/
 Serial.print(" Requesting temperatures..."); 
 sensors.requestTemperatures(); // Send the command to get temperature readings 
 Serial.println("DONE"); 
/********************************************************************/
 Serial.print("Temperature is: "); 
 Serial.print(sensors.getTempCByIndex(0)); // Why "byIndex"?  
   // You can have more than one DS18B20 on the same bus.  
   // 0 refers to the first IC on the wire 
   delay(1000); 
} 
Ve chvíli, kdy tyto kódy sloučím, nastane problém. Výsledek posílám na LCD, při měření teploty mi začne vynechávat snímání klávesnice. musím konkrétní klávesu stisknout několikrát, než "se chytne" a vypíše znak. Stačí zakomentovat příkaz k měření

Kód: Vybrat vše

sensors.requestTemperatures(); 
a klávesnice vypisuje znaky bez potíží. Experimentoval jsem s různými verzemi knihoven pro teplotní čidlo, ale se stejným výsledkem. Napadá někoho, co by mohlo být kamenem úrazu?

Sloučený kód :

Kód: Vybrat vše

#include <OneWire.h> 
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h> // LCD I2C 20x4
#include <Keypad.h>

#define ONE_WIRE_BUS 13 

OneWire oneWire(ONE_WIRE_BUS); 
LiquidCrystal_I2C lcd(0x27, 20, 4);
DallasTemperature sensors(&oneWire);
const byte ROWS = 4; //řádky
const byte COLS = 4; // sloupce
char hexaKeys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

 byte rowPins[ROWS] = {5, 6, 7, 8}; //řádky 
 byte colPins[COLS] = {9, 10, 11, 12}; // sloupce 
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 

 
void setup(void) 
{ 

 Serial.begin(9600); 
 lcd.begin();
 lcd.backlight();
 lcd.clear();
 sensors.begin();

  lcd.setCursor(0,0);
  lcd.print("Key");

    lcd.setCursor(0,3);
  lcd.print("Teplota");

    lcd.setCursor(18,3);
  lcd.print((char)223);      
  lcd.setCursor(19,3);
  lcd.print("C");
} 
void loop(void) 
{ 

  char customKey = customKeypad.getKey();
  
  if (customKey){


lcd.setCursor(5,0);
  lcd.print(customKey);  
}
  sensors.requestTemperatures(); 

  lcd.setCursor(13,3);
  lcd.print((sensors.getTempCByIndex(0)),1); 

 
} 
Celý projekt je mnohem složitější, vložil jsem pro přehlednost jen jednoduchý a na kost počesaný kód.

Re: Konflikt knihoven

Napsal: 27 pro 2020, 19:36
od ondraN
Myslím, že čtení teploty na delší čas zablokuje vykonávání smyčky. Zkusil bych pomocí millis zjistit, jak dlouho trvá a jestli je trvání vždy stejné. Případně si můžeš před a po nastavit-shodit nějaký pin a podívat se osciloskopem nebo log. analyzátorem.

Re: Konflikt knihoven

Napsal: 27 pro 2020, 19:48
od Axamith
Napadlo, že řešení by mohlo být měření v cyklech. Nepotřebuji měřit neustále, perioda měření by tomu mohla napomoci. V každém případě otestuji, jak dlouho měření trvá, jak radí OndraN.

Re: Konflikt knihoven

Napsal: 27 pro 2020, 21:04
od pavel1tu
dallas DS18B20 může při 12bit rozlišení měřit až 750ms dle datasheetu,
já to měřil při 10bit rozlišení a bylo to od 80ms do 150ms - jak kdy.

Musíš tedy zvážit s jakou přesností a jak často měřit.

https://datasheets.maximintegrated.com/ ... S18B20.pdf

Re: Konflikt knihoven

Napsal: 28 pro 2020, 08:08
od Axamith
Pavle, to je přesně ono :-) Děkuji za nakopnutí správným směrem.

Při 12 bitech měří 750 ms a při 9 bitech 93,75 ms. Pokud není zadán parametr rozlišení, otestuje si maximální možné a tuto hodnotu používá. Takže jsem nastavil pevně danou hodnotu do setupu:

Kód: Vybrat vše

 sensors.begin();
 sensors.setResolution(9);
Nyní již klávesnice spíná jak jsem očekával, ještě jednou díky.

Re: Konflikt knihoven

Napsal: 28 pro 2020, 19:02
od pavel1tu
To byl jen nápad, jednou jsem také měl zásek právě na době měření.

Hlavně že to pomohlo.