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 in nekaj vprašanj

 
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.88
Kraj: Dobrepolje

PrispevekObjavljeno: Sob Okt 31, 2020 4:22 pm    Naslov sporočila:  Arduino in nekaj vprašanj Odgovori s citatom

Hi

Pred kratkim sem prešel iz Bascom AVR na Arduno zadevo. Pa bom imel nekaj vprašanj glede programiranja.

Prvič se mi je zataknilo pri zakasnitvi Delay. Namesto delaj bi rad uporabil millis.

Pri preklapljanju Led ni problema, ker je veliko napisanih primerov.

Problem pa je v moji spodnji kodi, ki hočem na grafičnemu TFT zaslonu menjati barvo kroga vsako sekundo, enkrat bel drugič črn.

V kodi tam kjer je delay bi rad uporabil millis, pa ne vem kako.

Najprej, da rešim to zadevo potem pa bo sigurno še kaj novega, hvala.

lp, marko

Koda:


// Menjaj barvo vsako sekundo na TFT zaslonu

#include <UTFT.h>
extern uint8_t SmallFont[];
UTFT myGLCD(ILI9486,38,39,40,41,28);

void setup()
{
  myGLCD.InitLCD();
  myGLCD.setFont(SmallFont);

  myGLCD.clrScr();
}

void loop()
{
  //int buf[478];
  int x, x2;
  int y, y2;
  int r;

//nariši večji krog z belo barvo
myGLCD.setColor(VGA_WHITE); 
    x=35;
    y=139;
    r=20;   
myGLCD.drawCircle(x, y, r);

// nariši manjši krog najprej z črno nato čez 1 sekundo z belo, in to ponavljaj
myGLCD.setColor(VGA_BLACK);
myGLCD.fillCircle(35, 149, 8);
 
  delay(1000);
 
myGLCD.setColor(VGA_WHITE);
myGLCD.fillCircle(35, 149, 8);

}

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.89
Kraj: Grosuplje

PrispevekObjavljeno: Sob Okt 31, 2020 5:25 pm    Naslov sporočila:   Odgovori s citatom

Kaj pa, če bi uporabil Timer interupt s katerim pokličeš funkcijo za izris tvojih krogov?
_________________
Lp, Jaka
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
marko11
Član
Član



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

PrispevekObjavljeno: Sob Okt 31, 2020 5:44 pm    Naslov sporočila:   Odgovori s citatom

Ja, tukaj vidim, da uporablja tale ukaz
Koda:
 toggle1 = !toggle1;
za ledico bi to šlo, kako pa to uporabiti pri prikazovanju krogov pa ne vem, kakšen primer, prosim.

lp
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.44
Kraj: Vrhnika

PrispevekObjavljeno: Sob Okt 31, 2020 8:52 pm    Naslov sporočila:   Odgovori s citatom

Namig: millis(); ti vrne trenutno vrednost stevca, ki se povecuje vsako milisekundo od zacetka priklopa na napajanje.

ce je zeljena pavza ze minila preverjas tako:
Koda:
if (millis() - prejsnji_cas >= pavza) {
//koda
prejsnji_cas = millis();
}

Razlika je v tem da ti tukaj program ne caka da mine pavza ampak vedno krozi skozi glavno zanko tako da lahko delas vmes druge stvari.
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.88
Kraj: Dobrepolje

PrispevekObjavljeno: Ned Nov 01, 2020 3:18 pm    Naslov sporočila:   Odgovori s citatom

Hi

Zdaj sem napravil nekako tako kot je predlagal @Jaka57 in spodaj je koda, ki vsako sekundo spremeni stanje.

Nikakor pa mi ne uspe, ko je (stanje = 0), da izpiše na serial.println("CRNO") in

ko je (stanje = 1), da izpiše na serial.println("BELO") ali pa da nekaj nariše na LCD.

Probal sem z raznimi if stavki na različnih mestih v kodi, pa mi vedno izpiše samo npr."BELO".

Kako in kje v kodi moram pravilno postaviti if ?

Koda:


int timer=0;
bool stanje=0;


void setup() {
Serial.begin(9600); 
 
   
  TCCR0A=(1<<WGM01);    //Set the CTC mode   
  OCR0A=0xF9; //Value for ORC0A for 1ms
 
  TIMSK0|=(1<<OCIE0A);   //Set the interrupt request
  sei(); //Enable interrupt
 
  TCCR0B|=(1<<CS01);    //Set the prescale 1/64 clock
  TCCR0B|=(1<<CS00);
   
}

void loop() {
  //in this way you can count 1 second because the nterrupt request is each 1ms
  if(timer>=1000){
   stanje=!stanje;   
   timer=0;   
  }
   
    Serial.println(stanje);   //tukaj izpisuje stanje, ko je nič in ko je ena
 
  }
 

ISR(TIMER0_COMPA_vect){    //This is the interrupt request
  timer++;
}
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.44
Kraj: Vrhnika

PrispevekObjavljeno: Ned Nov 01, 2020 8:24 pm    Naslov sporočila:   Odgovori s citatom

