www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Tipkovnica + DS18b20 + grafični
Pojdi na stran 1, 2, 3  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 866
Aktiv.: 3.89
Kraj: Dobrepolje

PrispevekObjavljeno: Pet Nov 13, 2020 7:40 pm    Naslov sporočila:  Tipkovnica + DS18b20 + grafični Odgovori s citatom

Hi

Problem. Spodnji program v bistvu deluje. Težava pa nastopi pri uporabi tipkovnice, ko pritisnem neko tipko program potrebuje več sekund, da se odzove.

Imam Arduino Mega2560, Tipkovnica 4x3, grafični UTFT zaslon (480x320), 4x DS18B20 senzorji temperature, vsak na svojemu portpinu.

Že s tem sem se mučil, da sem napravil tako, da se podatki izpisujejo na zaslon, sedaj pa ne vem kam in kako je treba napisati, da bo oboje skupaj delovalo brez čakanja.

Če probam vsak program posebej deluje odlično.

Koda:



#include <Keypad.h>
#include <UTFT.h>     // Knjižnica za GLCD zaslon
#include <OneWire.h>
#include <DallasTemperature.h>

// Katero pisavo bom uporabljal
extern uint8_t hallfetica_normal[];
extern uint8_t BigFont[];
extern uint8_t SmallFont[];

#define ONE_WIRE_BUS_1   10  // številka digitalnega pina na Arduimo
#define ONE_WIRE_BUS_2   11  // številka digitalnega pina na Arduimo
#define ONE_WIRE_BUS_3   12  // številka digitalnega pina na Arduimo
#define ONE_WIRE_BUS_4   13  // številka digitalnega pina na Arduimo

OneWire oneWire_zunaj(ONE_WIRE_BUS_1);
OneWire oneWire_pec(ONE_WIRE_BUS_2);
OneWire oneWire_dvizni(ONE_WIRE_BUS_3);
OneWire oneWire_bojler(ONE_WIRE_BUS_4);

DallasTemperature sensor_zunaj(&oneWire_zunaj);
DallasTemperature sensor_pec(&oneWire_pec);
DallasTemperature sensor_dvizni(&oneWire_dvizni);
DallasTemperature sensor_bojler(&oneWire_bojler);

// Ne pozabi spremeniti parametrov, da bo ustrezal zaslonu,kiga uporabljaš
UTFT myGLCD(ILI9486,38,39,40,41,28);  //paremetri

  int x, x2;
  int y, y2;
  int r;
  int deg;


const int ROW_NUM = 4; //four rows
const int COLUMN_NUM = 3; //three columns

char keys[ROW_NUM][COLUMN_NUM] = {
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};

byte pin_rows[ROW_NUM] = {5, 4, 3, 2};   //priključki vrstic  // Pin5=R1,Pin4=R2,Pin3=R3,Pin2=R4
byte pin_column[COLUMN_NUM] = {8, 7, 6};  //priključki stolpcev // Pin8=C1,Pin7=C2,Pin6=C3

Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );

String inputString;
long inputInt;


void setup() {
 
  Serial.begin(9600);
  inputString.reserve(10); // maximum number of digit for a number is 10, change if needed

 myGLCD.InitLCD();
 myGLCD.setFont(hallfetica_normal);  // Izpiše STOPINJO in druge znake
 myGLCD.setFont(BigFont);
 myGLCD.setFont(SmallFont);
     
 myGLCD.clrScr(); //Počistite zaslon

 sensor_zunaj.begin();  // begin=začni
 sensor_pec.begin();
 sensor_dvizni.begin();
 sensor_bojler.begin();


 
}


