Konflikt knihoven

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Odpovědět
Axamith
Příspěvky: 533
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Konflikt knihoven

Příspěvek od Axamith » 27 pro 2020, 19:03

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.

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Konflikt knihoven

Příspěvek od ondraN » 27 pro 2020, 19:36

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.

Axamith
Příspěvky: 533
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Re: Konflikt knihoven

Příspěvek od Axamith » 27 pro 2020, 19:48

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.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Konflikt knihoven

Příspěvek od pavel1tu » 27 pro 2020, 21:04

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
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Axamith
Příspěvky: 533
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Re: Konflikt knihoven

Příspěvek od Axamith » 28 pro 2020, 08:08

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.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Konflikt knihoven

Příspěvek od pavel1tu » 28 pro 2020, 19:02

To byl jen nápad, jednou jsem také měl zásek právě na době měření.

Hlavně že to pomohlo.
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 28 hostů