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 

Arduino programiranje

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Elektronika za začetnike
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
programming
Član
Član



Pridružen-a: Sre 09 Jan 2013 19:58
Prispevkov: 33
Aktiv.: 0.24

PrispevekObjavljeno: Pon Nov 30, 2020 4:25 pm    Naslov sporočila: icon_idea Arduino programiranje Odgovori s citatom

Lepo pozdravljeni,

Po zelo dolgem času sem se ponovno lotil programiranja z ARDUINO ampak sem ugotovil, da je moje znanje programiranja izpred preteklih let že malce zarjavelo zato prosim za pomoč.

Zanima me ali je mogoče, da bi v ARDUINO program vključil 4 tipke in ob pritisku vsake tipke bi se pričel nov program oziroma nova VOID LOOP zanka, da niso povezano v en program ampak je ob vsakem pritisku posamezne tipke začne nov program, se pravi:

Tipka_1: Program_1
Tipka_2: Program_2
Tipka_3: Program_3
Tipka_4: Program_4

Tipke bi bile povezane isto ARDUINO NANO ploščo, takšno vrsto programa bi potreboval, da ne prihaja do zakasnitev saj če vse senzorje vključim v en program ne deluje kot bi želel.

Primer:

-Ob pritisku Tipka_1 bi z DHT11 meril temperaturo in vlago ter izpisoval na OLED zaslonu
-Ob pritisku Tipka_2 bi z bluetooth HC-05 krmilil RGB LED
-Ob pritisku Tipka_3 bi preko mikrofona krmilil RGB LED (pri določeni vrednosti ADC prižge LED)
-Ob pritisku Tipka_4 RGB LED


V naprej najlepša hvala za pomoč!



Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Branez
Moderator
Moderator



Pridružen-a: Pon 14 Apr 2003 7:21
Prispevkov: 7768
Aktiv.: 34.98
Kraj: Koprivnica HR

PrispevekObjavljeno: Pon Nov 30, 2020 5:15 pm    Naslov sporočila:   Odgovori s citatom

programming je napisal/a:
... da ne prihaja do zakasnitev saj če vse senzorje vključim v en program ne deluje kot bi želel...
Objavi ta program, ki ti dela kot bi želel.
_________________
The true sign of intelligence is not knowledge but imagination.
Creativity is intelligence having fun!

Albert Einstein
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
programming
Član
Član



Pridružen-a: Sre 09 Jan 2013 19:58
Prispevkov: 33
Aktiv.: 0.24

PrispevekObjavljeno: Pon Nov 30, 2020 5:42 pm    Naslov sporočila:   Odgovori s citatom

Trenutni program, podatki iz DHT11 so izpisani na OLED zaslonu mikrofon in RGB LED pa ne delujeta ves čas kot bi si želel. Če iz programa odstranim DHT11 in OLED deluje mikrofon in RGB LED brez problema. Zato želim v program vpeljat 4 različne TIPKE s katerim bi posamezno aktiviral posamezne programe samo ne vem kako točno naj to izpeljati, če je sploh mogoče? ali moram krmilit iz različnih plošč?

Koda:

#include <FastLED.h>
#include "DHT.h"                        //knjižnica
#include "U8glib.h"                     //knjižnica

#define NUM_LEDS 25                     //Število RGB LED 5x5
#define LED_PIN 5                       //RGB LED 5X5 so povezane na digitalni izhod 5
#define DHTPIN 3                        //DHT11 Senzor je povezan na digitalni vhod 3
#define DHTTYPE DHT11                   // DHT 11 Senzor temperature in vlage

DHT dht(DHTPIN, DHTTYPE, 6);
CRGB led[NUM_LEDS];

char str[10];

const int soundpin=A0;
const int threshold=600;                       //mikrofon vrednost

const int buttonPin = 6;                       //TIPKA1
const int buttonPin2 = 7;                      //TIPKA2
const int buttonPin3 = 8;                      //TIPKA3
const int buttonPin4 = 9;                      //TIPKA4
int buttonState = 0;                           //VREDNOST STATUS TIPKE1
int buttonState2 = 0;                          //VREDNOST STATUS TIPKE2
int buttonState3 = 0;                           //VREDNOST STATUS TIPKE3
int buttonState4 = 0;                          //VREDNOST STATUS TIPKE4

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);                //OLED

void drawTest(void) {                                                         
  u8g.setFont(u8g_font_unifont);
  u8g.drawStr( 0, 25, "DOBRODOSLI");
}


