Go Down

Topic: Aloittelijan ongelmia (Read 4284 times) previous topic - next topic

Jukka1958

Tarkoitus olisi "Sulautetut" kirjan harjoitusta "Blink" virittää siten että ledejä olisi 4, ja kaikki vilkkuu erilaisella viiveellä.
Nyt vaan ei mene lanttuun mikä menee pieleen, "Setup" osio koodissa on taatusti väärin, ja se vaikuttanee myös loopin toimintaan.
Kokeneemmat huomannevat varmaan missä on nyt tunaroitu. Näin kait oppii parhaiten tämänkin.. :D

terv,Jukka

// Blink2JR.pde - Vilkuttaa ledejä


int led1Pin = 12;
int led2Pin = 11;
int led3Pin = 10;
int led4Pin = 13;

void setup()
{
        pinMode(12, OUTPUT);
        pinMode(13, OUTPUT);
        pinMode(10, OUTPUT);
        pinMode(11, OUTPUT);
}

void loop()
{
   digitalWrite(led1Pin, HIGH);
   delay(1000);
   digitalWrite(led1Pin, LOW);
   delay(1000);
        digitalWrite(led2Pin, HIGH);
   delay(2000);
   digitalWrite(led2Pin, LOW);
   delay(2000);
        digitalWrite(led3Pin, HIGH);
   delay(3000);
   digitalWrite(led3Pin, LOW);
   delay(3000);
        digitalWrite(led4Pin, HIGH);
   delay(4000);
   digitalWrite(led4Pin, LOW);
   delay(4000);
}

frasco

Siis kronologisesti tuo koodihan näyttää tältä:

0 sek LED1 palaa
1 sek LED1 sammuu
[1 sek tauko]
2 sek LED2 palaa
4 sek LED2 sammuu
[2 sek tauko]
6 sek LED3 palaa
9 sek LED3 sammuu
[3 sek tauko]
12 sek LED3 palaa
[4 sek tauko]
16 sek LED4 palaa
20 sek LED4 sammuu
24 sek päästä koko homma alkaa uudestaan.

Haluatko että LED1 vilkkuu 1 sek aikavälillä, LED2 2 sek. aikavälillä etc.. niin että ne palavat sikin sokin päällekkäin?

Jos tehdään rumaa koodia niin:

digitalWrite(led1Pin, HIGH);
digitalWrite(led2Pin, HIGH);
digitalWrite(led3Pin, HIGH);
digitalWrite(led4Pin, HIGH);
delay(1000);
digitalWrite(led1Pin, LOW);
delay(1000);
digitalWrite(led1Pin, HIGH);
digitalWrite(led2Pin, LOW);
delay(1000);
digitalWrite(led1Pin, LOW);
digitalWrite(led3Pin, LOW);
delay(1000);
digitalWrite(led1Pin, HIGH);
digitalWrite(led2Pin, HIGH);
digitalWrite(led4Pin, LOW);
delay(1000);
digitalWrite(led1Pin, LOW);
delay(1000);
digitalWrite(led1Pin, HIGH);
digitalWrite(led2Pin, LOW);
digitalWrite(led3Pin, HIGH);
delay(1000);
digitalWrite(led1Pin, LOW);
delay(1000);
digitalWrite(led1Pin, LOW);
digitalWrite(led2Pin, HIGH);
digitalWrite(led4Pin, HIGH);
delay(1000);
digitalWrite(led1Pin, HIGH);
digitalWrite(led3Pin, LOW);
delay(1000);
digitalWrite(led1Pin, LOW);
digitalWrite(led2Pin, LOW);
delay(1000);
digitalWrite(led1Pin, HIGH);
delay(1000);
digitalWrite(led1Pin, LOW);
digitalWrite(led2Pin, HIGH);
digitalWrite(led3Pin, HIGH);
digitalWrite(led4Pin, LOW);
delay(1000);
digitalWrite(led1Pin, HIGH);
delay(1000);
digitalWrite(led1Pin, LOW);
digitalWrite(led2Pin, LOW);
delay(1000);
digitalWrite(led1Pin, HIGH);
digitalWrite(led3Pin, LOW);