Probaj tako:
Koda:
void loop() {
  //in this way you can count 1 second because the nterrupt request is each 1ms
  if(timer>=1000){
   stanje=!stanje;   
   timer=0;
   if(stanje==1){
    Serial.println("BELO");
   }
   else {
    Serial.println("CRNO");
   }
  }
}

PS: Sem dopisal zavite oklepaje ker se mi je prej malo mudilo Brick wall


Nazadnje urejal/a mato1111 Pon Nov 02, 2020 12:41 am; skupaj popravljeno 1 krat
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.88
Kraj: Dobrepolje

PrispevekObjavljeno: Ned Nov 01, 2020 11:53 pm    Naslov sporočila:   Odgovori s citatom

mato111, sedaj deluje, samo nekaj zavitih oklepajev sem dodal. hvala

Koda:

void loop() {
  //in this way you can count 1 second because the nterrupt request is each 1ms
  if(timer>=1000){
   stanje=!stanje;   
   timer=0;
   if(stanje==1){
    Serial.println("BELO");
   }
   else {
    Serial.println("CRNO");
   }
  }
}

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



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

PrispevekObjavljeno: Pon Nov 02, 2020 5:59 pm    Naslov sporočila:   Odgovori s citatom

Imam pa novo vprašanje

Imam 4x3 tipkovnico, in ko pišem na serijski pravilno izpiše 1, če pritisnem tipko 1.

Ko pa izpiše na LCD, tam pa izpiše kodo tipke 49, če pritisnem tipko 1.

Zakaj pride do razlike?

Priložen del programa:

Koda:


#include <Keypad.h>

long Num1,Num2,Number;

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad  // Pin5=R1,Pin4=R2,Pin3=R3,Pin2=R4
byte colPins[COLS] = {8, 7, 6}; //connect to the column pinouts of the keypad  // Pin8=C1,Pin7=C2,Pin6=C3

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  Serial.begin(9600);
}

void loop(){
  char key = keypad.getKey();

  if (key != NO_KEY){
    Serial.println(key);
    myGLCD.setColor(VGA_WHITE);  //
  myGLCD.printNumI(key, 90, 19); // 
  }



lp,
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.44
Kraj: Vrhnika

PrispevekObjavljeno: Pon Nov 02, 2020 6:32 pm    Naslov sporočila:   Odgovori s citatom

Ce prav predvidevam serijski izpise 1 ker ga izpises kot karakter oz string. 49 desetisko = 1 karakter.
LCD pa izpise kot desetisko stevilo 49 z ukazom myGLCD.printNumI.
Probaj tako:
Koda:
myGLCD.print(key,90,19); //Izpisi kot karakter
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
polkic
Član
Član



Pridružen-a: Pon 04 Dec 2017 20:27
Prispevkov: 68
Aktiv.: 0.87

PrispevekObjavljeno: Sre Nov 04, 2020 7:51 pm    Naslov sporočila:   Odgovori s citatom

marko11 je napisal/a:
mato111, sedaj deluje, samo nekaj zavitih oklepajev sem dodal. hvala

Koda:

void loop() {
  //in this way you can count 1 second because the nterrupt request is each 1ms
  if(timer>=1000){
   stanje=!stanje;   
   timer=0;
   if(stanje==1){
    Serial.println("BELO");
   }
   else {
    Serial.println("CRNO");
   }
  }
}



Pozdravljen,

če imaš za if stavkom ali else samo eno vrstico kode, lahko zavite oklepaje izpustis.

Tako prihraniš nekaj na času, coda pa postane tudi bolje berljiva.
V tvojem primeru:

Koda:

void loop() {
  //in this way you can count 1 second because the nterrupt request is each 1ms
  if(timer>=1000){
   stanje=!stanje;   
   timer=0;
   if(stanje==1)
    Serial.println("BELO");

   else
    Serial.println("CRNO");
   
  }
}

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



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

PrispevekObjavljeno: Sre Nov 01, 2023 4:49 pm    Naslov sporočila:   Odgovori s citatom

Bi rabil malo pomoči...

V odvisnosti od teže bi pripiral servomotor. Sedaj imam samo dve poziciji servomotorja, nad določeno težo in pod določeno težo. Sedaj pa bi rad dodal še tretjo pozicijo servomotorju.
Torej ko je tehtnica recimo od 0.7 do 0.9 pojdni na neko pozicijo.(my servo.write(90); recimo.

Sedaj imam takole;

if(teža<0.7) {

myservo.write(150);
delay(1000);

}
else {

myservo.write(0);
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
solomojster
Član
Član



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

PrispevekObjavljeno: Čet Nov 02, 2023 8:34 pm    Naslov sporočila:   Odgovori s citatom

Se zahvaljujem izkušenemu forumašu... Very Happy

Deluje.....



20231102_192043[1].jpg
 Opis:
 Velikost datoteke:  2.6 MB
 Pogledana:  23 krat

20231102_192043[1].jpg


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 -> Arduino sekcija Č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: 75 dni


Powered by phpBB © 2001, 2005 phpBB Group