Programmazione

Il Computer (e tutti i suoi derivati come le schede elettroniche) è un oggetto molto stupido.
E’ un automa, un lavoratore preciso, veloce ed instancabile ma straordinariamente ottuso.
Si limita ad eseguire esattamente ciò che gli ordiniamo, nulla di più e nulla di meno.
Un programma è un elenco di passi da eseguire in sequenza, in modo ripetitivo o sulla base di semplici valutazioni (uguale, diverso, maggiore o minore).
E’ qualcosa di molto simile ad una ricetta di cucina.

I programmi sono definiti attraverso un linguaggio di programmazione.
Esistono centinaia di linguaggi differenti, a dispetto della loro apparente diversità e complessità si basano tutti unicamente su tre costrutti principali sufficienti a definire programmi per qualsiasi problema: sequenza, iterazione e condizione.

Come detto in precedenza un programma (o meglio la sua logica) ha bisogno di ricevere input (tipicamente dai sensori) e di fornire output (tipicamente attraverso gli attuatori); a questo scopo esistono apposite funzioni contenute in  librerie.

Un programma, oltre alla descrizione dei passi da eseguire, ha la necessità di memorizzare nel tempo valori che rappresentano stati e conteggi (esattamente come farebbe ognuno di noi con un foglio di carta e una penna) a tale scopo esistono le variabili.
Le variabili sono aree di memoria, battezzate con un nome univoco, nel quale memorizzare informazioni che occorrono al programma nel corso del tempo.

Per indicazioni dettagliate sul linguaggio di programmazione di Arduino consultare la relativa guida (REFERENCE)
https://www.arduino.cc/reference/it/

I programmi di Arduino sono chiamati Sketch e hanno tutti la medesima struttura.

/*
Questo è' lo scheletro di ogni sketch  
*/

// the setup function runs once when you press reset or power the board
void setup() {
 
}

// the loop function runs over and over again forever
void loop() {
  
}

Le annotazioni scritte tra /* e */ o precedute da // sono commenti che Arduino NON considera; servono solo a chi scrive il programma e a chi lo leggerà per avere indicazioni e spiegazioni.

Ogni programma e composto SEMPRE da due blocchi:

  • void setup() { … }
  • void loop() { … }

Le istruzioni contenute tra le parentesi graffe del blocco setup vengono eseguite una sola volta all’accensione o dopo un Reset.
Le istruzioni contenute tra le parentesi graffe del blocco loop vengono eseguite, dopo il setup, ciclicamente e senza termine.

 

 

Esempio 1

  • Definizione della funzione (input o output) dei pin (nel setup)
  • Sequenza di istruzione (nel loop)

https://www.arduino.cc/en/Tutorial/Blink

/*
  Blink

  Turns an LED on for one second, then off for one second, repeatedly.

  Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO
  it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to
  the correct LED pin independent of which board is used.
  If you want to know what pin the on-board LED is connected to on your Arduino
  model, check the Technical Specs of your board at:
  https://www.arduino.cc/en/Main/Products

  modified 8 May 2014
  by Scott Fitzgerald
  modified 2 Sep 2016
  by Arturo Guadalupi
  modified 8 Sep 2016
  by Colby Newman

  This example code is in the public domain.

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

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}

 

Esempio 2

https://www.arduino.cc/en/Tutorial/Button

/*
  Button

  Turns on and off a light emitting diode(LED) connected to digital pin 13,
  when pressing a pushbutton attached to pin 2.

  The circuit:
  - LED attached from pin 13 to ground
  - pushbutton attached to pin 2 from +5V
  - 10K resistor attached to pin 2 from ground

  - Note: on most Arduinos there is already an LED on the board
    attached to pin 13.

  created 2005
  by DojoDave <http://www.0j0.org>
  modified 30 Aug 2011
  by Tom Igoe

  This example code is in the public domain.

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

// constants won't change. They're used here to set pin numbers:
const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
}

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    // turn LED on:
    digitalWrite(ledPin, HIGH);
  } else {
    // turn LED off:
    digitalWrite(ledPin, LOW);
  }
}

Le costanti servono a rendere più leggibile il programma e a semplificarne la modifica e l’aggiornamento.

Le variabili sono la memoria del programma; bisogna indicarne il tipo unicamente per minimizzare lo spazio occupato e massimizzare la velocità.

La condizione (costrutto if … else … ) è il pilastro di tutta la programmazione.
E’ il modo con cui facciamo prendere ogni decisioni al programma.
La logica di un programma è costituita essenzialmente dall’insieme di tutte le condizioni.

 

Esempio 3

Funzioni definite dall’utente

 

/*

Carillon

*/

// pin al quale e collegato il buzzer
const int pin_buzzer = 8;

// frequenze delle note (notazione inglese c=do d=re e=mi f=fa g=sol a=la b=si)
const int c = 261;
const int d = 294;
const int e = 329;
const int f = 349;
const int g = 391;
const int gS = 415;
const int a = 440;
const int aS = 455;
const int b = 466;
const int cH = 523;
const int cSH = 554;
const int dH = 587;
const int dSH = 622;
const int eH = 659;
const int fH = 698;
const int fSH = 740;
const int gH = 784;
const int gSH = 830;
const int aH = 880; 

// tempo base
const int tempo = 300;

// the setup function runs once when you press reset or power the board 
void setup() { 
 pinMode(pin_buzzer, OUTPUT);
} 

