# Συζήτηση Κυκλωμάτων > Ψηφιακά Κυκλώματα > Μικροελεγκτές >  >  Προγράμματα andruino

## her

Μαθαίνω andruino αλλά έχω κάποιες απορίες

Στο παρακάτω παράδειγμα αναβοσβήνει το led ανάλογα με το πώς είναι ρυθμισμένο το ποτενσιόμετρο. Πως μπορεί να γίνει αυτό ποιο αργό; Ρυθμίζει κανονικά το ποτενσιόμετρο αλλά θέλω να πηγαίνει ακόμα ποιο αργά. Δοκίμασα πολλά αλλά δεν το έχω βρει ακόμα.




```
int sensorPin = A0;    // select the input pin for the potentiometer
int ledPin = 13;      // select the pin for the LED
int sensorValue = 0;  // variable to store the value coming from the sensor

void setup() {
  // declare the ledPin as an OUTPUT:
  pinMode(ledPin, OUTPUT);  
}

void loop() {
  // read the value from the sensor:
  sensorValue = analogRead(sensorPin);    
  // turn the ledPin on
  digitalWrite(ledPin, HIGH);  
  // stop the program for <sensorValue> milliseconds:
  delay(sensorValue);          
  // turn the ledPin off:        
  digitalWrite(ledPin, LOW);   
  // stop the program for for <sensorValue> milliseconds:
  delay(sensorValue);                  
}
```

----------


## nestoras

```
// stop the program for for <sensorValue> milliseconds:
  delay(sensorValue);
```


μπορείς να αντικαταστήσεις την παραπάνω γραμμή με κάτι τέτοιο:




```
delay(sensorValue*10);
```


δηλαδή να βάλεις έναν πολλαπλασιαστή για το πόση ώρα θα είναι σβηστό.
Κάτι αντίστοιχο μπορείς να κάνεις και το πόση ώρα θα είναι αναμμένο:




```
// stop the program for <sensorValue> milliseconds:
  delay(sensorValue);
```

----------


## kplgr

> Μαθαίνω andruino αλλά έχω κάποιες απορίες
> 
> Στο παρακάτω παράδειγμα αναβοσβήνει το led ανάλογα με το πώς είναι ρυθμισμένο το ποτενσιόμετρο. Πως μπορεί να γίνει αυτό ποιο αργό; Ρυθμίζει κανονικά το ποτενσιόμετρο αλλά θέλω να πηγαίνει ακόμα ποιο αργά. Δοκίμασα πολλά αλλά δεν το έχω βρει ακόμα.
> 
> 
> 
> 
> ```
> int sensorPin = A0;    // select the input pin for the potentiometer
> ...



Εύκολο είναι.. 

Αν θυμάμαι καλά το analogRead() επιστρέφει μία τιμή στο διάστημα 0-1024.

Επομένως ως έχει, το delay σου θα είναι 0-1024ms. Αν τώρα εσύ γράψεις sensorValue = analogRead(sensorPin) * A/1024, το delay θα είναι από 0 εως A.

Αν θες μπορείς επίσης να χρησιμοποιήσεις και την συνάρτηση map() του arduino που θα κάνει το ίδιο ακριβώς πράγμα.. Αλλά νομίζω ότι η δική μου εκδοχή είναι καλύτερη :P 


ΥΓ Αν δεν σου παίζει και βγαίνει πάντα 0, δοκίμασε να το βάλεις όλο μέσα σε μια round(), ίσως να μην δουλέψει το (δεκαδικός) * ακέραιος

----------


## kplgr

Και έτσι για τα πρακτικά, αν θές να χρησιμοποιήσεις το map θα πρέπει να βάλεις κάτι σαν sensorValue = map(analogRead(sensorPin), 0, 1024, 0, A) όπου A το ανώτατο όριο που θέλεις, όπως και πριν

----------


## her

Σας ευχαριστώ
Έκανα όπως μου το είπατε και δούλεψε
 Μια ερώτηση ακόμα (ίσως να κάνω αρκετές)
Στο παρακάτω πρόγραμμα την σύγκριση if δεν την κάνει πάντα αλλά την κάνει όταν τελειώσει το πρόγραμμα και ξανά ξεκινήσει από την αρχή. Πως γίνετε να κάνει σύγκριση πάντα; Τώρα αν πατήσω το button όταν το led είναι αναμμένο δεν κάνει τίποτα. Πρέπει να περιμένω να σβήσει για να ξανά διαβάσει το if




```
const int buttonPin = 12;     
const int ledPin =  11;         
const int led1 =  10; 
int ranNum;
int buttonState = 0; 
void setup() {
    pinMode(led1, OUTPUT);  //
    pinMode(ledPin, OUTPUT); // 
    pinMode(buttonPin, INPUT);
}
    void loop() {
     buttonState = digitalRead(buttonPin);
        
      if ( buttonState==HIGH) {
      
        digitalWrite (OUTPUT, LOW);
        digitalWrite(led1, HIGH); 
        delay (3000);
        digitalWrite(led1, LOW);
      }
        else {
   
          digitalWrite(ledPin, HIGH);
          delay(1000);
          digitalWrite(ledPin, LOW);
          delay(1000);
        }}