void loop() {


//----------------------------------- TIPKOVNICA -------------------------------------------------- 
  char key = keypad.getKey();
 
  if (key) {
   
    if (key >= '0' && key <= '9') {     // only act on numeric keys
      inputString += key;               // append new character to input string

  myGLCD.setColor(VGA_WHITE); 
  myGLCD.print(inputString, 140, 22);  //izpiše tisto št.ki si jo pritisnil, string
           
    } else if (key == '#') {
      if (inputString.length() > 0) {       
        inputInt = inputString.toInt(); // dobil si INTEGER stevilo
       
  myGLCD.print("  ", 140, 22); //pobriše prejšni zapis
  myGLCD.setColor(VGA_WHITE); 
  myGLCD.printNumI(inputInt, 140, 22);  //izpiše tisto št.ki si jo pritisnil, integer
 
        if (inputInt==1) program_1();
        if (inputInt==2) program_2();
        if (inputInt==3) program_3();
        if (inputInt==4) program_4();

               
        inputString = " ";               // briši vnos             

      }
    } else if (key == '*') {
      if (inputInt==3) program_4();  // če si v programu_3 in ko pritisneš zvezdico skoči v program_4
      //inputString = "";                 // clear input
    }
  }
 
// Tukaj izpisujem temperaturo na zaslon

 sensor_zunaj.requestTemperatures();  // request=zahtevaj temp.
 sensor_pec.requestTemperatures();
 sensor_dvizni.requestTemperatures();
 sensor_bojler.requestTemperatures();
 
//----------------------------------------- Izpis temp. na GLCD  bojler ---------------------
  myGLCD.setFont(BigFont);   // Katero pisavo bom uporabljal
  myGLCD.setColor(VGA_RED);
  myGLCD.setBackColor(VGA_BLACK);
  myGLCD.printNumI((sensor_bojler.getTempCByIndex(0)), 13, 230);   //izpis temp.BOJLER  get=dobil
  myGLCD.setFont(hallfetica_normal);
  myGLCD.print("`", 41, 230);   //  Alt+96  tukaj izpiše na zaslon STOPINJO

  //--------------------------------Izpis temp. na GLCD  Dvizni vod --------------------------------------
  myGLCD.setFont(SmallFont);   // Katero pisavo bom uporabljal
  myGLCD.setColor(VGA_WHITE);
  myGLCD.setBackColor(VGA_BLACK);
  myGLCD.print("DVIZ.VOD:", 175, 66);

  myGLCD.setFont(BigFont);   // Katero pisavo bom uporabljal
  myGLCD.setColor(VGA_RED);
  myGLCD.setBackColor(VGA_BLACK);
  myGLCD.printNumI((sensor_dvizni.getTempCByIndex(0)), 250, 62);   //izpis temp.DVIZNI VOD
  myGLCD.setFont(hallfetica_normal);
  myGLCD.print("`", 280, 62);   //  Alt+96  tukaj izpiše na zaslon STOPINJO

}


Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
blsku
Član
Član



Pridružen-a: Pet 02 Okt 2020 19:39
Prispevkov: 49
Aktiv.: 1.14
Kraj: Nova Gorica

PrispevekObjavljeno: Pet Nov 13, 2020 10:01 pm    Naslov sporočila:   Odgovori s citatom

Pozdravljeni,

To se dogaja ker uporabljas ds18b20 temperaturne senzorje. Ce se ne motim imajo ti senzorji odzivni cas 1s, poleg tega si vsak senzor pripeljal na svoj vhod in vsakega "kličes" posebej namesto vse iztočasno.
Sicer pa bodo še drugi povedali kaj in kako, ker sem tudi sam bolj kot ne zelen v svetu arduina
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mucek
Član
Član



Pridružen-a: Tor 01 Avg 2006 10:47
Prispevkov: 5332
Aktiv.: 24.73
Kraj: Domzale

PrispevekObjavljeno: Pet Nov 13, 2020 10:17 pm    Naslov sporočila:   Odgovori s citatom

To se dogaja, ko te senzorje uporabljas nepravilno ... Saj noben ne pravi, da moras cas konverzije (ki je res dolg, skoraj sekundo!) samo cakati in ne delati nicesar. Je pa tako napisati program enostavneje Wink.
Enostaven workaround je, da senzorje gledas bolj poredko, ne v vsakem ciklu.

Lp, G

_________________
...lahko pa se tudi motim ...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 866
Aktiv.: 3.89
Kraj: Dobrepolje

PrispevekObjavljeno: Sob Nov 14, 2020 12:08 am    Naslov sporočila:   Odgovori s citatom

Ker je to moj prvi projekt z Arduinom, pa bi prosil za malo več pomoči, na primer kako senzorje gledati bolj poredko, da bo tipkovnica bolj odzivna.

Kaj moram storiti?

Lp,
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
blsku
Član
Član



Pridružen-a: Pet 02 Okt 2020 19:39
Prispevkov: 49
Aktiv.: 1.14
Kraj: Nova Gorica

PrispevekObjavljeno: Sob Nov 14, 2020 1:38 am    Naslov sporočila:   Odgovori s citatom

Za to obstaja verjetno več rešitev. Ena rešitev je da ustvaris loop zanko, ki izvede branje senzorjev vskin npr. 100 ciklov. (Odvisno od ostale kode)
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 866
Aktiv.: 3.89
Kraj: Dobrepolje

PrispevekObjavljeno: Sob Nov 14, 2020 11:38 am    Naslov sporočila:   Odgovori s citatom

blsku je napisal/a:
Ena rešitev je da ustvaris loop zanko, ki izvede branje senzorjev vsakih npr. 100 ciklov.


Kako pa naj naredim to loop zanko? Bi kdo pomagal.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
eddie
Član
Član



Pridružen-a: Sre 10 Dec 2003 21:02
Prispevkov: 706
Aktiv.: 3.17
Kraj: Severna primorska

PrispevekObjavljeno: Sob Nov 14, 2020 2:28 pm    Naslov sporočila:   Odgovori s citatom

Pomagaš si lahko na primer s funkcijo millis(), ki vrne milisekunde od zagona programa.
Če hočeš da bi se nekaj izvedlo na primer 1x na sekundo gre nekako takole:
Koda:



long millisOld;

// v setup proceduri
millisOld=millis();

//v glavni zanki pa

if ((millis()-millisOld) > 1000) {
//naredi nekaj vsako sekundo
millisOld=millis();
}




Lp
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 866
Aktiv.: 3.89
Kraj: Dobrepolje

PrispevekObjavljeno: Sob Nov 14, 2020 6:04 pm    Naslov sporočila:   Odgovori s citatom

Hi

Napravil sem tako kot je predlagal @eddie s funkcijo millis.
Sedaj to lepše deluje, kljub temu pa moram včasih nekajkrat pritisniti tipko, da jo program zazna. Je pa veliko bolje, mogoče se to da še kako popraviti?

Sedaj pa imam nov problem:

Zakaj ta koda za ispis temperature dela samo v void Loop() funkciji ?

Če vso to kodo, ki je v void Loop funkciji premaknem v moj podprogram, npr. Program_1 in ko se premaknem v podprogram se izpišejo samo zadnje vrednosti senzorjev, ko pa se temperatura spreminja pa ni odziva, ostaja prejšnji zapis.

Kako lahko to dosežem, da se v Program_1 temperatura prikazuje, v Program_2 pa ne.

LP,
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5773
Aktiv.: 25.92
Kraj: Grosuplje

PrispevekObjavljeno: Sob Nov 14, 2020 7:50 pm    Naslov sporočila:   Odgovori s citatom

marko11, gledam tale tvoj, kot, prvi projekt. Vse v redu in prav, če delaš copy/paste, toda brez osnov ne boš prišel daleč.
Za začetek si poglej vse o deklaracijah spremenljivk, kdaj so te vidne v celem programu in kdaj samo v tvojem podprogramu (funkciji, proceduri), tj globalne in lokalne spremenljivne....
Vidim, da si za branje tipkovnice uporabil neko knjižnjico, ne da se mi gledati in iskati, katera knjižmjica je to, vendar najlepše se tipke berejo s pomočjo prekinitve.

V glavnem, svoj projekt si začel pri strehi in ne pri temeljih.

_________________
Lp, Jaka
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
mato1111
Član
Član



Pridružen-a: Pet 28 Dec 2012 14:42
Prispevkov: 612
Aktiv.: 4.45
Kraj: Vrhnika

PrispevekObjavljeno: Sob Nov 14, 2020 9:36 pm    Naslov sporočila:   Odgovori s citatom

Glede na to da gre nekaj v zvezi z ogrevanjem in tukaj ni neko zelo hitro nihanje temperature lahko meris temperaturo vsakih 10 sekund.
Poglej si primer WaitingForConversion2 iz knjiznice DallasTemperature.h
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 866
Aktiv.: 3.89
Kraj: Dobrepolje

