Descripció de l’activitat
L’activitat consisteix en un joc interactiu programat mitjançant codi que simula l’extracció aleatòria de boles de colors (vermell, blau i verd) d’una bossa virtual. Mitjançant dos botons, l’alumnat pot extreure boles a l’atzar i consultar en qualsevol moment la probabilitat de treure cada color segons les boles que queden.
El sistema mostra la informació en una pantalla OLED: el nombre de boles de cada color, el color extret en cada tirada i les probabilitats corresponents. Cada extracció modifica l’estat del joc, de manera que les probabilitats canvien dinàmicament (activitat adaptada a partir de l’activitat “Joc de les boles de colors” de Joan Carles Roman Campos i Ramon Segues Creu).
Material necessari
- Ordinador
- Placa Keyestudio UNO
- Pantalla OLED
- Cable I2C
Orientacions pedagògiques
Formeu grups en funció del nombre de plaques Keyestudio UNO i pantalles OLED disponibles.
Elements de programació
- Seqüències bàsiques
- Bucles
- Condicionals
- Esdeveniments
- Variables
- Funcions
- Programació a través de codi
Eix | Àrea | Matèria
SEC – Digitalització
Competències específiques
CE02 – Idear solucions innovadores i creatives aplicant diferents formes de raonament, integrant-les en l’entorn personal d’aprenentatge tot fent ús de les eines i els recursos d’edició, la creació de continguts digitals i el desenvolupament d’aplicacions per optimitzar l’aprenentatge permanent.
Sabers
Aplicació de tècniques de raonament lògic com el pensament de disseny i el pensament computacional en la resolució de problemes en el disseny de solucions.
1. Inicieu l’entorn de programació mitjançant codi “Arduino IDE” i seleccioneu una placa “Arduino UNO”.
2. Esborreu el codi que hi ha per defecte. Deseu el fitxer, feu-ho també periòdicament a mesura que afegiu codi.
3. Afegiu les llibreries necessàries per a la pantalla OLED i per a una llibreria auxiliar:
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "ABLocks_TimerFreeTone.h"
4. Creeu l’objecte de la pantalla OLED:
Adafruit_SSD1306 oled_1(128,64, &Wire,-1);
5. Declareu les variables del joc:
double Roig;
double Blau;
double Verd;
double Tirada;
double Total_boles;
double p_roig;
double p_blau;
double p_verd;
bool oled_1_autoshow = true;
6. Programeu la funció de configuració inicial:
void setup() {
pinMode(2, INPUT);
pinMode(6, OUTPUT);
pinMode(7, INPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
randomSeed(analogRead(0));
Roig = 5;
Blau = 3;
Verd = 2;
Total_boles = (Roig + ((Blau + Verd)));
oled_1.begin(SSD1306_SWITCHCAPVCC,0x3C);
oled_1.clearDisplay();
if (oled_1_autoshow) oled_1.display();
}
7. Programeu el bucle principal:
void loop() {
if (digitalRead(2)) {
Extreure_bola();
}
if (digitalRead(7)) {
mostra_probabilitat();
}
}
8. Programeu el procediment d’extracció de bola:
void Extreure_bola() {
if (Total_boles > 0) {
Tirada = math_random_int(1, Total_boles);
if ((Tirada <= Roig)) {
Roig = (Roig - 1);
analogWrite(6,255);
analogWrite(9,0);
analogWrite(10,0);
delay(1000);
analogWrite(6,0);
analogWrite(9,0);
analogWrite(10,0);
}
else if ((Tirada <= (Roig + Blau))) {
Blau = (Blau - 1);
analogWrite(6,51);
analogWrite(9,102);
analogWrite(10,255);
delay(1000);
analogWrite(6,0);
analogWrite(9,0);
analogWrite(10,0);
}
else {
Verd = (Verd - 1);
analogWrite(6,0);
analogWrite(9,102);
analogWrite(10,0);
delay(1000);
analogWrite(6,0);
analogWrite(9,0);
analogWrite(10,0);
}
Total_boles = (Roig + ((Blau + Verd)));
}
else {
for (int count = 0; count < 4; count++) {
TimerFreeTone(8,1000,500);
delay(500);
}
}
}
9. Programeu el procediment que mostra la probabilitat:
void mostra_probabilitat() {
oled_1.clearDisplay();
if(oled_1_autoshow)oled_1.display();
p_roig = (long)(((100 * ((Roig / Total_boles)))));
p_blau = (long)(((100 * ((Blau / Total_boles)))));
p_verd = (long)(((100 * ((Verd / Total_boles)))));
oled_1.setTextSize(1);
oled_1.setTextColor(WHITE);
oled_1.setCursor(0,0);
oled_1.print(String("Resultats"));
if (oled_1_autoshow) oled_1.display();
oled_1.setTextSize(1);
oled_1.setTextColor(WHITE);
oled_1.setCursor(0,10);
oled_1.print(String("Roig:") + String(p_roig)+String("%"));
if (oled_1_autoshow) oled_1.display();
oled_1.setTextSize(1);
oled_1.setTextColor(WHITE);
oled_1.setCursor(0,20);
oled_1.print(String("Blau:") + String(p_blau)+String("%"));
if (oled_1_autoshow) oled_1.display();
oled_1.setTextSize(1);
oled_1.setTextColor(WHITE);
oled_1.setCursor(0,30);
oled_1.print(String("Verd:") + String(p_verd)+String("%"));
if (oled_1_autoshow) oled_1.display();
}
10. Programeu una funció auxiliar per obtenir nombres aleatoris:
double math_random_int(int a,int b) {
if (a > b) {
int c = a;
a = b;
b = c;
}
return (double)random(a,b+1);
}
11. Deseu el programa i transferiu-lo a la placa Keyestudio UNO.
12. Connecteu la pantalla OLED al port I2C de la placa mitjançant un cable I2C.
13. Comproveu que el programa funciona correctament i apliqueu, si cal, els ajustos necessaris.