void setup() {
  Serial.begin(9600);
  pinMode(soundpin,INPUT);
  Serial.println("DHTxx test!");
  dht.begin();
  u8g.firstPage();
  do {
    drawTest();
  } while( u8g.nextPage() );
 
  pinMode(buttonPin, INPUT);                                                 //Tipka1 je digitalni vhodni signal
  pinMode(buttonPin2, INPUT);                                                //Tipka2 je digitalni vhodni signal
  pinMode(buttonPin3, INPUT);                                                 //Tipka3 je digitalni vhodni signal
  pinMode(buttonPin4, INPUT);                                                //Tipka4 je digitalni vhodni signal
}

void loop() {
int soundsens=analogRead(soundpin);                                          //Beri vrednost na mikrofonu
if (soundsens>=threshold) {                                                  //če je vrednost ADC nad 600
    FastLED.addLeds<NEOPIXEL, LED_PIN>(led, NUM_LEDS);                        //ZELENA BARVA RGB LED
    for (int i = 0; i < NUM_LEDS; i++)
    led[i] = CRGB(0, 1, 0);
    FastLED.show();   
delay(1000);
}
else{
  FastLED.addLeds<NEOPIXEL, LED_PIN>(led, NUM_LEDS);                         //Izklopi RGB LED
  for (int i = 0; i < NUM_LEDS; i++)
  led[i] = CRGB(0, 0, 0);
  FastLED.show();
}


delay(2000);
  float h = dht.readHumidity();                                             //Preberi vlažnost okolja
  float t = dht.readTemperature();                                          //preberi temperaturo v celzijah
  float f = dht.readTemperature(true);                                      //preberi temperaturo v stopinjah Fahrenheita
 
  if (isnan(h) || isnan(t) || isnan(f)) {                                   
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  float hi = dht.computeHeatIndex(f, h);

  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
 
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(f);
  Serial.print(" *F\t");
 
  Serial.print("Heat index: ");
  Serial.print(hi);
  Serial.println(" *F");
 

  u8g.firstPage();                                                          //do...while zanka
  do {
    u8g.setFont(u8g_font_helvB08);
   
    u8g.drawStr( 0, 15, "Vlaga:");
    u8g.drawStr( 90, 15, dtostrf(h, 5, 2, str));
    u8g.drawStr( 120, 15, "%");
   
    u8g.drawStr( 0, 30, "Temperatura:");
    u8g.drawStr( 90, 30, dtostrf(t, 5, 2, str));
    u8g.drawStr( 120, 30, "\260C");
   
    u8g.drawStr( 90, 45, dtostrf(f, 5, 2, str));
    u8g.drawStr( 120, 45, "\260F");
   
    u8g.drawStr( 0, 60, "Toplotni indeks:");
    u8g.drawStr( 90, 60, dtostrf(hi, 5, 2, str));
    u8g.drawStr( 120, 60, "\260F");
   
  } while( u8g.nextPage() );
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
sanko
Neznanec
Neznanec



Pridružen-a: Pon 27 Mar 2017 9:19
Prispevkov: 4
Aktiv.: 0.05

PrispevekObjavljeno: Tor Dec 01, 2020 9:07 am    Naslov sporočila:   Odgovori s citatom

Loop je en, lahko pa v njem glede na pritisnjeno tipko izvedeš le določeno kodo.

Najboljše, da napišeš ločeno funkcijo za vsako od štirih tipk, v glavnem loopu pa kličeš le željeno.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
miharix
Član
Član



Pridružen-a: Tor 18 Dec 2012 9:59
Prispevkov: 403
Aktiv.: 2.94
Kraj: LJ

PrispevekObjavljeno: Sre Dec 02, 2020 5:44 pm    Naslov sporočila:   Odgovori s citatom

Uporabljat boš mogel timer in ne dalay

Programirat moraš tako, da vsaka operacija vzame čim manj procesorskega časa (dalay ga vzame za čas spanja 100% -> res nič drugo ne more procesirat)
Če imaš zanke ki bi naj tekle vzporedno, jih realiziraj z if in ne z for, da ti nit programa čim manj visi znotraj ene operacije
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
programming
Član
Član



Pridružen-a: Sre 09 Jan 2013 19:58
Prispevkov: 33
Aktiv.: 0.24

PrispevekObjavljeno: Čet Dec 03, 2020 10:27 am    Naslov sporočila:   Odgovori s citatom

sanko je napisal/a:
Loop je en, lahko pa v njem glede na pritisnjeno tipko izvedeš le določeno kodo.

Najboljše, da napišeš ločeno funkcijo za vsako od štirih tipk, v glavnem loopu pa kličeš le željeno.


Torej, če prav razumem naj vse štiri tipke uporabim v glavnem loop ter pod vsako napišem določeno kodo, da deluje samo tista katera je bila pritisnjena in se bo izvajala tako dolgo dokler ne bo pritisnjena druga tipka? Ostali del programa se v tem času ne bo izvajal glede na to da bi bil napisan vzporedno? Lahko prosim kakšen primer kode? hvala
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
programming
Član
Član



Pridružen-a: Sre 09 Jan 2013 19:58
Prispevkov: 33
Aktiv.: 0.24

PrispevekObjavljeno: Čet Dec 03, 2020 10:29 am    Naslov sporočila:   Odgovori s citatom

miharix je napisal/a:
Uporabljat boš mogel timer in ne dalay

Programirat moraš tako, da vsaka operacija vzame čim manj procesorskega časa (dalay ga vzame za čas spanja 100% -> res nič drugo ne more procesirat)
Če imaš zanke ki bi naj tekle vzporedno, jih realiziraj z if in ne z for, da ti nit programa čim manj visi znotraj ene operacije


Timer? Je to pravilni ukaz saj mi ga arduino ne prepozna ali se mogoče na kakšed drug način uporablja? lahko prosim za primer kode? hvala
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
sanko
Neznanec
Neznanec



Pridružen-a: Pon 27 Mar 2017 9:19
Prispevkov: 4
Aktiv.: 0.05

PrispevekObjavljeno: Čet Dec 03, 2020 11:20 am    Naslov sporočila:   Odgovori s citatom

programming je napisal/a:
sanko je napisal/a:
Loop je en, lahko pa v njem glede na pritisnjeno tipko izvedeš le določeno kodo.

Najboljše, da napišeš ločeno funkcijo za vsako od štirih tipk, v glavnem loopu pa kličeš le željeno.


Torej, če prav razumem naj vse štiri tipke uporabim v glavnem loop ter pod vsako napišem določeno kodo, da deluje samo tista katera je bila pritisnjena in se bo izvajala tako dolgo dokler ne bo pritisnjena druga tipka? Ostali del programa se v tem času ne bo izvajal glede na to da bi bil napisan vzporedno? Lahko prosim kakšen primer kode? hvala


Tako ja. Lahko je v loopu navaden switch statement in potem štiri funkcije, katere kličeš glede na pritisnjen gumb. "gumbNo" pa definiraš kot globalno variablo (zunaj loopa), tako da bo med zagoni loopa ohranjala vrednost. Settaš ga le ob pritisku gumba.

Koda:
switch (gumbNo) {
  case 1:
    //prvi gumb...
    funkcija1(...);
    break;
  case 2:
    //do something when var equals 2
   funkcija2(...);
    break;
  default:
    // if nothing else matches, do the default
    // default is optional
    break;
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
miharix
Član
Član



Pridružen-a: Tor 18 Dec 2012 9:59
Prispevkov: 403
Aktiv.: 2.94
Kraj: LJ

PrispevekObjavljeno: Čet Dec 03, 2020 11:42 am    Naslov sporočila:   Odgovori s citatom

Veselo branje Wink
https://playground.arduino.cc/Code/Timer/
https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/
https://www.robotshop.com/community/forum/t/arduino-101-timers-and-interrupts/13072
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
programming
Član
Član



Pridružen-a: Sre 09 Jan 2013 19:58
Prispevkov: 33
Aktiv.: 0.24

PrispevekObjavljeno: Tor Dec 29, 2020 10:35 am    Naslov sporočila:   Odgovori s citatom

Najlepša hvala vsem za odgovore, program deluje kot sem si zamislil imam pa še vedno eno težavico in sicer gre za izpisovanje podatkov iz DHT11 (temperatura in vlaga) na OLED zaslonu saj prihaja do manjših zakasnitev in moti glavno glavno programsko kodo, kjer je zelo pomembno, da program ves čaš bere podatke iz mikrofona in ni drugih zakasnitev. (če DHT11 IN OLED odstranim iz programa deluje brez problema)

Prosil bi za pomoč pri pisanju kode za DHT11 in OLED I2C 1.32inch 128×96
*OPCIJA 1: da bi se ta vklopila samo ob pritisku TIPKE in bi nato izklopila.
ali bolje:
*OPCIJA 2: da se podatki DHT11 preberejo in izpišejo na OLED samo 1x ob vklopu napajanja nato pa ostali program deluje brez zakasnitev.
Think Pray
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mato1111
Član
Član



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

PrispevekObjavljeno: Tor Dec 29, 2020 6:47 pm    Naslov sporočila:   Odgovori s citatom

programming je napisal/a:
OPCIJA 2: da se podatki DHT11 preberejo in izpišejo na OLED samo 1x ob vklopu napajanja nato pa ostali program deluje brez zakasnitev.

Samo iz Loop zanke premakni na konec Setup zanke.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Elektronika za začetnike Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
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: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group