Salta al contingut
ESP32 de 0 a 100

Mòdul M0 · Primers passos · M0·1 · classe 1 de 22 dels mòduls

Hola món amb l'Arduino IDE

Instal·les les eines, fas parpellejar el LED de la placa i la fas parlar pel monitor sèrie.

  • Bloqueja 1 h 45
  • Freenove WROVER
  • Per començar
📅 Afegeix-la a l'agenda

S'obre amb el Calendari del Mac, Google Calendar o Outlook. Dura 1 h 45.

El vídeo

1 min 12 s · Subtítols en català
Llegeix la transcripció

Són les tres de la matinada. A l'oficina, l'armari dels servidors s'escalfa… i no hi ha ningú per veure-ho. Al final d'aquest curs, el vigilarà això: un ESP32. Un microcontrolador: un ordinador sencer dins d'un xip.

Però avui comencem pel principi: el hola món de l'electrònica. Fer parpellejar un llum. Ho escrivim a l'Arduino IDE. Tot programa té dues parts. setup s'executa una sola vegada, quan la placa s'engega. I loop es repeteix per sempre: encén el llum, espera un segon, apaga'l, espera. I torna a començar.

Quan prems Pujar, l'ordinador tradueix el codi al llenguatge del xip, i l'hi envia pel cable USB. I el llum parpelleja. Pel monitor sèrie, la placa ens saluda: Hola, sóc l'ESP32! Primera classe, feta. Avui, un llum que parpelleja. Al final del curs, una oficina que es vigila sola.

Abans de seguir: si la placa està engegada 10 segons, quantes vegades s'executa setup()? I el cos de loop(), si cada volta dura 2 segons?

Mostra la resposta

setup(), una sola vegada, en engegar-se. loop(), unes 5 vegades (10 s ÷ 2 s), i continuaria per sempre.

Prepara

Tingues-ho a sobre la taula abans de començar. Ve tot del kit de Freenove.

A cada classe, el material que ja has fet servir abans portarà la marca ja el tens · M0·1.

Escalfament

És la primera classe i no hi ha res a repassar. Aquestes quatre preguntes només escalfen: pensa la resposta abans de mirar-la. A partir de la M0·2, aquí hi haurà el repàs de la classe anterior, sense apunts.

  1. L'ESP32 i el teu ordinador tenen tots dos un processador i memòria. Quina diferència important creus que hi ha?

  2. Si un programa diu «encén el LED, espera 1 s, apaga'l, espera 1 s» i es repeteix, quantes vegades parpellejarà en un minut?

  3. Per què creus que per programar la placa no serveix qualsevol cable USB?

  4. Analògic o digital? Un termòmetre de mercuri, l'interruptor de la llum, el volum d'una ràdio i un polsador.

Teoria

Zeros i uns

Un senyal analògic pot prendre qualsevol valor: la temperatura, el volum d'una ràdio. Un de digital només en té dos, 0 i 1. A l'ESP32, un 1 vol dir 3,3 V i un 0 vol dir 0 V.

Un bit és un sol 0 o 1. Un byte són 8 bits, i permet 256 combinacions. Tot el que fa un microcontrolador, al final, és llegir i escriure zeros i uns, molt de pressa.

Què és un microcontrolador

Un microcontrolador és un ordinador petit dins d'un sol xip: processador, memòria i entrades i sortides. No té pantalla ni teclat, i fa una sola feina, la que li programes, sempre que estigui endollat.

La seva feina és llegir, decidir i actuar, milers de vegades per segon. Al Monitor Oficina, les entrades seran els sensors de temperatura i el detector de llum, i les sortides, un LED, un brunzidor, una pantalla i els missatges de Telegram.

L'ESP32 és un microcontrolador d'Espressif amb WiFi i Bluetooth. Per això el triem: més endavant haurà d'enviar avisos per internet.

La família ESP32

«ESP32» és el nom d'una família de xips. En aquest curs en fem servir dos: el clàssic per aprendre i l'S3 per al projecte.

XipNuclisRàdioPer a què
ESP32 (clàssic)2WiFi + BluetoothEl de la placa WROVER: mòduls M0–M4
ESP32-S21WiFiSense Bluetooth
ESP32-S32WiFi + Bluetooth LE 5El de l'oficina: del mòdul M5 en endavant
ESP32-C31WiFi + Bluetooth LE 5Petit i barat
ESP32-C61WiFi 6 + Bluetooth LE + Zigbee/ThreadDomòtica
ESP32-H21Bluetooth LE + Zigbee/ThreadSense WiFi