etc......

Koodin voi tehdä paljon yksinkertaisemmin mutta en uskalla kirjoittaa koodia tässä kun ei ole Arduinoa lähettyvillä.

Jukka1958

Moi!

Joo, jotakuinkin noin kuten kirjoitit. Eli Led1 vilkkuu 1 sek välein, Led2 2 sek välein ,Led3 3sel välein.. ja tietenkin päällekkäin ne villkkuu
näin ollen.

Tuo laittamani koodi on muokattu siitä peruskoodista joka vilkuttaa yhtä lediä, ja Uploadattaessa softa rupesi marmattamaan siitä alkulitaniasta.

Tässä olisi yksi vaihtoehtoinen tapa hoitaa tuo homma.
Vilkkuminen tapahtuu seuraavan kaavion mukaan:
1 led 1s taukoa 1s palaa.......loop
2 led 2s taukoa 1s palaa.......loop
3 led 3s taukoa 1s palaa.......loop
4 led 4s taukoa 1s palaa.......loop

Silmukassa käytetään laskuria ja tutkitaan jakojäännöstä jonka perusteella ledit sytytetään ja niitä pidetään päällä yksi sekunti.

Koodi:
int count = 0;

void setup() {
  // use a for loop to initialize each pin as an output:
  for (int thisPin = 10; thisPin < 14; thisPin++)  {
    pinMode(thisPin, OUTPUT);     
  }
}

void loop() {
  count++;

  // Turn LEDs on individually...
  if (count % 2 == 0)
    digitalWrite(10, HIGH);

  if (count % 3 == 0)
    digitalWrite(11, HIGH);

  if (count % 4 == 0)
    digitalWrite(12, HIGH);

  if (count % 5 == 0)
    digitalWrite(13, HIGH);

  // Sleep 1s with specific LEDs ON
  delay(1000);

  // Turn all LEDs OFF
  for (int thisPin = 10; thisPin < 14; thisPin++)  {
    digitalWrite(thisPin, LOW);     
  }
}

Jukka1958

Jep , tämä toimi! :) Kiitos opastuksesta. Pitää hankkia yksi opus tähän homman, mikrokontrollereja käsittelevä kirja suomenkielinen, nimi taitaa olla "mikrokontrollerit ja ohjelmointi" .. jotain sinne päin.. pääsee paremmin jyvälle koodauksesta.

#5
Dec 06, 2011, 12:09 am Last Edit: Dec 06, 2011, 08:00 pm by sWaltsu Reason: 1
Oli niin osuva otsikko että pakko käyttää hyväksi!

Hommasin tuon Arduino UNO:n ja samalla ARD LCD216 näytön, joka menee suoraan UNO:n päälle.

Hommahan alkoi suoraan sillä että näyttö peruskortin päälle ja USB-kaapeli kiinni.
Näytössä vilkkui "kursoriviiva"....

Sitten Arduino 1.0 ohjelmalla latasin sinne sen Hello World! jutun... Eikä sen koomin ole mitään näytössä näkynytkään?

Olen koittanut uudestaan ja uudestaan asennella sitä...

Sitten löytyi linkki, jossa olisi näytölle oma "koodi":

Quote
//example use of LCD4Bit_mod library

#include <LCD4Bit_mod.h>
//create object to control an LCD.  
//number of lines in display=1
LCD4Bit_mod lcd = LCD4Bit_mod(2);

//Key message
char msgs[5][15] = {"Select Key OK",//"Right Key OK ",
                   "Right Key OK",//"Up Key OK    ",
                   "Up Key OK    ",//"Down Key OK  ",
                   "Down Key OK  ",//"Left Key OK  ",
                   "Left Key OK  "};
int  adc_key_val[5] ={20, 270, 520, 690, 880};
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int oldkey=-1;