// the loop function runs over and over again forever 
void loop() {   
 
 tone(pin_buzzer, c, 1*tempo);      // 
 delay(tempo / 2);
 tone(pin_buzzer, c, 1*tempo);
 delay(tempo / 2);
 tone(pin_buzzer, g, 1*tempo);
 delay(tempo / 2);
 tone(pin_buzzer, g, 1*tempo);
 delay(tempo / 2);
 tone(pin_buzzer, a, 1*tempo);
 delay(tempo / 2);
 tone(pin_buzzer, a, 1*tempo);
 delay(tempo / 2);
 tone(pin_buzzer, g, 2*tempo);
 delay(tempo / 2);
 tone(pin_buzzer, f, 1*tempo);
 delay(tempo / 2);
 tone(pin_buzzer, f, 1*tempo);
 delay(tempo / 2);
 tone(pin_buzzer, e, 1*tempo);
 delay(tempo / 2);
 tone(pin_buzzer, e, 1*tempo);
 delay(tempo / 2);
 tone(pin_buzzer, d, 1*tempo);
 delay(tempo / 2);
 tone(pin_buzzer, d, 1*tempo);
 delay(tempo / 2);
 tone(pin_buzzer, c, 2*tempo);
 delay(tempo / 2);

 // intervallo tra le ripetizioni della sequenza
 delay(tempo * 2);

} 

 

/*

Carillon 2

*/

// pin al quale e collegato il buzzer
const int pin_buzzer = 8;

const int do = 261;
const int re = 294;
const int mi = 329;
const int fa = 349;
const int sol = 391;
const int la = 440;
const int si = 466;

// tempo base
const int tempo = 300;

// the setup function runs once when you press reset or power the board 
void setup() { 
 pinMode(pin_buzzer, OUTPUT);
} 

// the loop function runs over and over again forever 
void loop() {   
 
 suona(do, 1);      
 suona(do, 1);
 suona(sol, 1);
 suona(sol, 1);
 suona(la, 1);
 suona(la, 1);
 suona(sol, 2);
 suona(fa, 1);
 suona(fa, 1);
 suona(mi, 1);
 suona(mi, 1);
 suona(re, 1);
 suona(re, 1);
 suona(do, 2);
 
 // intervallo tra le ripetizioni della sequenza
 delay(tempo * 2);

} 

void suona(int nota, int battute) {
 tone(pin_buzzer, nota, battute*tempo);
 delay(tempo / 2);
}

Le funzione definite dall’utente servono a dare ordine al programma dividendo in parti logiche per migliorarne la comprensione, la manutenzione ed evitando ripetizioni.

 

Esempio 4

/*

Star Wars

tratto da: https://gist.github.com/nicksort/4736535

*/

// frequenze delle note (notazione inglese c=do d=re e=mi f=fa g=sol a=la b=si)

const int c = 261;
const int d = 294;
const int e = 329;
const int f = 349;
const int g = 391;
const int gS = 415;
const int a = 440;
const int aS = 455;
const int b = 466;
const int cH = 523;
const int cSH = 554;
const int dH = 587;
const int dSH = 622;
const int eH = 659;
const int fH = 698;
const int fSH = 740;
const int gH = 784;
const int gSH = 830;
const int aH = 880;
 
const int buzzerPin = 8;
 
void setup(){
 //Setup pin modes
 pinMode(buzzerPin, OUTPUT);
 pinMode(ledPin1, OUTPUT);
 pinMode(ledPin2, OUTPUT);
}
 
void loop(){
 
 //Play first section
 firstSection();
 
 //Play second section
 secondSection();
 
 //Variant 1
 beep(f, 250); 
 beep(gS, 500); 
 beep(f, 350); 
 beep(a, 125);
 beep(cH, 500);
 beep(a, 375); 
 beep(cH, 125);
 beep(eH, 650);
 
 delay(500);
 
 //Repeat second section
 secondSection();
 
 //Variant 2
 beep(f, 250); 
 beep(gS, 500); 
 beep(f, 375); 
 beep(cH, 125);
 beep(a, 500); 
 beep(f, 375); 
 beep(cH, 125);
 beep(a, 650); 
 
 delay(650);
}
 
void firstSection() {
 beep(a, 500);
 beep(a, 500); 
 beep(a, 500);
 beep(f, 350);
 beep(cH, 150); 
 beep(a, 500);
 beep(f, 350);
 beep(cH, 150);
 beep(a, 650);
 
 delay(500);
 
 beep(eH, 500);
 beep(eH, 500);
 beep(eH, 500); 
 beep(fH, 350);
 beep(cH, 150);
 beep(gS, 500);
 beep(f, 350);
 beep(cH, 150);
 beep(a, 650);
 
 delay(500);
}
 
void secondSection() {
 beep(aH, 500);
 beep(a, 300);
 beep(a, 150);
 beep(aH, 500);
 beep(gSH, 325);
 beep(gH, 175);
 beep(fSH, 125);
 beep(fH, 125); 
 beep(fSH, 250);
 
 delay(325);
 
 beep(aS, 250);
 beep(dSH, 500);
 beep(dH, 325); 
 beep(cSH, 175); 
 beep(cH, 125); 
 beep(b, 125); 
 beep(cH, 250); 
 
 delay(350);
}

void beep(int note, int duration){
 tone(buzzerPin, note, duration);
 delay(50);
}

 

Esempio 5

Contapezzi con seriale e led

 


Installazione dell’IDE: https://www.arduino.cc/en/Guide/HomePage

All’interno dell’IDE sono presenti numerosi esempi (Menu File/Examples).

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *