| Per començar | Elements d'entrada | Programació CircuitPython | Recursos CITCEA | |
| Elements no electrònics | Elements de sortida | Programació Arduino | ||
| Projectes | Elements de control | Dades pràctiques | Inici |
Enlighted jacket és una jaqueta pensada per millorar la seguretat dels ciclistes. Incorpora intermitents (amb control manual) i llums de posició i frenada (de funcionament automàtic).
L'encesa dels intermitents es fà amb un parell d'interruptors situats als costats. En canvi, els llums de posició es controlen amb un sensor de lluminositat i els de fre amb un d'acceleració.
La llista de materials principals és la següent:
1 Sensor d'acceleració i camp magnètic
18 Neo Pixels
2 Resistències de 10 kΩ
La figura següent mostra l'esquema del circuit. Els Neo Pixels s'han repartit en dues cadenes, una per a cada costat de la jaqueta. En cada cadena el Neo Pixel 0 és el central, els 1 a 3 corresponen a la resta dels de posició i frenada i els 4 a 8 són els dels intermitents.

El prototip va quedar com es mostra a les fotografies següents. A la de l'esquerra veiem els dos intermitents encesos, a la del centre els llums de posició i a la de la dreta els llums de frenada.

A continuació tenim el llistat del programa:
#include <Wire.h> #include <Adafruit_NeoPixel.h> #include <Adafruit_Sensor.h> #include <Adafruit_LSM303_U.h> #include <Adafruit_TSL2561_U.h>
Adafruit_NeoPixel cadena = Adafruit_NeoPixel(9, 6, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel cadena2 = Adafruit_NeoPixel(9, 9, NEO_GRB + NEO_KHZ800); Adafruit_TSL2561_Unified tsl = Adafruit_TSL2561_Unified(TSL2561_ADDR_FLOAT, 12345); Adafruit_LSM303 lsm; int pols = 12; int pols2= 10; int lectura; int lectura2; int start = 0; int prevZ = 0; int currentZ = 0; long brakeTime = 0; #define BRAKETHRESHOLD 100 #define BRAKETIMETHRESHOLD 100
void setup() {
cadena.begin();
cadena2.begin();// Inicialitza els Neo Pixels
cadena.show();
Serial.begin(9600);
if(!tsl.begin()) {
Serial.print("Comprova que el sensor està ben connectat");
while(1);
}
if (!lsm.begin()) {
Serial.println("Oops ... unable to initialize the LSM303. Check your wiring!");
while (1);
}
tsl.enableAutoRange(true); // Funcionament normal amb guany automàtic
tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_13MS); // Més velocitat però menys resolució
pinMode(pols, INPUT); // El polsador és una entrada
pinMode(pols2, INPUT); // El polsador2 és una entrada
}
void loop() {
sensors_event_t event;
tsl.getEvent(&event);
Serial.print(event.light); Serial.println(" lux");
lectura = digitalRead(pols); // Llegim el polsador
lectura2 = digitalRead(pols2); // Llegim el polsador2
lsm.read();
currentZ = abs(lsm.accelData.z); // act curren
if (start == 0){
prevZ = currentZ;
start = 1;
}
int i = currentZ - prevZ; // current0- prev0
if (abs(i) > BRAKETHRESHOLD) {
brakeTime = millis(); // millis0
while ((abs(i) > BRAKETHRESHOLD)) {
lsm.read();
currentZ = abs(lsm.accelData.z); //current 1
i = currentZ - prevZ; // current 1- prev0
// while mentres current - prev0 més gran que el llindar
if ((millis() - brakeTime) > BRAKETIMETHRESHOLD) {
for (int k = 0; k < 4; k++){
cadena.setPixelColor(k, 255,0,0); // Pixels 0-4 vermell
cadena2.setPixelColor(k, 255,0,0); // Pixel 0-4 vermells
}
cadena.show();
cadena2.show();
// ENGEGA quan ha passat prou temps al while
// (que mentres current - prev0 més gran que el llindar)
break;
}
}
} else { // si no estàs frenant
for (int k = 0; k < 4; k++){
cadena.setPixelColor(k, 0,0,0); // Pixel 0-4 apagats
cadena2.setPixelColor(k, 0,0,0); // Pixel 0-4 apagats
if (event.light < 20) { // si hi ha poca llum
for (int k = 1; k < 4; k++){
cadena.setPixelColor(k, 255,255,255); // Pixel 1-4 blancs
cadena2.setPixelColor(k, 255,255,255); // Pixel 1-4 blancs
}
cadena.setPixelColor(0, 255,0,0); // Pixel 0 vermell
cadena2.setPixelColor(0, 255,0,0); // Pixel 0 vermell
cadena.show(); // Actualitza
cadena2.show(); // Actualitza
}
}
}
prevZ=currentZ; // prev1
if (lectura == HIGH && lectura2 == LOW){ // Si polsador dret està premut...
for (int k = 4; k < 9; k++){
cadena.setPixelColor(k, 255, 125, 0); // intermitent ences
}
cadena.show();
cadena2.show();
delay(250);
for (int k = 4; k < 9; k++){
cadena.setPixelColor(k, 0, 0, 0);// intermitent apagat
}
cadena.show();
}
if (lectura2 == HIGH && lectura == LOW){ // Si polsador esquerre està premut...
for (int k = 4; k < 9; k++){
cadena2.setPixelColor(k, 255, 125, 0);// intermitent ences
}
cadena2.show();
cadena.show();
delay(250);
for (int k = 4; k < 9; k++){
cadena2.setPixelColor(k, 0, 0, 0); // intermitent apagat
}
cadena2.show();
}
if (lectura2 == HIGH && lectura == HIGH){ // Si els dos posaldors estan premuts...
for (int k = 4; k < 9; k++){
cadena.setPixelColor(k, 255, 125, 0);
cadena2.setPixelColor(k, 255, 125, 0);
}
cadena.show();
cadena2.show();
delay(250);
for (int k = 4; k < 9; k++){
cadena.setPixelColor(k, 0, 0, 0);
cadena2.setPixelColor(k, 0, 0, 0);
}
cadena.show();
cadena2.show();
} else { // Si cap està premut
for (int k = 4; k < 9; k++){
cadena.setPixelColor(k, 0, 0, 0);
cadena2.setPixelColor(k, 0, 0, 0);
}
cadena.show();
cadena2.show();
}
delay(250);
}
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.

Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.