```

----------


## ioanniskar

Ο λόγος που το κάνει αυτό είναι η delay.
Η εντολή delay παγώνει το πρόγραμμα για όσα ms λέει στην παρένθεση οπότε σταματά να εκτελείται ότι βρίσκεται κάτω από την delay.

Έχεις 2 LEDs. Αν διαβάζω σωστά όπως είναι τώρα αναβοσβήνει το ledPin ανά δευτερόλεπτο και αν πατηθεί ένα κουμπί ανάβει το led1, μένει αναμμένο για 3", μετά σβήνει και αρχίζει να αναβοσβήνει πάλι το ledPin. Τι θέλεις να πετύχεις με το παραπάνω sketch; Τι θέλεις να συμβαίνει αν πατήσεις το κουμπί με αναμμένο το led1;

----------


## her

θέλω την στιγμή που το ledpin είναι αναμμένο και ταυτόχρονα πατηθεί και το μπουτον τότε να σβήσει το ledpin να ανάψει το άλλο (led1) για 3 δευτερόλεπτα.

----------


## ioanniskar

Δεν έχω πρόχειρο Arduino για να το δοκιμάσω και δεν ξέρω αν μου ξεφεύγει κάτι και δεν δουλεύει αλλά δοκίμασε αυτό:
(είπες ότι μαθαίνεις Arduino και έγραψα και κάποια σχόλια. Αν δεν καταλαβαίνεις κάτι πες μου)




```
const int buttonPin = 12;     
const int ledPin =  11;         
const int led1 =  10; 
int ranNum;
int buttonState = 0; 


boolean ledState = false; //οταν ειναι true αναβει το ledPin, οταν ειναι false σβηνει
long previousMillis = 0; //η τελευταια φορα που εσβησε ΄η αναψε το ledPin
long blinkInterval = 1000; //ο χρνος σε ms που μενει αναμμενο/σβηστο το ledPin


void setup() {
    pinMode(led1, OUTPUT);
    pinMode(ledPin, OUTPUT);
    pinMode(buttonPin, INPUT);
}


void loop() {
  buttonState = digitalRead(buttonPin);
  
  if (buttonState==HIGH) {
    digitalWrite(ledPin, LOW);
    digitalWrite(led1, HIGH); 
    delay (3000);
    digitalWrite(led1, LOW);
  }
  else{
    //Με τον παρακατω τροπο η συνθηκη θα ισχυει καθε 1000ms. Καταργουμε την delay ωστε να μην παγωνει το προγραμμα και να εκτελουνται ολοι οι αλλοι ελεγχοι μεσα στη loop
    unsigned long currentMillis = millis(); //η millis() επιστρεφει τον χρονο απο τη στιγμη που ξεκινησε να δουλευει το arduino
    if(currentMillis - previousMillis > blinkInterval) {//ελεγχουμε αν απο την τελευταια φορα που αναβοσβησε το ledPin περασε χρονος > blinkInterval
      previousMillis = currentMillis; //previousMillis = currentMillis ωστε να πρεπει να περασουν αλλα 1000ms για να ισχυει η παραπανω συνθηκη
      if (!ledState) digitalWrite(ledPin, HIGH); //αν το ledPin ειναι σβηστο το αναβουμε
      else digitalWrite(ledPin, LOW); //αλλιως το σβηνουμε
      ledState = !ledState; //αληθεςψευδες για να μπαινει εναλλαξ στις παραπανω if και else και να αναβοσβηνει
    }
  }
}
```

----------


## her

Γιάννη σε ευχαριστώ. Πράγματι λειτουργεί. Επειδή όμως αρχίζει και γίνεται πολύπλοκο και θέλω να φτιάξω αρκετά μεγάλο πρόγραμμα υπάρχει ποιο εύκολος τρόπος; Π.χ να αντικατασταθεί μόνο η εντολή delay με κάποια άλλη.. Ή είναι μονόδρομος το πρόγραμμα που μου έφτιαξες;

----------


## ioanniskar

Δεν μου έρχεται στο μυαλό κάποιος άλλος τρόπος για να αντικαταστήσεις την delay. Σίγουρα δεν είναι μονόδρομος αυτό που σου έγραψα αλλά είναι αρκετά απλός τρόπος αν καταλάβεις πώς λειτουργεί. Τι θα κάνει το πρόγραμμα που θα γράψεις και θα είναι τόσο μεγάλο;
Αν το Arduino σου έχει τον μικροελεγκτή ATMEGA328 έχεις 30KB διαθέσιμα για το πρόγραμμά σου τα οποία είναι υπεραρκετά. Για παράδειγμα το πρόγραμμα που τρέχει γι αυτή την κατασκευή μου είναι ~1000 γραμμές και πιάνει 25KB.

----------


## her

Πως θα μπορούσα να αντικαταστήσω το παρακάτω πρόγραμμα χωρίς την χρήση delay (για να μπορεί να τρέχει ταυτόχρονα το υπόλοιπο πρόγραμμα)




```
        digitalWrite(led1, HIGH); 
        delay (3000);
        digitalWrite(led1, LOW);
        delay (1000);
        
        digitalWrite(led1, HIGH); 
        delay (1000);
        digitalWrite(led1, LOW);  // μόνιμα LOW
