| 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 |
Smart Backpack és una motxilla que informa a l'usuari de la seva temperatura corporal així com de la direcció del nord i l'altura.
La llista de materials principals és la següent:
1 Sensor d'acceleració i camp magnètic
1 NeoPixel
1 NeoPixel Ring de 16 LED
Les següents figures mostren la distribució dels elements a la motxilla.


A continuació tenim el llistat del programa:
#include <Adafruit_NeoPixel.h> #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_LSM303.h> #include <Adafruit_GPS.h>
Adafruit_NeoPixel cadena = Adafruit_NeoPixel(27, 12, NEO_GRB + NEO_KHZ800); // Una cadena de 26 NeoPixel a la pota 12 //NeoPixel 0 - Temperatura //NeoPixel 1-16 - Camp Magnètic //Neopixel 17-26 - GPS Adafruit_GPS SensorGPS(&Serial1); // Definim el sensor i li diem que faci servir la connexió Serial1 Adafruit_LSM303 lsm; boolean usingInterrupt = false; // No farem servir interrupcions uint32_t groc = cadena.Color(255, 255, 0); // Defineix el color groc uint32_t vermell = cadena.Color(255, 0, 0); // Defineix el color vermell uint32_t verd = cadena.Color(0, 255, 0); // Defineix el color verd
void setup () {
cadena.begin (); //Inicialitza els NeoPixels
cadena.show ();
Serial.begin(9600); //Temperatura
pinMode(10, INPUT); //Pin 10 Temperatura
SensorGPS.begin(9600); // Comunicació amb el sensor GPS
SensorGPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); // Configuració del sensor
SensorGPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // El sensor envia dades un cop cada segon (1 Hz)
delay(1000); // Espera un segon a que el GPS s'inicialitzi amb la configuració
lsm.begin ();
}
void loop() {
//Sensor Temperatura
float lect=analogRead(A10); //Sensor connectat #10. A10 correspon a l'entrada analògica
float temp=(lect*0.54)-98.37; //Conversió de lectura a temperatura
Serial.println("Lectura: ");
Serial.println(lect);
Serial.println("Temperatura: ");
Serial.println(temp);
if (temp > 35) {
cadena.setPixelColor(0, 0, 255, 0); // Pixel 0 verd
cadena.show(); // Actualitza
delay (500);
}
if (temp > 33 && temp < 35) {
cadena.setPixelColor(0, 255, 255, 0); // Pixel 0 groc
cadena.show(); // Actualitza
delay (500);
}
if (temp > 31 && temp < 33) {
cadena.setPixelColor(0, 255, 0, 0); // Pixel 0 verd
cadena.show(); // Actualitza
delay (500);
}
if (temp < 31) {
for (int i=0; i<3; i++) {
cadena.setPixelColor(0, 255, 0, 0);
cadena.show(); // Actualitza
delay (500);
cadena.setPixelColor(0, 0, 0, 0); // Pixel 0 vermell intermitent
cadena.show(); // Actualitza
delay (500);
}
}
//Sensor GPS
char dades = SensorGPS.read(); // Llegim dades del Sensor GPS
if (SensorGPS.newNMEAreceived()) { // Si han arribat dades del sensor
Serial.println(SensorGPS.lastNMEA()); // Envia a l'ordinador les dades llegides
if (!SensorGPS.parse(SensorGPS.lastNMEA())) { // Mira si les dades tenen informació útil
return; // Si no, torna a començar el loop per llegir dades noves
}
}
Serial.print("Altitud: ");
Serial.print(SensorGPS.altitude);
Serial.println(" m");
int a = SensorGPS.altitude/500;
int b=0;
if (1 <= a < 2){
b = 1;
cadena.setPixelColor(26, 255, 0, 255);
cadena.show ();
}
if (2 <= a < 3){
b = 2;
cadena.setPixelColor(26, 0, 255, 255);
cadena.show ();
}
if (3 <= a < 4){
b = 3;
cadena.setPixelColor(26, 0, 255, 0);
cadena.show ();
}
if (4 <= a < 5){
b = 4;
cadena.setPixelColor(26, 255, 255, 0);
cadena.show ();
}
if (5 <= a < 6){
b = 5;
cadena.setPixelColor(26, 255, 128, 0);
cadena.show ();
}
if (6 <= a < 7){
b = 6;
cadena.setPixelColor(26, 255, 0, 0);
cadena.show ();
}
if ( (a - b)!= 0 ) {
int num_pixel = (a - b)*10; //Nombre de NeoPixels de la cadena a encendre
cadena.setPixelColor(26-num_pixel, 255, 255, 255);
cadena.show ();
}
//Sensor Camp Magnètic
lsm.read();
Serial.print("Mag X: "); Serial.print((int)lsm.magData.x); Serial.print(" ");
Serial.print("Y: "); Serial.print((int)lsm.magData.y); Serial.print(" ");
Serial.print("Z: "); Serial.println((int)lsm.magData.z); Serial.print(" ");
delay(1000); //Valors del camp magnètic dels tres eixos
float Pi = 3.14159;
float angle = (atan2((int)lsm.magData.y,(int)lsm.magData.x) * 180) / Pi; //Càlcul angle vectors y i z
if (angle < 0){
angle = 360 + angle;
} // Normalize to 0-360
Serial.print("Angle: ");
Serial.print(angle); //Escriu l'angle calculat
if (angle >= 348.75 or angle < 11.25) {
cadena.setPixelColor(1, 0, 0, 100); // Pixel de color blau
cadena.show(); // Actualitza
}
if (angle >= 11.25 && angle < 33.75) {
cadena.setPixelColor(16, 0, 0, 100); // Pixel de color blau
cadena.show(); // Actualitza
}
if (angle >= 33.75 && angle < 56.25) {
cadena.setPixelColor(15, 0, 0, 100); // Pixel de color blau
cadena.show(); // Actualitza
}
if (angle >= 56.25 && angle < 78.75) {
cadena.setPixelColor(14, 0, 0, 100); // Pixel de color blau
cadena.show(); // Actualitza
}
if (angle >= 78.75 && angle < 101.25) {
cadena.setPixelColor(13, 0, 0, 100); // Pixel de color blau
cadena.show(); // Actualitza
}
if (angle >= 101.25 && angle < 123.75) {
cadena.setPixelColor(12, 0, 0, 100); // Pixel de color blau
cadena.show(); // Actualitza
}
if (angle >= 123.75 && angle < 146.25) {
cadena.setPixelColor(11, 0, 0, 100); // Pixel de color blau
cadena.show(); // Actualitza
}
if (angle >= 146.25 && angle < 168.75) {
cadena.setPixelColor(10, 0, 0, 100); // Pixel de color blau
cadena.show(); // Actualitza
}
if (angle >= 168.75 && angle < 191.25) {
cadena.setPixelColor(9, 0, 0, 100); // Pixel de color blau
cadena.show(); // Actualitza
}
if (angle >= 191.25 && angle < 213.75) {
cadena.setPixelColor(8, 0, 0, 100); // Pixel de color blau
cadena.show(); // Actualitza
}
if (angle >= 213.75 && angle < 236.25) {
cadena.setPixelColor(7, 0, 0, 100); // Pixel de color blau
cadena.show(); // Actualitza
}
if (angle >= 236.25 && angle < 258.75) {
cadena.setPixelColor(6, 0, 0, 100); // Pixel de color blau
cadena.show(); // Actualitza
}
if (angle >= 258.75 && angle < 281.25) {
cadena.setPixelColor(5, 0, 0, 100); // Pixel de color blau
cadena.show(); // Actualitza
}
if (angle >= 281.25 && angle < 303.75) {
cadena.setPixelColor(4, 0, 0, 100); // Pixel de color blau
cadena.show(); // Actualitza
}
if (angle >= 303.75 && angle < 326.25) {
cadena.setPixelColor(3, 0, 0, 100); // Pixel de color blau
cadena.show(); // Actualitza
}
if (angle >= 326.25 && angle < 348.75) {
cadena.setPixelColor(2, 0, 0, 100); // Pixel de color blau
cadena.show(); // Actualitza
}
delay (1000); //Mantenim els LED encesos
for (int i=1; i<27; i++) {
cadena.setPixelColor(i, 0, 0, 0); //Apaguem tots els LED
}
cadena.show();
}
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.