void setup() {
 pinMode(13, OUTPUT);  //we'll use the debug LED to output a heartbeat

Tämän jälkeen tulee virheilmoitus:
lcd.cpp:3:26: error: LCD4Bit_mod.h: No such file or directory
lcd:5: error: 'LCD4Bit_mod' does not name a type
lcd.cpp: In function 'void setup()':
lcd:22: error: 'lcd' was not declared in this scope
lcd.cpp: In function 'void loop()':
lcd:50: error: 'lcd' was not declared in this scope

Eli tätä en saa edes ladattua tuonne UNO:lle.




Olenko nyt pilannut koko laitoksen vai mitäs pitäisi tehdä?

#6
Dec 06, 2011, 02:20 am Last Edit: Dec 06, 2011, 08:03 pm by sWaltsu Reason: 1
Tuli jatkettua tätä tutkimista....

koodinpätkässä lukee:
Quote

 The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2


Quote
Kun taas itse näytön kortilla (ADR LCD216) on käytössä vain 4,5,6,7,8 ja 9 ??

No muutin nuo numerot vähän paremmin pitävämmiksi... nyt näytöllä kyllä näkyy jotain. Mutta sekameteliä vaan?
Välillä on joku numero, mutta pääsosin vaan sekasta?

Olen koittanut arpoa noita numeroita eri järjestykseen mutta tuloksetta ;(


Nonni ratkesi siis ;)
8,9,4,5,6,7 on oikea lottorivi, jotta tuo partcossa myyty toimii.

Mutta en vieläkään saa sitä näytön mukana tulevaa koodia toimiin?

racer123

lcd.cpp:3:26: error: LCD4Bit_mod.h: No such file or directory
lcd:5: error: 'LCD4Bit_mod' does not name a type
lcd.cpp: In function 'void setup()':
lcd:22: error: 'lcd' was not declared in this scope
lcd.cpp: In function 'void loop()':
lcd:50: error: 'lcd' was not declared in this scope

Näyttäisi toisen aloittelija silmään siltä, ettei arduinon kehitysympäristö löydä tiedostoa "LCD4Bit_mod.h". Mistä tää koodi on?

Jimicc

Joo siis tämä ".h" siinä alussa on se ladattava kirjasto.. ja jos sitä ladattavaa kirjastoa ei ole olemassakaan niin arduinolla ei ole hajuakaan mitä nämä kommentit tässä meinaa jos ne poikkeaa perus kommenteista.. arduinossa on kyllä oma kirjasto tuolle lcd:lle -->

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


Sitä vaan nyt ihmettelin tuossa että mihin työnsit ne numerot jos käytit edellämainittua koodia?  :smiley-eek-blue:
Quote
Nonni ratkesi siis ;)
8,9,4,5,6,7 on oikea lottorivi, jotta tuo partcossa myyty toimii.




masavee

itse aloittelijana ymmärsin (en vielä kokeillut kun näyttöä ei ole tullut postiin vielä robomaalta)

ensin kerrotaan mitä kirjastoja käytetään esm,juuri liguidcrystal.h joka taas on kansiossa arduino library.johon lisäät eri näytöillä eri xxxx.h tiedoton.itselle tulee käyttöön kai tuo i2c.h koska 12c näyttö kyseessä,ei standardi hd47600 tms,liguidcrystaL näyttö.eli eri näytöllä eri xxxx.h tiedosto ymmärsin.voi tehdä myös omia .h tiedostoja.(automatisoida vakio antureitaan ja koodejaan) kai ?

xxxx.h on tiedosto jolla näytön/arduinon saa ymmärtämään mitä merkkejä näytetään ja mitkä pinnit käytössä.

sitten kerrotaan ne pinnit mitkä näytöllä on käytössä= init pins 1,2,3,4,56, tms järjestys,selviää näytön data-sheetiltä.
rs.enable,data,  ja näytölle menevät.

lopuksi vielä koodia sitten,mitä näytetään missä,miksi,tekstit,yms,esm,  "temperature on nyt xxC astetta" jossa xx on tulo portilta tai laskun kaavan tulo val,dec,tms. arvo,decimaali,hex=hexadecimaaleina,yms,miten esität senn näytöllä.
jotenkin näin kait sen pitäisi toimia. olen ymmärtänyt.

Go Up