```

----------


## manolena

> Πως θα μπορούσα να αντικαταστήσω το παρακάτω πρόγραμμα χωρίς την χρήση delay (για να μπορεί να τρέχει ταυτόχρονα το υπόλοιπο πρόγραμμα)
> 
> 
> 
> 
> ```
> digitalWrite(led1, HIGH); 
>         delay (3000);
>         digitalWrite(led1, LOW);
> ...



Χρησιμοποιείς διακοπές που παράγει κάποιος timer και εκτελείς το αναβόσβημα του LED ελέγχοντας κάποια σημαία (boolean ---> 1 ή 0) που αλλάζει κατάσταση κάθε 1 δευτερόλεπτο.

Μπορείς επίσης να χρησιμοποιήσεις τη συνάρτηση millis() που επιστρέφει τα microseconds για όση ώρα είναι σε power up ο arduino και να ελέγχεις σε loop αν η παρούσα ποσότητα msecs έχει ξεπεράσει έναν συγκεκριμένο αριθμό (1000 για 1 δευτερόλεπτο). Αν πας στο directory που έχεις εγκαταστήσει το IDE θα βρείς το φάκελο Examples. Εκεί έχει διάφορα, αλλά θέλουν διάβασμα.




```
/* Blink without Delay
 
 Turns on and off a light emitting diode(LED) connected to a digital  
 pin, without using the delay() function.  This means that other code
 can run at the same time without being interrupted by the LED code.
 
 The circuit:
 * LED attached from pin 13 to ground.
 * Note: on most Arduinos, there is already an LED on the board
 that's attached to pin 13, so no hardware is needed for this example.
 
 
 created 2005
 by David A. Mellis
 modified 8 Feb 2010
 by Paul Stoffregen
 
 This example code is in the public domain.


 
 http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
 */


// constants won't change. Used here to 
// set pin numbers:
const int ledPin =  13;      // the number of the LED pin


// Variables will change:
int ledState = LOW;             // ledState used to set the LED
long previousMillis = 0;        // will store last time LED was updated


// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long interval = 1000;           // interval at which to blink (milliseconds)


void setup() {
  // set the digital pin as output:
  pinMode(ledPin, OUTPUT);      
}


void loop()
{
  // here is where you'd put code that needs to be running all the time.


  // check to see if it's time to blink the LED; that is, if the 
  // difference between the current time and last time you blinked 
  // the LED is bigger than the interval at which you want to 
  // blink the LED.
  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED 
    previousMillis = currentMillis;   


    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;


    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
  }
}
```

----------


## her

Μάνο σε ευχαριστώ. Τέτοιο πρόγραμμα μου έδειξε και ο Γιάννης. Πάνω σε αυτό το πρόγραμμα προσπαθώ να το διαμορφώσω σύμφωνα με της δικές μου ανάγκες αλλά δεν το καταφέρνω. Δεν μου τρέχει σωστά. Δεν έχω τώρα πρόχειρο τον κώδικα που είχα γράψει αλλά δεν δούλευε όπως έπρεπε.

----------


## manolena

