Arduino kezdő

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
czizsoart
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2019. február 19. kedd, 20:01

Re: Arduino kezdő

Hozzászólás Szerző: czizsoart »

(Nagyon) kezdő arduinos vagyok.

Beszereztem néhány db 7 szegmenses kijelzőt (5101BS típusúak, közös anód), amiket tesztelni akartam. Van egy kódom, ami 0-tól 9-ig kijelzi a számokat a kijelzőn, folyamatosan léptetve a számokat:

int pinA = 2;
int pinB = 3;
int pinC = 4;
int pinD = 5;
int pinE = 6;
int pinF = 7;
int pinG = 8;


void setup() {

pinMode(pinA, OUTPUT);
pinMode(pinB, OUTPUT);
pinMode(pinC, OUTPUT);
pinMode(pinD, OUTPUT);
pinMode(pinE, OUTPUT);
pinMode(pinF, OUTPUT);
pinMode(pinG, OUTPUT);

}


void loop() {
//0
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, LOW);
delay(1000);
//1
digitalWrite(pinA, LOW);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
delay(1000);
//2
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, LOW);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, LOW);
digitalWrite(pinG, HIGH);
delay(1000);
//3
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, HIGH);
delay(1000);

//4
digitalWrite(pinA, LOW);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
delay(1000);

//5
digitalWrite(pinA, HIGH);
digitalWrite(pinB, LOW);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, LOW);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
delay(1000);

//6
digitalWrite(pinA, HIGH);
digitalWrite(pinB, LOW);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
delay(1000);

//7
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
delay(1000);

//8
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
delay(1000);

//9
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, LOW);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
delay(1000);

Feltöltöttem az Unora. A kijelző elvileg működik, de épp ellenkezőleg, mint ahogy kellene. Pl. a program 0 részénél, ahol mindegyik szegmens HIGH, kivéve a G, ott a kijelzőn csak a G (középső vízszintes dióda) világít, a többi nem. Ha mindegyiket LOW-ra állítom, csak a G-t HIGH-ra, akkor mutatja a kijelző a nullát helyesen. Mi lehet a baj, hogy mindent ellentétesen csinál? Nem jövök rá. Ja, és mindegyik kijelzőmmel ugyanez történik .
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Arduino kezdő

Hozzászólás Szerző: kapu48 »

Az anód a pozitív, a katód a negatív. (5101BS típusúak, közös anód),
Ezek szerint a LED-ek ismerik a fizikát. Csak te vagy meg keveredve!
czizsoart
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2019. február 19. kedd, 20:01

Re: Arduino kezdő

Hozzászólás Szerző: czizsoart »

Ezt én is tudom, és az anód lábakat a pozitívra is (+3.3V) kötöttem.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Arduino kezdő

Hozzászólás Szerző: kapu48 »

Ezért világit a LED mikor a katodon negativ szint van LOW = 0V
czizsoart
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2019. február 19. kedd, 20:01

Re: Arduino kezdő

Hozzászólás Szerző: czizsoart »

Tehát akkor mi a megoldás?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Arduino kezdő

Hozzászólás Szerző: kapu48 »

Javítod a programodat:

Kód: Egész kijelölése

//0
digitalWrite(pinA, LOW); 
digitalWrite(pinB, LOW); 
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, HIGH );
//1
....
czizsoart
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2019. február 19. kedd, 20:01

Re: Arduino kezdő

Hozzászólás Szerző: czizsoart »

OK, ezt értem, de mi a magyarázata annak, hogy a pinA-F kimenetek magas szinten vannak, ennek ellenére nem világítanak a diódák, a pinG, ami viszont LOW-ra van állítva az meg világít?? Sima LED-ek esetében akkor világít a LED, ha az adott kimeneten HIGH van.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Arduino kezdő

Hozzászólás Szerző: kapu48 »

A sima LED-et fordítva is belehet kötni az anod van a kimeneten, katód a GNDn! Ez esetben igaz az állításod.
De itt az anod közös! Ezért csak a katod mehet a kimenetekre, és az anod a VCCre.

(Vegyél közös katódú kijelzőt! És megszünnek a problémáid.)
Ez a program arra van írva.
juhasz
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2017. február 8. szerda, 22:17

Re: Arduino kezdő

Hozzászólás Szerző: juhasz »

Üdv!
Abba a problémába futottam bele, hogy nem értem a függvények működését. Van egy óra program, Ws2812-es ledmátrixhoz, uno lappal. A loop-ban csak az óra percet írja ki. Minden 30 másodperckor átugrik egy datum függvénybe, ami a dátumot írja ki, futtatva a mátrixon. Ha ez lefutott, átugrik egy harmadik függvénybe, ami alulról fölfelé beúsztatja az időt, visszatér a loop-ba és a következő perc 30. másodpercéig állva írja az időt.. Eddig ez jól működik.
Viszont, ha vizsgálom a dátumot, és pl karácsonykor a datum függvényből átléptetem egy külön függvénybe, ami a "kellemes karácsonyt" írja a dátum után, és innét küldöm az időt beusztató függvénybe, ami beusztatás után a loop-ba tér vissza, nem jól működik. Kilép a loop-ból még a kiléptetés feltételének érvényesülése előtt. Soros monitoron nézve, nyolcszor fut le a loop és már lép ki.
Tehát:
loop-datum-beusz-loop jól működik
loop-datum-karacsony-beusz-loop nem jól működik.
Nem tudom érthetően fogalmaztam-e :).

Kód: Egész kijelölése

 #include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
//#include <Fonts/TomThumb.h> // betűtipus
//#include <Fonts/FreeSerif9pt7b.h>


#include <Wire.h>
#include<DS3231.h>
DS3231 Clock; 

RTClib RTC; 

char t[32];
char t2[32];
char t3[32];
#define PIN 6

int fenyero=15;
int contr;


Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(32, 8, PIN,

//NEO_MATRIX_TOP + NEO_MATRIX_LEFT +
  NEO_MATRIX_BOTTOM    + NEO_MATRIX_RIGHT +
  NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,

//NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,

  
  NEO_GRB            + NEO_KHZ800);



 const uint16_t colors[] = {
     matrix.Color(150, 100, 80), matrix.Color(0, 255, 0), matrix.Color(255, 0, 0),matrix.Color(0, 0, 255),
     matrix.Color(255, 0, 255), matrix.Color(0, 255, 255), matrix.Color(255, 255, 255)};

void setup() {

 pinMode(3, INPUT_PULLUP);
 pinMode(4, INPUT_PULLUP); 
  matrix.begin();
  matrix.setTextWrap(false);
 
  matrix.setTextColor(colors[0]);


  Wire.begin();
    Clock.setYear(19);
    Clock.setMonth(12);
    Clock.setDate(24);
Serial.begin (115200);

}
 

int hx    = matrix.width();

int hy = matrix.height();




void loop(){
  
        if (digitalRead(3)==LOW)
          {
            DateTime now = RTC.now();
          int ora = now.hour();    
          int perc =(now.minute()+1);
            if (perc>=60) {ora++ ; perc=0 ; }
                if (ora>=24) {ora = 0;}
      Clock.setMinute(perc);
      Clock.setHour(ora);
      Clock.setSecond(0);
     delay(200);
           }

    
 
   contr=analogRead(A2);
   fenyero=map(contr,500,980,5,50);
   if (fenyero<5) {fenyero=5;}
  Serial.println("loop");
   hx=2;
   matrix.fillScreen(0);
   matrix.setCursor(hx, 1);
   DateTime now = RTC.now();
  
  Serial.println(now.second());

  
 
   matrix.setBrightness(fenyero);
   matrix.setTextColor(colors[1]);

  
   sprintf(t3,"%02d:%02d",  now.hour(), now.minute());
  //sprintf(t2, "%02d:%02d:%02d",  now.hour(), now.minute(), now.second());
   matrix.print(t3);



 
  
  matrix.show();
   delay(85);
 
 
 
   
     if (now.second() == 30) 
       { 
          datum(); }

   
 }

 void datum() {
  
     if (digitalRead(4)==LOW) {
        DateTime now = RTC.now();
         int honap =   now.month();  
         int nap=(now.day()+1);
         if (nap>=32) { honap++ ; nap = 1 ; }
         if (honap>=13) { honap = 1; }
         Clock.setDate(nap);
         Clock.setMonth(honap);
           hx = -27;
           delay (200);
                }  
  
  delay(95);
  DateTime now = RTC.now();
  Serial.println("datum");
  matrix.setBrightness(fenyero);

  sprintf(t, "%02d-%02d-%02d ", now.year(), now.month(),now.day() );  
  
 // sprintf(t2, "%02d:%02d:%02d",  now.hour(), now.minute(), now.second());
//sprintf(t3,"%02d:%02d",  now.hour(), now.minute());
  
  matrix.fillScreen(0);
  matrix.setCursor(hx, 1);

  
   matrix.setTextColor(colors[6]);
  matrix.print(t);
  //matrix.setTextColor(colors[3]);
  //matrix.print (DoW);
  matrix.setTextColor(colors[4]);
  matrix.print((Clock.getTemperature()-2),1);
  matrix.print(" C");
  matrix.show();
  

       if(--hx < -85
        ) {
            hx = matrix.width();
                     }

 
     switch (now.month()) {
       case 12: 
         
       if ((hx==-84) and  now.day()>23 and now.day()<26)
       { hx=20;karacsony();}
         break;
      
        
      case 1 : 
    
        if (hx==-84 and  now.day()==12)
        {hx=25 ; sznap();}
          break ;
                   }
  if (hx>-84) {datum();}  
  else {hx=2; hy=8; beusz();}
  
 
}

void karacsony(){
 
  matrix.setBrightness(fenyero);
  matrix.fillScreen(0);
  matrix.setCursor(hx, 1);

  Serial.println("karacsony");
 // Serial.println (hx);
  matrix.setTextColor(colors[2]);
 
  matrix.print("Kellemes karacsonyt!");
  matrix.show();
  delay(95);

  if(--hx < -95
  ) {
    hx = matrix.width();
    }
   if (hx>-94) {karacsony();}  
    else { hy=8; beusz();}
}

void sznap(){
  
  matrix.setBrightness(fenyero);
  matrix.fillScreen(0);
  matrix.setCursor(hx, 1);

  Serial.println("sznap");
 // Serial.println (hx);
  matrix.setTextColor(colors[2]);
 
  matrix.print("Boldog szulinapot!");
  matrix.show();
  delay(95);

      if(--hx < -80)
      {
         hx = matrix.width();
                }
    if (hx>-79) {sznap();}  
    
   else { hy=8; beusz();}
      
}



void beusz(){

  Serial.println("beusz");
  // Serial.println(y);
  matrix.fillScreen(0);
  matrix.setCursor(2, hy);
  DateTime now = RTC.now();
  
  

  
 
   matrix.setBrightness(fenyero);
   matrix.setTextColor(colors[1]);
   sprintf(t3,"%02d:%02d",  now.hour(), now.minute());
  //sprintf(t2, "%02d:%02d:%02d",  now.hour(), now.minute(), now.second());
 

          if(--hy < 0)
          {
             hy = matrix.height();
                }

  matrix.print(t3);
  
  matrix.show();
   delay(85);
  if (hy>0){beusz();}

  if (hy == 0) {loop() ;}
}
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Arduino kezdő

Hozzászólás Szerző: Robert »

hx, és hy értékek mire valók? Mindenféle negatív számot adsz nekik miközben az a mátrixod mérete lenne...
http://www.tavir.hu - a gazda :)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Arduino kezdő

Hozzászólás Szerző: kapu48 »

Hiba a 262. sorban. A loop()-ot nem szabad meghívni:

Kód: Egész kijelölése

  if (hy == 0) {loop() ;}
A rutin végén a program automatikusan visszatér az őt hívó sor utáni utasításra.
Ezzel leemeli a veremről a híváskor oda mentet visszatérési értéket.
Most nálad ez az érték ott marad, ezzel növeled a verem méretet.
Mikor meghívod a loop()-ot, a visszatérési érték megint a verembe kerül.
És mivel a loop()-ból soha nem térsz vissza sehova, ez rajta is marad a vermen.

Ez ám a verem többszörös túlterhelésének tipikus példája.

Nem csoda, hogy elszáll a programod.
juhasz
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2017. február 8. szerda, 22:17

Re: Arduino kezdő

Hozzászólás Szerző: juhasz »

Akkor nem is tudom a "beusz"-t visszairányítani a "loop"-ba, ha a "datum"-ból ugrok a "beusz"-ba?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Arduino kezdő

Hozzászólás Szerző: Robert »

Rossz a programlogikád.

Kulcsszó: Állapotgép
http://www.uni-obuda.hu/users/schuster.gyorgy/sm.pdf

A loop()-ban annyit csinálsz, hogy az egyes állapotok alapján meghívod az alprogramokat

Kvaziprogram:

Kód: Egész kijelölése

setup()
allapot = 3

loop()
if datum = karacsony napjai : allapot= 2 else allapot=1
if allapot = 1 : siman_fut
if allapot = 2 : karacsony
if allapot = 3 : beuszikaszoveg
if allapot = 4 vagy allapot = 0 : elbalta 'ilyen allapot nem lehet...
if beallitogomb = megnyomva : beallitomenu


siman_fut:
setal a kijelzes....

karacsony:
fenyofarajzolas, zene

beuszikaszoveg:
ledsor_bevezetesi_intro
allapot=1

beallitomenu:
idoallitas, finomitas
Megjegyzes - jobb működés miatt: a beallitas nem állapotgéppel, hanem megszakítás alapon fel/le léptetéssel futás alatt állítható.
http://www.tavir.hu - a gazda :)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Arduino kezdő

Hozzászólás Szerző: kapu48 »

Mint írtam előbb, minden rutin a végén visszatér az őt hívó rutinba.

Kód: Egész kijelölése

A helyes program szervezés így néz ki:  
	
loop(){
  ...
  karacsony(); // hivunk 1 rutint
// karacsony()-ból ide tér vissza	
}	// Vissza ugrik a loop() elejére


void karacsony(){
 ...
	beusz(); // // hivunk 1 rutint
	
} //Visszatér a loop()-ba, a karacsony(); hívás utánra

void beusz(){
Beusz:  // címke ide akarok ugrani
  ...
	// kezdő ként ne használd
  //if (hy>0){beusz();} // saját magát meghívó rutin, hibás működést fog okozni.
	if (hy>0){goto Beusz;} // a goto alkalmasabb ide
	// Viszont tilos goto-val kiugrani a rutinból, szintén verem kezelési hibát okoz!
} // visszatér a karacsony()-ba a beusz(); hívás utánra
//
juhasz
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2017. február 8. szerda, 22:17

Re: Arduino kezdő

Hozzászólás Szerző: juhasz »

Köszönöm a segítségeteket! Nekiállok újraírni :)
Válasz küldése