La placa per dins

La placa del kit, la Freenove WROVER, porta l'ESP32 (sota la tapa metàl·lica, amb l'antena), un connector USB, un xip CH340 que tradueix entre l'USB i l'ESP32, un regulador que converteix els 5 V de l'USB en 3,3 V, un LED i dos botons:

  • EN reinicia la placa: el programa torna a començar.
  • BOOT connecta el GPIO 0 a terra. Si en arrencar el GPIO 0 és a 0, la placa espera un programa nou; si és a 1, executa el que ja té. Per això, si la pujada falla, mantenir BOOT la posa en mode de càrrega.

On viu cada cosa

La flash és la biblioteca: hi queda el programa encara que desendollis la placa. La SRAM és l'escriptori: molt ràpida, però s'esborra quan s'apaga. La PSRAM és una taula auxiliar més gran, a fora del xip. A més, hi ha una ROM de fàbrica que no s'esborra mai (per això sempre es pot tornar a programar la placa) i una petita memòria que sobreviu quan l'ESP32 dorm.

Com arriba el programa a la placa

  1. 1Escrius el codi a l'Arduino IDE
  2. 2Compila: el tradueix al llenguatge del xip (un fitxer binari)
  3. 3Puja: l'envia pel cable USB
  4. 4La placa es reinicia i l'executa

El programa queda desat a la placa: si la desendolles i la tornes a endollar, torna a començar sol, sense l'ordinador.

setup() i loop()

Tot programa d'Arduino té aquestes dues parts. setup() s'executa una vegada, quan la placa s'engega: és preparar la motxilla. loop() es repeteix per sempre: és la rutina de cada dia, la feina de la placa.

🧮 Càlcul ràpid

Amb paper i llapis. Pensa la resposta abans de mirar-la.

  1. El LED està 500 ms encès i 500 ms apagat. Quantes pampallugues fa per segon?

  2. I a l'inrevés: per fer 5 pampallugues per segon, quin delay() hi has de posar?

C++ d'avui

Una funció
Un bloc de codi amb nom. Les instruccions van entre { i }.
void setup() {
  // el que hi ha aquí s'executa una vegada
}
El punt i coma
Cada instrucció acaba amb ;. Si te'n deixes un, el programa no compila.
Comentaris
Tot el que va després de // és per a les persones: la placa no ho llegeix.
delay(ms)
Espera. Els temps són en mil·lisegons: delay(1000) és un segon.
Serial.println("…")
Escriu un text al monitor sèrie i salta de línia.

Instal·la i connecta

  1. https://espressif.github.io/arduino-esp32/package_esp32_index.json

No hi és? Mira «No apareix cap port nou» a l'apartat de problemes.

Què farem servir de la placa

ElementPinCableNota
LED de la placaGPIO 2Cap: ja és a la placasortida
Botó EN——Reinicia la placa: el programa torna a començar
Botó BOOTGPIO 0—Només si la pujada falla (vegeu els problemes)

Codi

