Arduino Σεμινάριο στο 1ο ΕΠΑΛ Περάματος
Το υλικό του σεμιναρίου για τον Arduino από την κατεύθυνση Ηλεκτρονικών του 1ου ΕΠΑΛ Περάματος
ΕΦΑΡΜΟΓΕΣ ARDUINO
- ΠΡΑΚΤΙΚΟ ΜΕΡΟΣ
- Επίσκεψη και περιήγηση στην Ιστοσελίδα www.arduino.cc
- Κατέβασμα και εγκατάσταση εφαρμογής ARDUINO IDE
- Επικοινωνία εφαρμογής ARDUINO IDE και της πλακέτας ARDUINO UNO
- Κατέβασμα και εγκατάσταση του εξομοιωτή
Simulator for Arduino v0.99Simulator for Arduino v0.99Simulator for Arduino v0.99Simulator for Arduino - Virtronics
Εφαρμογή 1η
Συνεχές αναβόσβημα ενός Led με περίοδο 1sec, με αλλαγή της στάθμης στην ψηφιακή θύρα Ι/Ο του μικροελεγκτή. (Οι γραμμές με πορτοκαλί είναι κώδικας-εντολές όλα τα άλλα είναι σχόλια)
Το Arduino αποτελείται από δεκατρία ψηφιακά pin, τα οποία μπορούμε να τα χρησιμοποιήσουμε το κάθε ένα ξεχωριστά, είτε για είσοδο είτε για έξοδο. Μπορούμε να τα προγραμματίσουμε να συμπεριφέρονται όπως εμείς θέλουμε, αρκεί να κάνουμε τις σωστές δηλώσεις στο κώδικα που θα φορτώσουμε στη πλακέτα.
Η έξοδος του κάθε pin μπορεί να προγραμματιστεί να δίνει τιμές HIGH ή LOW. Λέγοντας HIGH ενώνουμε το δυαδικό '1' και έχουμε τάση εξόδου 5V DC, ενώ το LOW είναι το δυαδικό '0' και έχει τάση εξόδου 0V DC (ground).
Παρακάτω θα δούμε ένα παράδειγμα για να μπορέσουμε να κατανοήσουμε τον προγραμματισμό των ψηφιακών pin του Arduino. Θα ενώσουμε ένα led στη board και θα το προγραμματίσουμε να ανάβει και να σβήνει σε χρονικά διαστήματα ενός δευτερολέπτου
Blink
Αυτό το παράδειγμα παρουσιάζει το απλούστερο πράγμα που μπορείτε να κάνετε με ένα Arduino για να δείτε τη φυσική έξοδο: αναβοσβήνει ένα LED.
Απαραίτητα Υλικά
- Arduino Board
- breadboard
- LED, αντίσταση 220Ω,
Κύκλωμα Για να υλοποιήσετε το κύκλωμα, συνδέστε μια αντίσταση 220Ω με το pin 13. Κατόπιν συνδέστε τον μακρύτερο ακροδέκτη (άνοδο) με την αντίσταση. Συνδέστε το κοντό ακροδέκτη (κάθοδο) με τη γείωση. Κατόπιν συνδέστε το Arduino με τον υπολογιστή σας, ξεκινήστε το πρόγραμμα Arduino, και πληκτρολογείστε τον παρακάτω κώδικα. Τα περισσότερα Arduino ήδη έχουν ένα LED στο pin 13. Εάν τρέχετε αυτό το παράδειγμα χωρίς εξωτερικό LED και αντισταση, πρέπει να δείτε το ενσωματωμένο LED να αναβοσβήνει.
|
Εφαρμογή 2η
Άναμμα και σβήσιμο Led ελεγχόμενο από εξωτερικό button με την διαδικασία polling.
|
Εφαρμογή 3η
Άναμμα και σβήσιμο Led ελεγχόμενο από εξωτερικό button με την διαδικασία Interrupt
(Η διαφορά με την προηγούμενη περίπτωση είναι ότι πρίν η ενεργοποίηση γίνεται μετά το loop ενώ τώρα άμεσα
με την ενεργοποίηση της διακοπής)
|
Below is a list of interrupts, in priority order, for the Atmega328:
1 Reset
2 External Interrupt Request 0 (pin D2) (INT0_vect)
3 External Interrupt Request 1 (pin D3) (INT1_vect)
4 Pin Change Interrupt Request 0 (pins D8 to D13) (PCINT0_vect)
5 Pin Change Interrupt Request 1 (pins A0 to A5) (PCINT1_vect)
6 Pin Change Interrupt Request 2 (pins D0 to D7) (PCINT2_vect)
7 Watchdog Time-out Interrupt (WDT_vect)
8 Timer/Counter2 Compare Match A (TIMER2_COMPA_vect)
9 Timer/Counter2 Compare Match B (TIMER2_COMPB_vect)
10 Timer/Counter2 Overflow (TIMER2_OVF_vect)
11 Timer/Counter1 Capture Event (TIMER1_CAPT_vect)
12 Timer/Counter1 Compare Match A (TIMER1_COMPA_vect)
13 Timer/Counter1 Compare Match B (TIMER1_COMPB_vect)
14 Timer/Counter1 Overflow (TIMER1_OVF_vect)
15 Timer/Counter0 Compare Match A (TIMER0_COMPA_vect)
16 Timer/Counter0 Compare Match B (TIMER0_COMPB_vect)
17 Timer/Counter0 Overflow (TIMER0_OVF_vect)
18 SPI Serial Transfer Complete (SPI_STC_vect)
19 USART Rx Complete (USART_RX_vect)
20 USART, Data Register Empty (USART_UDRE_vect)
21 USART, Tx Complete (USART_TX_vect)
22 ADC Conversion Complete (ADC_vect)
23 EEPROM Ready (EE_READY_vect)
24 Analog Comparator (ANALOG_COMP_vect)
25 2-wire Serial Interface (I2C) (TWI_vect)
26 Store Program Memory Ready (SPM_READY_vect)
Εφαρμογή 4η
Διάβασμα αναλογικής τάσης, αναβόσβημα Led1 ανάλογα με την στάθμη της τάσης και έλεγχος φωτεινότητας Led2 μέσω PWM ανάλογα με την στάθμη της τάσης.
int sensorPin = A3; // select the input pin for the potentiometer
// Ορίζουμε μία μεταβλητή τύπου Integer (Ακεραίου) με όνομα sensorPin και της δίνουμε την τιμή Α3 (το Α0 είναι μία ακέραια σταθερά και αντιστοιχεί σε έναν ακέραιο αριθμό που μας δείχνει το pin, του καναλιού 1 του ADC) με σκοπό να την χρησιμοποιήσουμε παρακάτω στον κώδικα και να δηλώσουμε που θα συνδέσουμε το ποτενσιόμετρο ? αναλογική είσοδος.
int ledPin1 = 13; // select the pin for the LED1
// Ορίζουμε μία μεταβλητή τύπου Integer (Ακεραίου) με όνομα ledPin1 και της δίνουμε την τιμή 13 με σκοπό να την χρησιμοποιήσουμε παρακάτω στον κώδικα και να δηλώσουμε που θα συνδέσουμε το led1.
int sensorValue = 0; // variable to store the value coming from the sensor
// Ορίζουμε μία μεταβλητή τύπου Integer (Ακεραίου) με όνομα sensorValue και της δίνουμε αρχικά την τιμή 0 με σκοπό να την χρησιμοποιήσουμε παρακάτω στον κώδικα για να αποθηκεύουμε τις τιμές που διαβάζει ο ADC
int ledPin2 = 9; // LED2 connected to digital pin 9
// Ορίζουμε μία μεταβλητή τύπου Integer (Ακεραίου) με όνομα ledPin2 και της δίνουμε την τιμή 9 με σκοπό να την χρησιμοποιήσουμε παρακάτω στον κώδικα και να δηλώσουμε που θα συνδέσουμε το led2. ? PWM Output
int outputValue = 0; // value output to the PWM (analog out)
// Ορίζουμε μία μεταβλητή τύπου Integer (Ακεραίου) με όνομα outputValue και της δίνουμε αρχικά την τιμή 0 με σκοπό να την χρησιμοποιήσουμε παρακάτω στον κώδικα για να δίνουμε τις αναλογικές τιμές φωτεινότητας για το led2
void setup() { // Η συνάρτηση αρχικών ρυθμίσεων του μικροελεγκτή
// declare the ledPin1 as an OUTPUT:
pinMode(ledPin1, OUTPUT); // Ορίζουμε χρησιμοποιώντας την μεταβλητή ledPin1, ότι το pin 13 θα λειτουργεί σαν ψηφιακή έξοδος 0-5V
pinMode(ledPin2, OUTPUT); // Ορίζουμε χρησιμοποιώντας την μεταβλητή ledPin2, ότι το pin 9 θα λειτουργεί σαν ψηφιακή έξοδος 0-5V
}
void loop() { // Η κύρια ρουτίνα του προγράμματος που εκτελείτε συνεχώς
// read the value from the sensor:
sensorValue = analogRead(sensorPin); // Διάβασμα της αναλογικής τιμής της τάσης στο pin Α0 του ADC και απόδοση της τιμής στην μεταβλητή sensorValue
// turn the ledPin on
digitalWrite(ledPin1, HIGH); // Βγάλε λογικό 1 (5V) στο pin 13, δηλαδή άναψε το led1
// stop the program for <sensorValue> milliseconds:
delay(sensorValue); // Συνάρτηση καθυστέρησης χρόνου σε ms ανάλογου με την τιμή της αναλογικής τάσης από 0 έως 1023 ms
// turn the ledPin off:
digitalWrite(ledPin1, LOW); // Βγάλε λογικό 0 (0V) στο pin 13, δηλαδή σβείσε το led1
// stop the program for for <sensorValue> milliseconds:
delay(sensorValue); // Συνάρτηση καθυστέρησης χρόνου σε ms ανάλογου με την τιμή της αναλογικής τάσης από 0 έως 1023 ms
//fade section
// map it to the range of the analog out:
outputValue = map(sensorValue, 0, 1023, 0, 255); // Συνάρτηση αντιστοίχησης ? μετατροπής των τιμών της αναλογικής τάσης από 0 ? 1023 σε εύρος τιμών από 0-255 και απόδοση των νέων τιμών στην μεταβλητή outputValue
// change the analog out value:
analogWrite(ledPin2, outputValue); // Δημιουργία παλμών PWM στο pin 9 (led2) ανάλογους με την τιμή του ADC με εύρος από 0 έως 255
// wait 2 milliseconds before the next loop
// for the analog-to-digital converter to settle
// after the last reading:
delay(2); // // Συνάρτηση καθυστέρησης χρόνου 2ms με σκοπό την επανεκκίνηση του ADC
}
Διαμόρφωση πλάτος παλμού
Στο παρακάτω γράφημα, οι πράσινες γραμμές αντιπροσωπεύουν μια κανονική χρονική περίοδο. Μια κλήση της analogWrite() είναι σε μια κλίμακα από 0 έως 255, έτσι ώστε για παράδειγμα, η κλήση analogWrite(255) ζητά το 100% του κύκλου λειτουργίας,
και η analogWrite(127) το 50% του κύκλου λειτουργίας (στο μισό χρόνο).
Εφαρμογή 5η
Διάβασμα αναλογικής τάσης, άναμμα Led1 ή Led2 ανάλογα με την στάθμη της τάσης, και αποστολή δεδομένων σειριακά στον Η/Υ
int sensorPin = A0; // select the input pin for the potentiometer
// Ορίζουμε μία μεταβλητή τύπου Integer (Ακεραίου) με όνομα sensorPin και της δίνουμε την τιμή Α0 (το Α0 είναι μία ακέραια σταθερά και αντιστοιχεί σε έναν ακέραιο αριθμό που μας δείχνει το pin, του καναλιού 1 του ADC) με σκοπό να την χρησιμοποιήσουμε παρακάτω στον κώδικα και να δηλώσουμε που θα συνδέσουμε το ποτενσιόμετρο ? αναλογική είσοδος.
int ledPin1 = 13; // select the pin for the LED1
// Ορίζουμε μία μεταβλητή τύπου Integer (Ακεραίου) με όνομα ledPin1 και της δίνουμε την τιμή 13 με σκοπό να την χρησιμοποιήσουμε παρακάτω στον κώδικα και να δηλώσουμε που θα συνδέσουμε το led1.
int sensorValue = 0; // variable to store the value coming from the sensor
// Ορίζουμε μία μεταβλητή τύπου Integer (Ακεραίου) με όνομα sensorValue και της δίνουμε αρχικά την τιμή 0 με σκοπό να την χρησιμοποιήσουμε παρακάτω στον κώδικα για να αποθηκεύουμε τις τιμές που διαβάζει ο ADC
int ledPin2 = 9; // LED2 connected to digital pin 9
// Ορίζουμε μία μεταβλητή τύπου Integer (Ακεραίου) με όνομα ledPin2και της δίνουμε την τιμή 9 με σκοπό να την χρησιμοποιήσουμε παρακάτω στον κώδικα και να δηλώσουμε που θα συνδέσουμε το led2.
int outputValue = 0; // value output
// Ορίζουμε μία μεταβλητή τύπου Integer (Ακεραίου) με όνομα outputValue και της δίνουμε αρχικά την τιμή 0 με σκοπό να την χρησιμοποιήσουμε παρακάτω στον κώδικα
void setup() { // Η συνάρτηση αρχικών ρυθμίσεων του μικροελεγκτή
// declare the ledPin1 as an OUTPUT:
pinMode(ledPin1, OUTPUT); // Ορίζουμε χρησιμοποιώντας την μεταβλητή ledPin1, ότι το pin 13 θα λειτουργεί σαν ψηφιακή έξοδος 0-5V
pinMode(ledPin2, OUTPUT); // Ορίζουμε χρησιμοποιώντας την μεταβλητή ledPin1, ότι το pin 9 θα λειτουργεί σαν ψηφιακή έξοδος 0-5V
// initialize serial communications at 9600 bps:
Serial.begin(9600); // Αρχικοποίηση της σειριακής επικοινωνίας με ρυθμό 9600
}
void loop() { // Η κύρια ρουτίνα του προγράμματος που εκτελείτε συνεχώς
// read the value from the sensor:
sensorValue = analogRead(sensorPin); // Διάβασμα της αναλογικής τιμής της τάσης στο pin Α0 του ADC και απόδοση της τιμής στην μεταβλητή sensorValue
// turn the ledPin on
if (sensorValue < 511 ) { // Εάν η τιμή του ADC είναι μικρότερη από 511 δηλαδή 2,5 volt τότε:
digitalWrite (ledPin1, HIGH); // Βγάλε λογικό 1 (5V) στο pin 13, δηλαδή άναψε το led1
digitalWrite (ledPin2, LOW); // Βγάλε λογικό 0 (0V) στο pin 9, δηλαδή σβήσε το led2
}
else //αλλιώς:
{
digitalWrite (ledPin1, LOW); // Βγάλε λογικό 0 (0V) στο pin 13, δηλαδή σβήσε το led1
digitalWrite(ledPin2, HIGH); // Βγάλε λογικό 1 (5V) στο pin 9, δηλαδή άναψε το led2
}
//serial section
// print the results to the serial monitor:
// Τμήμα σειριακής επικοινωνίας
Serial.print("\t sensor = " );
Serial.println(sensorValue);
// wait 2 milliseconds before the next loop
// for the analog-to-digital converter to settle
// after the last reading:
delay(2);
}
Εφαρμογή 6η
Διάβασμα αναλογικής τάσης, μόνιμη αποθήκευση τιμών στην EEPROM, και αποστολή δεδομένων σειριακά στον Η/Υ διαβάζοντας την EEPROM
#include <EEPROM.h> //Φόρτωση της βιβλιοθήκης με τις σχετικές συναρτήσεις για επικοινωνία με την EEPROM
// the current address in the EEPROM (i.e. which byte
// we're going to write to next)
int addr = 0; // Ορίζουμε μία μεταβλητή τύπου ακεραίου με όνομα addr και αρχική τιμή 0 με σκοπό να την χρησιμοποιήσουμε για να καθορίζουμε την διεύθυνση εγγραφής στην μνήμη
// start reading from the first byte (address 0) of the EEPROM
int address = 0; // Ορίζουμε μία μεταβλητή τύπου ακεραίου με όνομα address και αρχική τιμή 0 με σκοπό να την χρησιμοποιήσουμε για να καθορίζουμε την διεύθυνση ανάγνωσης από την μνήμη
byte value; // Ορίζουμε μία μεταβλητή τύπου byte με όνομα value για να αποθηκεύουμε τα δεδομένα της μνήμης
int sensorPin = A0; // select the input pin for the potentiometer
// Ορίζουμε μία μεταβλητή τύπου Integer (Ακεραίου) με όνομα sensorPin και της δίνουμε την τιμή Α0 (το Α0 είναι μία ακέραια σταθερά και αντιστοιχεί σε έναν ακέραιο αριθμό που μας δείχνει το pin, του καναλιού 1 του ADC) με σκοπό να την χρησιμοποιήσουμε παρακάτω στον κώδικα και να δηλώσουμε που θα συνδέσουμε το ποτενσιόμετρο ? αναλογική είσοδος.
int sensorValue = 0; // variable to store the value coming from the sensor
// Ορίζουμε μία μεταβλητή τύπου Integer (Ακεραίου) με όνομα sensorValue και της δίνουμε αρχικά την τιμή 0 με σκοπό να την χρησιμοποιήσουμε παρακάτω στον κώδικα για να αποθηκεύουμε τις τιμές που διαβάζει ο ADC
void setup() { // Η συνάρτηση αρχικών ρυθμίσεων του μικροελεγκτή
// declare the ledPin as an OUTPUT:
Serial.begin(9600); // Αρχικοποίηση της σειριακής επικοινωνίας με ρυθμό 9600
}
void loop() { // Η κύρια ρουτίνα του προγράμματος που εκτελείτε συνεχώς
// read the value from the sensor:
sensorValue = analogRead(sensorPin);
); // Διάβασμα της αναλογικής τιμής της τάσης στο pin Α0 του ADC και απόδοση της τιμής στην μεταβλητή sensorValue
// need to divide by 4 because analog inputs range from
// 0 to 1023 and each byte of the EEPROM can only hold a
// value from 0 to 255.
int val = analogRead(sensorPin) / 4; //Ορισμός μίας τοπικής μεταβλητής τύπου ακέραιου με όνομα val και απόδοση της αναλογικής τιμής της τάσης από το pin Α0 του ADC αφού διαιρεθεί με 4 για να αποθηκεύσουμε 8 bit σε κάθε θέση της μνήμης
// write the value to the appropriate byte of the EEPROM.
// these values will remain there when the board is
// turned off.
EEPROM.write(addr, val); // Εγγραφή της μνήμης στην διεύθυνση που μας δείχνει η τιμή της μεταβλητής addr, την τιμή της μεταβλητής val
// advance to the next address. there are 512 bytes in
// the EEPROM, so go back to 0 when we hit 512.
addr = addr + 1; // Αύξηση της διεύθυνσης κατά ένα (επόμενη διεύθυνση)
if (addr == 512) // Εάν η διεύθυνση είναι η τελευταία αφού η EEPROM έχει χωρητικότητα 512 byte, τότε:
addr = 0; // Πήγαινε στην αρχική διεύθυνση
delay(100); // Καθυστέρηση 100ms
value = EEPROM.read(address); // Ανάγνωση της μνήμης στην διεύθυνση που μας δείχνει η τιμή της μεταβλητής address, και απόδοση της τιμής στην μεταβλητή value
Serial.print(address); // Αποστολή σειριακά της τιμής της διεύθυνσης της μνήμης
Serial.print("\t");
Serial.print(value, DEC); // Αποστολή σειριακά της τιμής του περιέχομένου της διεύθυνσης της μνήμης
Serial.println();
// advance to the next address of the EEPROM
address = address + 1; // Αύξηση της διεύθυνσης κατά ένα (επόμενη διεύθυνση)
// there are only 512 bytes of EEPROM, from 0 to 511, so if we're
// on address 512, wrap around to address 0
if (address == 512) // Εάν η διεύθυνση είναι η τελευταία αφού η EEPROM έχει χωρητικότητα 512 byte, τότε:
address = 0; // Πήγαινε στην αρχική διεύθυνση
delay(500); // Καθυστέρηση 100ms
}
Εφαρμογή 7η
Δημιουργία μουσικών τόνων «Twinkle Twinkle Little Star»
int speakerPin = 9; // Ορισμός μεταβλητής τύπου ακεραίου με όνομα speakerPin και απόδοση τιμής 9 με σκοπό να την χρησιμοποιήσουμε παρακάτω στον κώδικα και να δηλώσουμε που θα συνδέσουμε το buzzer
int length = 15; // the number of notes
// Ορισμός μεταβλητής τύπου ακεραίου με όνομα length και απόδοση τιμής 15 με σκοπό να την χρησιμοποιήσουμε παρακάτω στον κώδικα και να δηλώσουμε τον αριθμό από νότες που θα έχει το μουσικό κομμάτι
char notes[] = "ccggaagffeeddc "; // a space represents a rest
// Ορισμός πίνακα με τιμές τύπου χαρακτήρα (char) και απόδοση τιμών ccggaagffeeddc τις νότες που θα έχει το μουσικό κομμάτι
int beats[] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 }; // Ορισμός πίνακα με τιμές τύπου ακεραίου και απόδοση τιμών 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 για τις φορές που παίζετε η κάθε νότα που θα έχει το μουσικό κομμάτι
int tempo = 300; // Ορισμός μεταβλητής τύπου ακεραίου με όνομα tempo και απόδοση τιμής 300 με σκοπό να την χρησιμοποιήσουμε παρακάτω στον κώδικα και να δηλώσουμε τον ρυθμό (ταχύτητα) παιξίματος που θα έχει το μουσικό κομμάτι
void playTone(int tone, int duration) { // Ορισμός συνάρτησης με όνομα playTone και ακέραιες παραμέτρους tone (khz) και duration με λειτουργία την δημιουργία του τόνου μιας νότας
for (long i = 0; i < duration * 1000L; i += tone * 2) {
digitalWrite(speakerPin, HIGH);
delayMicroseconds(tone);
digitalWrite(speakerPin, LOW);
delayMicroseconds(tone);
}
}
void playNote(char note, int duration) {// Ορισμός συνάρτησης με όνομα playNote και παραμέτρους note και duration με λειτουργία τo παίξιμο του τόνου μιας νότας
char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' }; // Οι νότες
int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };
// play the tone corresponding to the note name
for (int i = 0; i < 8; i++) {
if (names[i] == note) {
playTone(tones[i], duration); // Χρησιμοποιεί την προηγούμενη συνάρτηση playTone
}
}
}
void setup() {
pinMode(speakerPin, OUTPUT);
}
void loop() {
for (int i = 0; i < length; i++) {
if (notes[i] == ' ') {
delay(beats[i] * tempo); // rest
} else {
playNote(notes[i], beats[i] * tempo);
}
// pause between notes
delay(tempo / 2);
}
}
Εφαρμογή 8η
Απεικόνιση χαρακτήρων σε Display LCD
/*
LiquidCrystal Library - Hello World
Demonstrates the use a 16x2 LCD display. The LiquidCrystal
library works with all LCD displays that are compatible with the
Hitachi HD44780 driver. There are many of them out there, and you
can usually tell them by the 16-pin interface.
This sketch prints "Hello World!" to the LCD
and shows the time.
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
* LCD R/W pin to ground
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
Library originally added 18 Apr 2008
by David A. Mellis
library modified 5 Jul 2009
by Limor Fried (http://www.ladyada.net)
example added 9 Jul 2009
by Tom Igoe
modified 22 Nov 2010
by Tom Igoe
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/LiquidCrystal
*/
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // Για το LCD Shield
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("hello, world!");
}
void loop() {
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);
// print the number of seconds since reset:
lcd.print(millis() / 1000); // Εμφάνισε τα δευτερόλεπτα από την εκκίνηση του προγράμματος
}
-----------------------------------------------------------------------------------------
- Ελεύθερη δημιουργία εφαρμογής από τους εκπαιδευόμενους.
- Επίδειξη σύνθετων εφαρμογών