PrispevekObjavljeno: Pon Nov 16, 2020 4:12 pm    Naslov sporočila:   Odgovori s citatom

Citiram:
vendar najlepše se tipke berejo s pomočjo prekinitve.
Kako bi pa to napravil, da odčitavam tipke s pomočjo prekinitve, ko sem v podprogramu npr, Program_1.

Ali je kje kakšen primer, da to pogledam?

lp,
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
solomojster
Član
Član



Pridružen-a: Tor 18 Maj 2010 12:26
Prispevkov: 845
Aktiv.: 4.99
Kraj: NOVA GORICA

PrispevekObjavljeno: Tor Nov 17, 2020 8:58 pm    Naslov sporočila:   Odgovori s citatom

https://howtomechatronics.com/tutorials/arduino/arduino-tft-lcd-touch-screen-tutorial/
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 866
Aktiv.: 3.89
Kraj: Dobrepolje

PrispevekObjavljeno: Čet Nov 19, 2020 5:50 pm    Naslov sporočila:   Odgovori s citatom

Prosim za nasvet, kako naj napišem v spodnji program, da bi, ko pritiskam tipko A ali tipko B upošteval najnižjo in najvišjo vrednost Tb_n ali Tb_v.
oziroma, ko pride do max vrednosti začne šteti pri min. vrednosti.

Sem probal s for zanko, pa mi izpiše vse v enemu zamahu, se ne ustavi pri vsakemu pritisku tipke.

Koda:


  else if(key == 'A') {
    myGLCD.print("Tipka A", 160, 160);
   
  Tb_n = ++Tb_n;       // Tb_n  naj bo min. =25, max.=70 
  myGLCD.printNumI((Tb_n), 350, 52);
 
  }
   else if(key == 'B'){
     myGLCD.print("Tipka B", 160, 160);
   
  Tb_v = ++Tb_v;      // Tb_v  naj bo min.=50, max.=90
  myGLCD.printNumI((Tb_v), 350, 82);
     
}     



Pa še to, ali je kakšna razlika:

Koda:


void program_11()

ali

void program_11(void)




Lp,marko
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
mato1111
Član
Član



Pridružen-a: Pet 28 Dec 2012 14:42
Prispevkov: 612
Aktiv.: 4.45
Kraj: Vrhnika

PrispevekObjavljeno: Čet Nov 19, 2020 6:25 pm    Naslov sporočila:   Odgovori s citatom

Koda:

 else if(key == 'A') {
     myGLCD.print("Tipka A", 160, 160);
     Tb_n = ++Tb_n;       // Tb_n  naj bo min. =25, max.=70
     if(Tb_n < 25){ //Omeji najmanjso vrednost
        Tb_n = 25;
     }
     else if(Tb_n > 70){ //Omeji najvecjo vrednost
        Tb_n = 25; //zacni zopet pri najmanjsi
     }
     myGLCD.printNumI((Tb_n), 350, 52);
 
  }
   else if(key == 'B') {
     myGLCD.print("Tipka B", 160, 160);
     Tb_v = ++Tb_v;      // Tb_v  naj bo min.=50, max.=90
     if(Tb_v < 50){ //Omeji najmanjso vrednost
        Tb_v = 50;
     }
     else if(Tb_v > 90){ //Omeji najvecjo vrednost
        Tb_v = 50; //zacni zopet pri najmanjsi
     }
     myGLCD.printNumI((Tb_v), 350, 82);
     


Tam pri void pa ni razlike oboje pomeni da funkcija ne pricakuje nobenega parametra.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 866
Aktiv.: 3.89
Kraj: Dobrepolje

PrispevekObjavljeno: Čet Nov 19, 2020 7:51 pm    Naslov sporočila:   Odgovori s citatom

Hvala mato1111,

Sem tudi jaz probal s temi if stavki pa me ti zaviti oklepaji zafrkavajo.
Ne vem vedno kdaj se ga kje napiše. Prej sem delal z Bascom in je tukaj precej drugače.

lp,
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2, 3  Naslednja
Stran 1 od 3

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 67 dni


Powered by phpBB © 2001, 2005 phpBB Group