Obre File → New Sketch, esborra el que hi ha i escriu-ho tu (millor que copiar-ho: així t'hi fixes). Desa'l com a hola-mon.

hola-mon.ino Descarrega
// M0·1 · Hola món
// Fa parpellejar el LED de la placa i saluda pel monitor sèrie.

void setup() {
  pinMode(2, OUTPUT);       // el pin 2 (el LED) serà una sortida
  Serial.begin(115200);     // obre el monitor sèrie a 115200 baud
}

void loop() {
  digitalWrite(2, HIGH);    // encén el LED
  Serial.println("Hola, sóc l'ESP32");
  delay(1000);              // espera 1 segon
  digitalWrite(2, LOW);     // apaga el LED
  delay(1000);              // espera 1 segon
}
Monitor sèrie115200 baud
Hola, sóc l'ESP32
Hola, sóc l'ESP32
Hola, sóc l'ESP32

Una línia cada 2 segons. Si prems EN, abans pot sortir text del sistema (ets Jun 8 2016…, rst:0x1…): és normal.

Com funciona, línia a línia
Línies 1–2
Comentaris: expliquen què fa el programa.
Línia 5
pinMode(2, OUTPUT) diu que pel pin 2 hi farem sortir corrent. El LED de la placa hi està connectat.
Línia 6
Serial.begin(115200) engega la comunicació amb l'ordinador. El 115200 és la velocitat: el monitor sèrie ha d'estar a la mateixa.
Línia 10
digitalWrite(2, HIGH) posa el pin a 3,3 V: el LED s'encén.
Línia 11
Escriu la salutació. Va dins de loop() perquè la vegis encara que obris el monitor tard.
Línies 12–14
Espera, apaga (LOW = 0 V) i torna a esperar. Després, loop() torna a començar.

Has acabat quan…

Si no funciona…

No apareix cap port nou a Tools → Port

Mira: el LED vermell de la placa, encès? Si no, prova un altre port USB de l'ordinador.

Solució: canvia de cable (el més habitual). Si encara no surt, cal el driver CH340, el xip USB de la placa: segueix el PDF de resolució de problemes de Freenove, instal·la'l i reinicia l'ordinador.

A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header

Què passa: la placa no ha entrat en mode de pujada.

Solució: torna a prémer Upload i, quan a baix surti Connecting…, mantén premut el botó BOOT fins que comenci a escriure percentatges.

El monitor sèrie mostra caràcters estranys (⸮⸮⸮)

Solució: la velocitat no coincideix. Tria 115200 baud a baix a la dreta del monitor sèrie.

Could not open /dev/cu.usbserial-…, the port is busy or doesn't exist

Solució: una altra finestra fa servir el port. Tanca el monitor sèrie (o l'altra finestra de l'Arduino IDE) i torna a pujar.

expected ';' before '}' token

Què passa: falta un ; al final d'una instrucció. L'error assenyala la línia següent a la que el necessita.

Cap d'aquests? Mira la 🆘 xuleta: hi ha més errors i un arbre per trobar on falla.

Repte

Fes que el LED faci SOS en Morse (3 curtes, 3 llargues, 3 curtes) i que el monitor sèrie escrigui «SOS» cada vegada.

Fes-lo tu sol, sense ajuda. Encallar-se una estona és part de l'exercici: és quan s'aprèn. Uns 10 minuts.

Pista 1

En Morse, un punt dura 1 unitat i una ratlla en dura 3. Prova amb una unitat de 200 ms.

Pista 2

Entre senyals de la mateixa lletra, el LED està apagat 1 unitat. Entre lletres, 3. Abans de tornar a començar, 7.

Pista 3

No cal res nou: només digitalWrite, delay i Serial.println. Pots copiar el bloc «encén, espera, apaga, espera» nou vegades i canviar-ne els temps.

Solució

Una manera de fer-ho, creant dues funcions pròpies, punt() i ratlla(), com setup() i loop(). Si has copiat el bloc nou vegades, també està bé.

void punt() {
  digitalWrite(2, HIGH);
  delay(200);
  digitalWrite(2, LOW);
  delay(200);
}

void ratlla() {
  digitalWrite(2, HIGH);
  delay(600);
  digitalWrite(2, LOW);
  delay(200);
}

void setup() {
  pinMode(2, OUTPUT);
  Serial.begin(115200);
}

void loop() {
  Serial.println("SOS");
  punt(); punt(); punt();
  delay(400);               // entre lletres: 3 unitats (ja n'hem esperat 1)
  ratlla(); ratlla(); ratlla();
  delay(400);
  punt(); punt(); punt();
  delay(1200);              // abans de repetir: 7 unitats
}

Tancament

Idea clau

Escriu la teva frase per veure la del curs
El programa fa setup() una sola vegada i després repeteix loop() per sempre.

Si la teva diu el mateix amb altres paraules, ho has entès.

La classe en 5 línies
  1. L'ESP32 és un microcontrolador: un ordinador petit que executa un sol programa.
  2. Un programa d'Arduino té dues funcions: setup() s'executa una vegada i loop() es repeteix per sempre.
  3. Pujar vol dir compilar el codi a binari i enviar-lo a la placa per un cable USB de dades.
  4. digitalWrite(2, HIGH) i LOW encenen i apaguen el LED, i delay() espera en mil·lisegons.
  5. Serial.println() escriu al monitor sèrie, que ha d'estar a la mateixa velocitat (115200).

Marca abans les caselles de «Has acabat quan…».

Contingut sota llicència CC BY-SA 4.0 · Codi sota llicència MIT

M0·1 feta!