Αν τον βρείς, καλά θα είναι μήπως μπορούμε να βοηθήσουμε.

----------


## her

Θέλω να ανάβει το led για π.χ 4 δευτερόλεπτα και μετά να μένει μόνιμα σβηστό.
Έχω γράψει αυτό το πρόγραμμα αλλά κάνει το ακριβώς αντίθετο. Μένει σβηστώ και μετά ανάβει μόνιμα




```
const int ledPin =  13;      // the number of the LED pin

// Variables will change:
int ledState = LOW;             // ledState used to set the LED
long previousMillis = 0;        // will store last time LED was updated

// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long interval = 4000;           // interval at which to blink (milliseconds)

void setup() {
   pinMode(ledPin, OUTPUT);      
}

void loop()
  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED 
    previousMillis = currentMillis;   

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW)
      {digitalWrite(ledPin, HIGH);
      ledState = LOW;}
}
```

----------


## manolena

EDIΤ: Λάθος σχόλιο...

EDIT: Διόρθωση...
Αντί για αυτό:




```
const int ledPin =  13;      // the number of the LED pin

// Variables will change:
int ledState = LOW;             // ledState used to set the LED
long previousMillis = 0;        // will store last time LED was updated

// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long interval = 4000;           // interval at which to blink (milliseconds)

void setup() {
   pinMode(ledPin, OUTPUT);      
}

void loop()
{
  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED 
    previousMillis = currentMillis;   

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW)
      {digitalWrite(ledPin, HIGH);
      ledState = LOW;}
  }
}
```


...γράψε αυτό:




```
const int ledPin =  13;      // the number of the LED pin

// Variables will change:
int ledState = HIGH;             // ledState used to set the LED
long previousMillis = 0;        // will store last time LED was updated

// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long interval = 4000;           // interval at which to blink (milliseconds)

void setup() {
   pinMode(ledPin, OUTPUT);  
   digitalWrite(ledPin, HIGH);   
}

void loop()
{
  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis > interval) 
  {
    previousMillis = currentMillis;   
    if (ledState == HIGH)
    {
      digitalWrite(ledPin, LOW);
      ledState = LOW;
    }
  }
}
```

----------


## her

Σωστός. Το είχα δοκιμάσει και έτσι αλλά δεν μου δούλεψε. Κάτι λάθος θα έκανα.

----------


## her

Θα μπορούσε να λειτουργήσει ο atmega328p με κρύσταλλο 4MHz αντί για 16MHz ; επίσης θα μπορούσε να μην χρησιμοποιηθεί καθόλου κρύσταλλος, κάνοντας χρήση το εσωτερικό ρολόι; θέλει κάποιο διαφορετικό προγραμματισμό;

----------


## her

Έχω γράψει το παρακάτω κώδικα για να διαβάζω την τιμή ενός ποτενσιόμετρου σε οθόνη lcd. Θέλω δηλαδή να διαβάζω από 0 έως 1024 ανάλογα που έχω ρυθμιζμένο το ποτενσιόμετρο. Στην αρχή είναι εντάξει αλά όταν τερματίσω το ποτενσιόμετρο (1024) και το ξανά κατεβάσω τότε βγάζει ότι τιμή ότι του έρθει π.χ 8935 , 4526. Και τρεμοσβήνει κάποιο ψηφίο, διαφορετικό, κάθε φορά ανάλογα με τον αριθμό


Δοκίμασα με την εντολή map αλλά δεν άλλαξε κάτι
Με το serial.print στον υπολογιστή διαβάζω κανονικά τις τιμές του ποτενσιόμετρου


Ελληνικά πως μπορούμε να γράψουμε σε μια οθόνη lcd;





```
#include <LiquidCrystal.h>
int val =0;
int potPin = 0;
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 
void setup() {
// set up the LCD's number of columns and rows:
 Serial.begin(9600);
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.setCursor(4, 0);
lcd.print("hello !!!");
}
 
void loop() {
lcd.setCursor(1, 1);
val = analogRead(potPin);
lcd.print(val);
Serial.print(val);

lcd.setCursor(8, 1);
// print the number of seconds since reset:
lcd.print(millis()/1000);

}
```

----------


## manolena

Απο το δεύτερο πρώτα, για τα ελληνικά:

Κατ' αρχήν, σε στάνταρ παραγωγή, όλες σχεδόν οι οθόνες χαρακτήρων έχουν στην CGROM τους (*C*haracter *G*enerator *R*ead *O*nly *M*emory) 208 χαρακτήρες σε 5Χ8 dot matrix μορφή που περιλαμβάνουν ASCII χαρακτήρες και γιαπωνέζικους Kana χαρακτήρες. Ωστόσο, υπάρχουν και 8 κενές θέσεις στη μνήμη που μπορούν να προγραμματιστούν με ειδική εντολή σαν bitmaps και με αυτό τον τρόπο να δημιουργηθούν ελληνικά γράμματα. Στις στάνταρ θέσεις μνήμης, υπάρχουν σίγουρα κάποια ελληνικά κεφαλαία γράμματα που χρησιμοποιούνται διεθνώς, όπως το Σ, το Ω. Αν σκεφτείς πως στην ελληνική αλφάβητο, τα μοναδικά ελληνικά γράμματα είναι τα Γ, Δ, Θ, Λ, Ξ, Π, Σ, Φ, Ψ, Ω (10 στο σύνολο δηλαδή) και πως σίγουρα θα βρείς το Σ και το Ω, τότε τα υπόλοιπα 8 μπορείς να τα φτιάξεις εσύ. Στον κώδικα, τα γράφεις στην οθόνη με την εντολή write αντί της print, π.χ.:

lcd.print("HELLO!);
lcd.write(phi);  όπου phi το δηλωμένο όνομα χαρακτήρα στη θέση 1-8 του ROM του LCD.




```
//****************************************************************************************************
byte FI[8] = {
    B01110,
    B10101,
    B10101,
    B10101,
    B01110,
    B00100,
    B00100,
    B00000
};
byte PSI[8] = {
    B10101,
    B10101,
    B10101,
    B01110,
    B00100,
    B00100,
    B00100,
    B00000
};
byte OMEGA[8] = {
    B01110,
    B10001,
    B10001,
    B10001,
    B01110,
    B00000,
    B11111,
    B00000
};
byte GAMMA[8] = {
    B11111,
    B10000,
    B10000,
    B10000,
    B10000,
    B10000,
    B10000,
    B00000
};
byte DELTA[8] = {
    B00100,
    B01010,
    B10001,
    B10001,
    B10001,
    B10001,
    B11111,
    B00000
};
byte LAMDA[8] = {
    B00100,
    B01010,
    B10001,
    B10001,
    B10001,
    B10001,
    B10001,
    B00000
};
byte KSI[8] = {
    B11111,
    B00000,
    B00000,
    B01110,
    B00000,
    B00000,
    B11111,
    B00000
};
byte PEE[8] = {
    B11111,
    B10001,
    B10001,
    B10001,
    B10001,
    B10001,
    B10001,
    B00000
};

Εδώ γίνεται ο σχεδιασμός των bitmaps των γραμμάτων του ελληνικού αλφαβήτου που λείπουν απο τη μνήμη.

Μέσα στη setup(), βάζεις αυτό:

  lcd.createChar(0, FI);
  lcd.createChar(1, PSI);
  lcd.createChar(2, OMEGA);
  lcd.createChar(3, GAMMA);
  lcd.createChar(4, DELTA);
  lcd.createChar(5, LAMDA);
  lcd.createChar(6, KSI);
  lcd.createChar(7, PEE);  

...για τις 8 θέσεις μνήμης.

Στη loop() θα καλείς τα γράμματα έτσι:

  lcd.setCursor(0,0);
  lcd.print("ΜΑΝ"); lcd.write(2); lcd.write(5); lcd.print("H"); lcd.write(246); 

 Στην οθόνη θα φαίνεται η λέξη MAΝΩΛΗΣ (το Σ έχει τη θέση 246 συνήθως στη CGROM του LCD).
```


O παρακάτω πίνακας θα σε βοηθήσει:

font_map.JPG Για να βρείς το δεκαδικό αριθμό θέσης του χαρακτήρα, διαβάζεις τη στήλη πρώτα και μετά τη σειρά. Για το Σ παράδειγμα, διαβάζεις: 1111 0110h που είναι ο 246d.

... όπως και τα άπειρα tutorials στο διαδίκτυο θα σου εξηγήσουν σχεδόν τα πάντα.
Για το πρώτο θέμα τώρα, δεν υπάρχει κάποιο λάθος στον κώδικα. Βάλε μόνο μια μικρή delay() μετά το analogRead().

----------


## her

Μάνο σε ευχαριστώ πολύ. Είσαι πολύ κατατοπιστικός.
Τελικά για να δουλέψει σωστά έπρεπε να βάλω την delay που είπες και να προσθέσω
 val = map(analogRead(potPin), 0, 1024, 1000, 3000);
Αν αντί 1000 βάλω, 0 που θέλω τότε δεν δουλεύει σωστά. Όταν είναι τέρμα γυρισμένο άλλες φορές είναι 10 άλλες 50 άλλες 160 κλπ. Δεν είναι σταθερό.

Μια ερώτηση ακόμα. Πως μπορώ να διαβάσω την μεγίστη τιμή που παίρνει το ποτενσιόμετρο; Δηλαδή αν το εύρος του ποτενσιομετρου είναι από 0 εως 1024 και αυξήσω την τιμή του και το κάνω π.χ 520 και το ξανά κατεβάσω στο 50 να αποθηκεύει κάπου την μέγιστη τιμή δηλαδή το 520

----------


## manolena

Υπάρχει η συνάρτηση min() και max() , μπορείς να δείς στο reference:

http://arduino.cc/en/Reference/min
http://arduino.cc/en/Reference/max

Μπορείς ωστόσο, να κάνεις ένα μικρό "κολπάκι" για να κρατάς τα minima ή τα maxima:

Δήλωσε στην αρχή:



```
int minAnalogRead=1023;
int maxAnalogRead=0;
```


...και μετά στη loop():



```
int val = 0;
int temp = 0;
...
val = analogRead(potPin);
temp = val/1024;
   if(maxAnalogRead< temp)
maxAnalogRead=temp;
   if(minAnalogRead> temp)
minAnalogRead=temp;
```


http://www.i-r-genius.com/arduino1.html

...και μετά εμφανίζεις τους maxAnalogRead και minAnalogRead που θα παίρνουν πάντα
τις μέγιστες και ελάχιστες τιμές αυτού που μετράς. Κάποια στιγμή μπορείς να τις καθαρίζεις βέβαια
γιατί όταν θα πιάσουν 0 και 1023 αντίστοιχα, δεν θα μπορούν να δείξουν κάτι άλλο.

----------


## her

Θέλω να γράψω π.χ




```
int k1=0;
int k2=0;
int k3=0;
.....
int k30=0;
```


Πως μπορώ να το γράψω αυτό ποιο εύκολα; Μάλλον με την χρήση for; εκτός από το κ1,κ2.. του παραδείγματος έχω και άλλα όπως π.χ  χ1,χ2 .. χ25
Έγραψα αυτό αλλά είναι λάθος φυσικά:




```
for (int i=1; i <=30; i++){
 int ki=0;}
```

----------


## SV1JRT

> Θέλω να γράψω π.χ
> 
> 
> 
> 
> ```
> int k1=0;
> int k2=0;
> int k3=0;
> ...




Γείτωνα, ΜΙΑ φορά θα μηδενίσεις τις μεταβλητές ? ή θα χρειάζετε να το κάνει αρκετές φορές ?
Σκέφτηκες την χρήση ενός πινακα 30 θέσεων ?? (π.χ κ[30]) και να τον διαχειρίζεσαι όπως σ' αρέσει ?

.

----------


## her

Μια φορά στην αρχή αρχή του προγράμματος κάτω από το #include
Και ίσως μια φορά κατά την διάρκεια του προγράμματος. Αλλά αυτό θα το κάνω εγώ ξεχωριστά
Δεν το γνωρίζω τον πίνακα που λες.

----------


## manolena

Άν οι μεταβλητές σου μηδενίζονται όλες στην αρχή μπορείς να γράψεις:




```
int k1, k2, k3...kn = 0;
```


Αλλιώς, αν παίρνουν τιμές κατά ομάδες:




```
int k1, k2 = 0;
int k3, k4 = 1;
...
int kn-1, kn = n;
```


Το σίγουρο είναι πως δεν γλιτώνεις το declaration, τη δήλωσή τους στην αρχή του κώδικα. Υπάρχει και το άλλο όμως. Αν κάποια
απο αυτές τις μεταβλητές τη χρησιμοποιείς τοπικά, δηλαδή μόνο σε μια ρουτίνα, τη δηλώνεις επι τόπου με το μέγεθός της και τη
χρησιμοποιείς μόνο εκεί:




```
void something(void)
{
   int k1 = 0;
   bla...bla...bla...
}
Αυτό γίνεται κυρίως π.χ. σε for loops για να μην καταναλώνεις πολλή απο τη μνήμη SRAM.
Προσοχή όμως! Αν πρέπει να μηδενιστεί μια φορά, θα πρέπει να τη βγάλεις έξω απο τις υπορουτίνες
που έχεις μέσα στη ρουτίνα που θα την χρησιμοποιήσεις.
```


Αυτό που λέει ο Σωτήρης γίνεται λίγο διαφορετικά αν κάνεις αρχικοποίηση των μεταβλητών που θες τις οποίες θα έχεις βάλει σε ένα union. Δηλαδή:




```
...Αρχή κώδικα...

...bla...bla...
#define variablesSize  n
typedef union ABC
{
   int k1;
   intk1;
   ...
   int kn;
};
ABC ABCValues;

byte byteArray[variablesSize];
...bla...bla...

void setup()
{
   ...bla...bla..
   for(int x = variablesSize;(το σύνολο των μεταβλητών που θες να μηδενίσεις) x>0; x--)
   {
      ABC.ABCValues[x] = byteArray[x];
   }
}
```


...ή κάπως έτσι, ίσως ένας συμφορουμίτης με καλύτερες γνώσεις το επιβεβαιώσει. Δεν νομίζω όμως με 
αυτόν τον τρόπο να συμφέρει να το κάνεις...

----------


## SV1JRT

> Μια φορά στην αρχή αρχή του προγράμματος κάτω από το #include
> Και ίσως μια φορά κατά την διάρκεια του προγράμματος. Αλλά αυτό θα το κάνω εγώ ξεχωριστά
> Δεν το γνωρίζω τον πίνακα που λες.



Ηρακλή, ο πίνακας είναι μια ομάδα απο ΙΔΙΟΥ τύπου μεταβλητές.
Τoν τύπο τον ορίζεις όπως και στις απλές μεταβλητές (π.χ. int K[30], ή char K[30], ή double K[30]) και το ΠΟΣΕΣ μεταβλητές θα βρίσκονται στην ομάδα αυτή το ορίζεις με το νουμερο μέσα στις αγγύλες. (στο παράδειγμα παραπάνω είναι το 30, που σημαίνει οτι θα έχεις 31 μεταβλητές στο ίδιο γκρούπ, γιατι η αρίθμηση των πινάκων αρχίζει απο το 0).
 Μετά, μέσα στο πρόγραμμα σου μπορείς να χρησημοποιήσεις την FOR για να μηδενίσεις ολες τις μεταβλητές.

παράδειγμα:

int k[30];
int i=0;

for (int i=1; i <=30; i++){
 k[i]=0;}

Δές και την σύνταξη των πινάκων στο tutorial για τον Arduino.
http://arduino.cc/en/Reference/array

.

----------

her (01-10-14)

----------


## alefgr

> Ηρακλή, ο πίνακας είναι μια ομάδα απο ΙΔΙΟΥ τύπου μεταβλητές.
> Τoν τύπο τον ορίζεις όπως και στις απλές μεταβλητές (π.χ. int K[30], ή char K[30], ή double K[30]) και το ΠΟΣΕΣ μεταβλητές θα βρίσκονται στην ομάδα αυτή το ορίζεις με το νουμερο μέσα στις αγγύλες. (στο παράδειγμα παραπάνω είναι το 30, *που σημαίνει οτι θα έχεις 31 μεταβλητές στο ίδιο γκρούπ, γιατι η αρίθμηση των πινάκων αρχίζει απο το 0*).
>  Μετά, μέσα στο πρόγραμμα σου μπορείς να χρησημοποιήσεις την FOR για να μηδενίσεις ολες τις μεταβλητές.
> 
> παράδειγμα:
> 
> int k[30];
> int i=0;
> 
> ...



Προσοχή! Ένα μικρό λάθος αλλά πολύ σημαντικό! Όντως η αρίθμηση του πίνακα αρχίζει από το 0 αλλά στην συγκεκριμένη περίπτωση σταματάει στο 29! Το 30 είναι εκτός πίνακα!

----------


## her

Πως μπορώ να διαβάσω από το arduino  την ώρα και την  ημερομηνία που έχει ο υπολογιστής; Εννοείτε ότι υπάρχει σύνδεση με καλώδιο usb

----------


## her

Υπάρχει κάποιο board σε στυλ arduino που να εχει περισσότερες αναλογικές εισόδους από τις 16 που έχει το 2560;
Έχω χρησιμοποιήσει και τις 16 αναλογικές εισόδους και τώρα θέλω να προσθέσω ένα ποτενσιόμετρο. Πως μπορώ να το κάνω;

----------


## SV1JRT

> Υπάρχει κάποιο board σε στυλ arduino που να εχει περισσότερες αναλογικές εισόδους από τις 16 που έχει το 2560;
> Έχω χρησιμοποιήσει και τις 16 αναλογικές εισόδους και τώρα θέλω να προσθέσω ένα ποτενσιόμετρο. Πως μπορώ να το κάνω;



Μπορείς να βάλεις ένα ολοκληρομένο A/D με 16 analog input και έξοδο σε I2C bus.
Δεν ξέρω αν υπάρχει έτοιμη λύση για το arduino.
.
Αλλη μια ιδέα είναι να πάρεις ένα ΔΕΥΤΕΡΟ Arduino Mega και να μοιράσεις τιε εργασίες στα δύο Board με εποικινωνία μεταξύ των δύο Mega μέσω I2C bus οπότε θα έχεις 16 + 16 αναλογικές πόρτες !!

.

----------


## her

Θέλω να εμφανίζω στην σειριακή οθόνη συνέχεια έναν αριθμό που μεταβάλετε η τιμή του. Πως μπορώ να διαγράψω - καθαρίσω τον παλαιό αριθμό που έχει κρατήσει η σειριακή οθόνη; σαν το lcd.clear () αλλά στην σειριακή οθόνη.

----------


## katmadas

Αποσο ξερω δεν καθαριζει το η οθονη αυτη.
Μπορεις να μεγαλωσεις το παραθυρο τοσο οσο να εμφανιζεται μια σειρα.

----------


## her

Υπάρχει τρόπος να μπορώ να διαβάσω από το arduino την ώρα και την ημερομηνία που έχει ο υπολογιστής; Yπάρχει σύνδεση με καλώδιο usb.

----------


## Fire Doger

Εαν μεταφέρεις τις πληροφορίες μέσω ένως απλού προγραμματος c#.
Επίσης υπαρχουν ηλεκτρονικα modules με μπαταρία τα οποία κρατάνε χρόνο, ίσως είναι ποιο εύχρηστα http://www.makeuseof.com/tag/how-and...ck-to-arduino/

----------


## her

Γεια σας.
Πως θα μπορούσα να κάνω στρογγυλοποίηση ενός αριθμού; Π.χ ο αριθμός 1562 να στρογγυλοποιηθεί σε 1560.
Ευχαριστώ

----------


## nestoras

> Γεια σας.
> Πως θα μπορούσα να κάνω στρογγυλοποίηση ενός αριθμού; Π.χ ο αριθμός 1562 να στρογγυλοποιηθεί σε 1560.
> Ευχαριστώ



Αν δε σε απασχολούν πολύ οι κύκλοι του επεξεργαστή, κάνεις μια διαίρεση με το δέκα και ξαναπολλαπλασιάζεις...

----------


## her

Παναγιώτη σε ευχαριστώ. αυτό που λες είναι σωστό αλλά δεν είναι ακριβώς στρογγυλοποίηση. Ο αριθμός π.χ 188 αν το κάνω όπως μου το λες θα γίνει 180.
Ίσως να είναι η εντολή round () αλλά δεν κατάλαβα πως δουλεύει. Έχω σκεφτεί ένα τρόπο να σπάσω έναν αριθμό σε μονούς αριθμούς και μετά τον τελευταίο να τον στρογγυλοποιώ με if. Δηλαδή το 188 να γίνει α= 1 β=8 c=8. Αν το c είναι μεγαλύτερο του 6 τότε c=0 και β= b+1.Αλλά πιάνει χώρο και το πρόγραμμα είναι μεγάλο και θα το χρησιμοποιήσω σε διαφορά σημεία του κώδικα

----------


## nestoras

> Παναγιώτη σε ευχαριστώ. αυτό που λες είναι σωστό αλλά δεν είναι ακριβώς στρογγυλοποίηση. Ο αριθμός π.χ 188 αν το κάνω όπως μου το λες θα γίνει 180.
> Ίσως να είναι η εντολή round () αλλά δεν κατάλαβα πως δουλεύει. Έχω σκεφτεί ένα τρόπο να σπάσω έναν αριθμό σε μονούς αριθμούς και μετά τον τελευταίο να τον στρογγυλοποιώ με if. Δηλαδή το 188 να γίνει α= 1 β=8 c=8. Αν το c είναι μεγαλύτερο του 6 τότε c=0 και β= b+1.Αλλά πιάνει χώρο και το πρόγραμμα είναι μεγάλο και θα το χρησιμοποιήσω σε διαφορά σημεία του κώδικα



Μην ανυσηχείς, θα πάρεις σύντομα την απάντηση που χρειάζεσαι με αποδοτικό κώδικα κιόλας!  :Smile:

----------

