Internet de les coses amb ESP32 i ESP8266

Exemples Referència Plaques   Recursos CITCEA
Projectes Programació Perifèrics   Inici

Estructura d'un programa

Un programa en l'entorn Arduino té les següents parts:

Càrrega de biblioteques i definicions generals

Declaració de variables globals

Declaració de funcions

Programa d'inicialització

Bucle de programa

Algunes d'aquestes parts hi han de ser sempre (encara que poden estar sense contingut) i altres només les posarem quan siguin necessàries. En els nostres exemples, les diferents parts aniran marcades amb un fons de color diferent per a cada una que permetrà identificar-les.

Càrrega de biblioteques i definicions generals

Sovint el nostre programa requerirà la càrrega de biblioteques externes. Aquestes biblioteques contenen funcions que han estat desenvolupades per altres però que nosaltres podem aprofitar. Molts dels elements d'entrada o sortida que podem connectar a la nostra placa de control van acompanyats de biblioteques que permeten fer-los servir sense complicacions. No podem fer servir cap funció si no la definim o bé carreguem la biblioteca que la conté. En el següent exemple s'inclou la biblioteca dels Neo Pixel.

#include <Adafruit_NeoPixel.h>

En aquesta part també posarem les assignacions de valor. Fent servir #define podem assignar un valor a un nom. El nom serà substituït pel valor en el moment d'enviar-ho al microcontrolador. Va bé quan un mateix valor (que pot variar) apareix en diversos llocs del programa.

En el següent programa tenim un LED connectat a la pota 13. Fixem-nos que fem servir una variable per guardar el valor 13.

	int potaLED = 13;
void setup(){
	pinMode(potaLED, OUTPUT);
}

En aquest altre programa no fem servir cap variable i, per tant, estalviem memòria. Quan ho enviem al microcontrolador tots els potaLED seran substituïts per 13.

#define potaLED 13
void setup(){
	pinMode(potaLED, OUTPUT);
}

Fixem-nos que a la línia de #define no hi ha cap signe = ni cap punt i coma.

Declaració de variables globals

Aquí diem quines variables farem servir i de quin tipus són. Les variables que declarem aquí estaran disponibles en tot el programa. En canvi, podem definir variables dins les funcions; les quals no estaran disponibles fora d'aquestes. En C no podem fer servir cap variable que no hagi estat definida abans. Si ho desitgem, podem donar un valor a les variables en el moment de definir-les. En el següent exemple definim una variable entera i una real i donem valor a la segona.

	int num;
	float pi = 3.1415927;

Declaració de funcions

Si fem servir alguna funció no importada, aquí serà el lloc on definir-la. Si la funció necessita variables internes (que no es facin servir fora de la funció), les haurem de definir dins d'aquesta. La següent funció fa el promig de dues variables reals i retorna un resultat real. Dins la funció definim una variable real que anomenem resul.

float promig (float x, float y) { 
	float resul; 
	resul = (x + y)/2; 
	return resul; 
}

Programa d'inicialització

Els programes dels microcontroladors tenen quasi sempre una estructura cíclica però la majoria necessita executar un cert nombre d'instruccions només al començar. En aquesta part del programa hi posarem aquelles instruccions que s'han d'executar en el moment de posar en marxa el microcontrolador. En aquesta part només hi pot haver una funció anomenada setup amb el contingut que ens convingui. En aquest exemple definim que la pota 3 serà d'entrada i la 13 de sortida.

void setup()
{
	pinMode(3, INPUT);
	pinMode(13, OUTPUT);
}

Bucle de programa

Aquí hi anirà aquella part del programa que es repeteix cíclicament. En aquesta part només hi pot haver una funció anomenada loop amb el contingut que ens convingui. En el següent exemple hi ha un LED que està intermitent. A la primera instrucció s'encén i a la tercera s'apaga. Atès que la funció loop es repeteix indefinidament, el LED s'anirà encenent i apagant indefinidament.

void loop() {
	digitalWrite(13, HIGH);
	delay(1000);
	digitalWrite(13, LOW);
	delay(1000);
}

Comentaris

En qualsevol part del programa podem posar comentaris. Els comentaris ens permeten posar un text explicatiu que serà ignorat pel microcontrolador. Els comentaris poden estar a la dreta d'una línia; en aquest cas van precedits pels signes //. El microcontrolador no tindrà en compte res del que hi hagi entre les dues barres i el final de la línia. També podem tenir comentaris que ocupin diverses línies; en aquest cas els posarem entre /* i */. Quan el microcontrolador trobi un /* ignorarà tot el que hi hagi a continuació fins haver trobat un */. Això ens permet fer proves eliminant temporalment parts del programa.

/* A continuació encenem i apaguem un LED.
Si ho repetim el LED estarà intermitent */
	digitalWrite(13, HIGH); // Activem el LED
	delay(1000); // Esperem un temps
	digitalWrite(13, LOW); // Desactivem el LED
	delay(1000); // Esperem un temps

 

 

 

En aquest web, les fotografies marcades amb [AF] són del web d'Adafruit, les marcades amb [SF] del web d'Sparkfun i les marcades amb [AU] del web d'Arduino.

 

 

 

 

 

 

 

 

 

 

Licencia de Creative Commons
Esta obra de Oriol Boix está licenciada bajo una licencia no importada Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0.