Arduino kezdő
Re: Arduino kezdő
(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 .
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 .
Re: Arduino kezdő
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!
Ezek szerint a LED-ek ismerik a fizikát. Csak te vagy meg keveredve!
Re: Arduino kezdő
Ezt én is tudom, és az anód lábakat a pozitívra is (+3.3V) kötöttem.
Re: Arduino kezdő
Ezért világit a LED mikor a katodon negativ szint van LOW = 0V
Re: Arduino kezdő
Tehát akkor mi a megoldás?
Re: Arduino kezdő
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
....
Re: Arduino kezdő
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.
Re: Arduino kezdő
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.
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.
Re: Arduino kezdő
Ü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 .
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() ;}
}
Re: Arduino kezdő
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
Re: Arduino kezdő
Hiba a 262. sorban. A loop()-ot nem szabad meghívni:
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.
Kód: Egész kijelölése
if (hy == 0) {loop() ;}
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.
Re: Arduino kezdő
Akkor nem is tudom a "beusz"-t visszairányítani a "loop"-ba, ha a "datum"-ból ugrok a "beusz"-ba?
Re: Arduino kezdő
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:
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ó.
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
http://www.tavir.hu - a gazda
Re: Arduino kezdő
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
//
Re: Arduino kezdő
Köszönöm a segítségeteket! Nekiállok újraírni