martes, 29 de diciembre de 2020

Control de qualitat de l'aire amb arduino i sensors CO2

 5 anys!!!!! ufff .. ja ni sabia entrar en aquest blog! ;)

En aquest 5 anys han passat prou coses i una de les més importants és que he canviat de centre de treball. Professionalment he guanyat molt ja que ara estic centrat en impartir docència a Cicles Formatius, cosa que em plena molt (abans era invent rere invent a vore què feia per innovar amb els nanos .. que també estava guai .. peò açò mola més ;)

Be, al lio ... farà un parell de mesos vaig començar a veure aparatets d'aquests que medeixen la qualitat de l'aire però que valen prou diners ... i mirant mirant vaig veure que amb un sensor i un arduino es podia fer alguna cosa i vaig pensar .. vaig a fer-ho.

Com que tinc un Arduino Uno,  em vaig posar a buscar sensors de CO2 i vaig trobar uns molt baratets .. i els vaig comprar. 


Prototip amb arduino uno i sensors MQ135

Únicament es necessita connectar la terra y Vcc al sensor i el pin de dades a una entrada analògica del arduino UNO. Com aquest esquema.


Aquest és el sensor MQ135. Té un problema important ... la calibració. Vaig usar la llibreria MQ135 
https://github.com/GeorgK/MQ135

Però els valors que donava no eren molt coherents ... vaig buscar i buscar i hi havia que, en el codi, variar una constant denominada RZERO

/// Calibration resistance at atmospheric CO2 level
#define RZERO 7300

I per a trobar el valor hi havia que posar aquesta constant a 1 i deixar 24 hores funcionant el sensor. Per consola es treia el valor del rzero .. i quan passaven eixes 24h el valor que es retornava (a poc a poc anava ajustant-se i tendint a un valor concret) era el valor que hi havia que posar en la constant. Compilar de nou i ja funcionava bé el sensor.

Codi utilitzat per trobar el valor de RZERO:


void setup()
{
pinMode(ANALOGPIN, INPUT);
Serial.begin(115200);
float rzero = gasSensor.getRZero();
delay(3000);
Serial.print("MQ135 RZERO Calibration Value : ");
Serial.println(rzero);
}

void loop() {

float val = analogRead(ANALOGPIN);
float res= gasSensor.getResistance();
float ppm = gasSensor.getPPM();
float rzero = gasSensor.getRZero();
delay(3000);
Serial.print(" VAL: ");
Serial.print(val);
Serial.print(" RES: ");
Serial.print(res);
Serial.print("RZERO : ");
Serial.println(rzero);
}



Dades al núvol

El següent pas era que en lloc de tindre un arduino UNO, fer-ho amb un altre controlador que tinguera connectivitat (el meu cunyat XAU va ser el que em va donar la idea) .. i vaig comprar aquest controlador ESP32 amb mòdul WIFI.


Tot igual que amb el UNO però ara les dades en lloc de mostrar-les al Serial o a un LED, podia enviar-les al núvol. I així ho vaig fer .. vaig programar un petit php que obté les dades i les emmagatzema en una base de dades (després veurem el resultat)

https.begin(*client,peticion);
int httpCode = https.GET();
Serial.print("GET http code: ");
Serial.println(httpCode);
if(httpCode != HTTP_CODE_OK) {
    Serial.print("error en la peticion: ");
    Serial.println(peticion);
    String resa = "[HTTP] GET... failed, error: ";
    resa = resa + https.errorToString(httpCode).c_str();
    Serial.println(resa);
}
else{
    Serial.print("OK : ");
    Serial.println(peticion);
}
https.end();


Més o menys la petició https es realitza amb aquest codi.

Les medicions les fa cada 5 segons i treia una mitjana cada minut i això és el que s'envia a la petició HTTPS per a que ho emmagatzeme a la base de dades.

Problema de medicions

Vaig començar a controlar les medicions i variaven moltíssim ... de vegades 450ppm (lo normal són 400 a l'aire lliure) i d'altres donava 30000... UUUppppsss! Algo no funciona massa bé ... 

Buscant buscant .. el sensor alimenta a 5V i aquest ESP32 va a 3.3V però té una eixida de 5V (que és la que li connecte a l'alimentació del sensor). Potser això està fent que els valors no siguen bons. Vaig intentar posar una resistència entre sensor i Arduino, i res. 


Vaig posar un convertidor de senyal de 5v a 3.3v (comprat per amazon) El que fa aquest aparatet és que alimentes a una banda 5v a altra 3.3v i les senyals a 5v les converteix a 3.3 i viceversa.

 

Res de res ... que no prenia valors bons ... Vaig canviar de tàctica .. vaig buscar
els sensors de qualitat d'aire comercials i vaig veure que utilitzaven un sensor
de gas digital .. i vaig veure que hi havien un poc més cars que els MQ135
però que hi havia que provar-ho ...

Ale ... que Amazon ha tingut un client VIP per fer aquest projecte :D

Aquests són els sensors CCS811 que al final he usat en lloc dels MQ135: 


La diferència és que les dades venen pels pins SDA i SCL. El Vcc va a 3.3v,
el GND a terra i per a que funcione, el WAK també a terra. I el prototip  va
quedar així:


El programa per a capturar les dades a arduino és aquest:

void connectWifi(){
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
int cont =0;
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
cont++;

if(cont==60) break;
}
if(cont==60){
disconnectWifi();
Serial.println("NOT CONNECTED");
}
else
Serial.println(" CONNECTED");
}
void disconnectWifi(){
//disconnect WiFi as it's no longer needed
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
}

void setup()
{
Serial.begin(9600);
Serial.println("CCS811...");

if(!ccs.begin()){
Serial.println("Failed to start sensor! Please check your wiring.");
}else{

// Sets the mode to read data each second
Serial.println("DRIVE MODE TO 1 sec.");

ccs.setDriveMode(CCS811_DRIVE_MODE_1SEC);

// Wait for the sensor to be ready
Serial.println("Waiting for the sensor to be ready ...");

while(!ccs.available());
temp = ccs.calculateTemperature();
ccs.setTempOffset(temp - 25.0);

Serial.println("CCS811 Sensor OK");
delay(3000);
connectWifi();

}

}

void loop()
{
Serial.print("Mem free: ");
Serial.println(ESP.getFreeHeap());
muestras++;

if(ccs.available()){
if(!ccs.readData()){
ppm = ccs.geteCO2();
Serial.print("CO2: ");
Serial.print(ppm);
Serial.print(" ppm, TVOC: ");
temp = ccs.getTVOC();
Serial.println(temp);
}
else{
Serial.println("ERROR!");
}
}

media_valor += ppm;
if(muestras == MAX_MUESTRAS){

media_valor= media_valor / MAX_MUESTRAS;
// Si la media de los valores tomados en 1 minuto cada 5 seg supera la zona
// crítica en 3 muestras, se reinicia el sensor
if(media_valor > ZONACRITICA){
valores_criticos++;
}
else{
valores_criticos=0;
}


if(valores_criticos == MAX_VALORES_CRITICOS){
// Se resetea el ESP32 y se esperan 10 segundos
ESP.restart();
delay(10000);
}
else{
// Se calcula la media de MAX_MUESTRAS tomadas
// Se envia


client = new WiFiClientSecure;
if(client) {
client -> setCACert(rootCACertificate);
{

peticion = "https://localhost/mtm_sensor.php?aula=";
peticion = peticion + AULA;
peticion = peticion + "&valor=";
peticion = peticion + media_valor;

https.begin(*client,peticion);
httpCode = https.GET();
Serial.print("GET http code: ");
Serial.println(httpCode);
if(httpCode != HTTP_CODE_OK) {
Serial.print("error en la peticion: ");
Serial.println(peticion);
resa = "[HTTP] GET... failed, error: ";
resa = resa + https.errorToString(httpCode).c_str();
Serial.println(resa);

https.end();
// Si no conecta bien, desconectamos wifi y volvemos a conectar
delay(3000);
disconnectWifi();
delay(5000);
connectWifi();
}
else{
Serial.print("OK : ");
Serial.println(peticion);
https.end();
}
}
client->stop();
delete client;
} else {
Serial.println("Unable to create client");
disconnectWifi();
delay(5000);
connectWifi();
}
media_valor = 0;
muestras=0;

}
}
delay(5000);
}

Què fa aquest codi?

Quan s'encén posa en marxa el sensor i conecta la Wifi amb un SSID i passwd.
Cada 5 segons agafa mostra de valor i cada minut calcula la mitjana dels valors.
Aquesta mitjana és la que s'envia al servidor i s'emmagatzema les dades corresponents.
A més del valor del sensor, un num. d'aula i un timestamp.

Errors detectats i com s'han solucionat?

ESP32 sense memòria.


Com que creava les variables locals a la funció LOOP i aquesta funció es crida contínuament,
el ESP32 arribava un moment que es quedava sense memòria. El que s'ha fet és
posar TOTES les variables GLOBALS i així no es gasta la memòria. A més el client
HTTP s'elimina cada vegada perque es crea cada volta que és necessària una petició
HTTP.

Petició errònia

De vegades la petició HTTP no funciona correctament (no m'ho pregunteu que no ho sé).
El que faig és desconectar la wifi, esperar i tornar a connectar. Així si hi ha algún problema,
reconnecta i au!.

Valors estranys.... coses de sensors.

De sobte va tot bé i el sensor munta cap a 2000ppm ... on anem????? ... solució un poc
"chapuzas" però que vull acabar amb açò ja ... tinc un valor màxim ZONACRITICA que
la tinc a 1600 i si 3 valors consecutius donen per damunt d'aquest valor, reinicie
el ESP32 .. no se perquè se li va la olla .. però al fer açò si supera els 1600 durant 3
medicions seguides, reinicia i torna a medir bé.

Disseny final:

Com ja funcionava, el vaig fer un poc millor (sols un poc) perquè no vaig voler posar-me amb la creació
de la placa PCB... així ha quedat:




I els resultats:

Vaig fer una pagineta amb el CanvasJS que trau les gràfiques i aquestes són d'aquest tipus:


A més, vaig fer altra pagineta que indicava la mitjana del valor dels últims 5 minuts.
Pinta un semàfor del color verd, groc o vermell depenent del valor deCO2 ppm de l'aire.

És aquesta:


CAL OBRIR FINESTREEEEESSSS !!!!!


Bé i açò és tot .. per si a algú li serveix d'algo .. per a fer algún projectet o alguna coseta ..
Aci teniu els codis:


Un saludet a tots i cuide-vos molt!

Antonio Coloma.


martes, 7 de julio de 2015

PMB a lliurex 15.05

PMB a lliurex 15.05


Avuí he instal·lat el server 15.05 a la biblioteca (a un disc dur diferent del que tenia (llx 12) per si acàs no funcionava i havia de tornar enrere ;)


He cregut interessant escriure una entrada al blog perquè no ha estat fàcil que tot funcionara. Vaig a detallar com ho he aconseguit:

Abans de tot he fet una còpia de la base de dades biblioteca 

#mysqldump biblioteca > biblio20150707.sql
  • Instale server 15.05
  • Des de synaptic instale zero-lliurex-pmb-installer 
  • Ara en el zero-center apareix el instalador, però una vegada instal·lat i configurat no ha copiat ni pmb al /var/www/ ni res .. :O
  • Instale els paquets pmb i lliurex-pmb des de synaptic
  • Sorpresa!!! ara si que està el pmb  a var/www !!!! 
Val fins ací tot clar .. però ara no hi ha ni base de dades ni res ...
  • Entre en mysql desde root i sense user ni password
    • #mysql
  • Cree una base de dades buida (l'he anomenada biblioteca .. .què original sóc !!!! :)
---
 Aquest pas l'he fet abans però crec que no feia falta ... 
Actualitzar el fitxer: /var/www/pmb/includes/db_param.inc.php amb usuari i pass i nom de la base de dades

---
  • Des del navegador entre en server/pmb/tables/install.php
  • Dóne les dades de mysql (abans he creat un usuari en mysql per no entrar com a root:
  • mysql> grant all privileges on biblioteca.* to biblioteca@"%" identified by"password";
  • una vegada creada la base de dades i tot restaure en la bbdd de biblioteca les dades d'abans, però cree una còpia de seguretat de la bbdd que m'acaba de crear el pmb.
    • #mysqldump biblioteca >biblio_orig_pmb.sql
    • mysql> drop database biblioteca;
    • mysql> create database biblioteca;
  • #mysql biblioteca < biblio20150707.sql
  • Ara ja tinc la base de dades que tenia abas amb tot el catàleg :)
  • Entre en pmb (admin/admin) i em diu que la versió no coincideix ....
    • Hem d'anar actualitzant i va creant els registres de la base de dades necessaris .. actualitzam fins l'última versió. 

 I quan pense que ja està tot clar ... no connecta amb Z39.50 
(Problema de la llibreria YAZ)
  • Després de provar amb el yaz que ve amb el lliurex i que em dóna un error de (yaz.so: undefined symbol: pval_destructor) he decidit compilar el yaz i el php5-yaz...
  • Descarregue yaz-4.2.30.orig.tar.gz de https://launchpad.net/ubuntu/+source/yaz/4.2.30-4
      # tar zxvof yaz-4.2.30.orig.tar.gz
      # ./configure --prefix=/opt/yaz
(no vull que sobreescriga el que existeix per si acàs)
      #make
      #make install

     Ara descarregue php5-yaz_1.1.9.orig.tgz
    # pecl install php5-yaz
    # apt-get install php5-dev  (em demana instal·lar-ho :O

 #pecl install yaz 
  Quan em demana path to yaz installation: li dic /opt/yaz (que l'acabe de compilar)

   Sols falta afegir yaz.so al php.ini ...
  entre en  /etc/php5/apache2/conf.d i faig un fitxer 20--yaz.ini que continga:


extension=yaz.so

Reinicie apache2:
#service apache2 restart


I ja estàaaaaaaaaaa!!!!!



Perdoneu que no ho haja explicat molt bé però es que ho he fet tot de memòria (ja que no he anat apuntant el que feia mentres intalava ;)

Un saludet i bon estiu!!!!!






jueves, 19 de junio de 2014

Zoneminder a Lliurex 13 - Gestió de càmeres Web


Hola a tots/es!

Avuí vull explicar-vos com he instal·lat la versió de Zoneminder a Lliurex (per provar .. ja sabeu .. ;)


L'explicació és un poc "pesaeta" però per si a algú li serveix ahi va!

1r.  Descarregar el software www.zoneminder.com   v. 1.27.0
2n.  Descomprimir
    # tar zxvof ZoneMinder-1.27.0.tar.gz
 

3r. Entrar en directori i compilar ... 

    # cd ZoneMinder-1.27.0
    # cmake .


    1r problema: No tenim el cmake

    #apt-get install cmake

   # cmake .


    2n problema:  


     zm requires jpeg but it was not found on your system

    Entrem en synaptic i descarreguem
        * libjpeg-dev

 
    #cmake .

    3r problema:  

     zm requires mysqlclient but it was not found on your system

    Synaptic i instal·lem
després d'activar ubuntu com a repositoris i actualitzar:
        *mysql-client

        * libmysqlclient-dev
    

     #cmake .
      
    4t problema:
        zm requires crypto or gnutls but none were found on you system
      
        Amb el synaptic instal·lem els paquets:

            * libgnutls y libgnutls-dev
 
        #cmake .

    5t problema:
         Not all required perl modules were found on your system

        #perl -MCPAN -e shell
       [ ... ]


        yes a tot ;)

        cpan> install Date::Manip
        cpan> install Sys::Mmap


    Per fí ja està tot el que necessitem!!!

    #make
    #make install


Al compilar dóna: Error en MD5
Per solucionarf-ho:
    Baixe openssl --> Compilar i instalar ;

  ./config --prefix=/usr/local --openssldir=/usr/local/openssl


    De nou compilem el Zoneminder:

    #./cmake .
    #make
    #make install

    Com que ens fa falta el servidor web:


    * Editar el conf apache2:

    cd /etc/apache2/sites-enabled/000-default

        Alias /camara/ /usr/local/share/zoneminder/www/
        <Directory /usr/local/share/zoneminder/www>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>


     Reiniciar apache
   
    #/etc/init.d/apache2 restart


    Zoneminder necessita una Base de dades amb Mysql:

      #~/ZoneMinder-1.27.0/db# mysql -u root -p < zm_create.sql

    Configurem el zoneminder: 

    /etc/zm.conf  --> User/pass de bbdd
    
    I per a que s'inicie a l'iniciar l'ordinador: 

    Init script --> cp  /usr/local/bin/zmpkg.pl /etc/init.d



    I ja està!!!! Sols queda configurar les càmaares .. però això ho deixem per a altre dia ;)

Un saludet!
Antonio.

martes, 7 de enero de 2014

Ies Bell X - Gestor Alarmes a Linux

Hola de nou a tothom!

Ja fa més d'un any que no em passe per aci ... però com sabeu no hi ha temps per a res! :)

He creat el programeta de alarmes per a l'institut en la seua versió per a linux .. ho he fet amb Gambas2. És prou senzill, però així evitem tindre l'ordinador de la sirena amb Windows ... ja sabeu el perquè no?

La versió a 7 de gener de 2014 és molt senzilla ... sols permet posar l'hora i el fitxer mp3 o ogg ... però es que he preferit que funcionara el minim primer i després ja li afegiré cosetes ;)

La pantalla inicial és :


I ho podeu descarregar (codi font inclòs) des de Sourceforge.

Un saludet i Bon any 2014 a tots/es!

Editat: 02/02/2014 Modificat bug que no permetia seleccionar cançò! Ah .. al meu IES ja està funcionant una setmaneta i de moment tot bé! ;)

miércoles, 11 de julio de 2012

Estalvi d'energia ... apagant terminals

Al meu IES tenim aules matèria, per la qual cosa podem tindre un ordinador (de vegades és un toshiba dels molt molt antics) per aula on podem passar llista, mostrar recursos online (a moodle o altra plataforma) ... etc.

Què és el que passava? Que  moltes nits el centre estava "encés" perquè molts ordinadors no els havien apagat ... (en fi ... no comment que m'encenc!!! )

Avui he revisat tots els ordinadors de les aules i, a més d'actulitzar molts d'ells a lliurex nemo 12.06 , he incorporat l'ordre al cron per que s'apaguen ells soles:

#sudo -i    (per fer-nos superusuaris)
(posem la paraula de pas dcorresponent)

#crontab -e
.... s'edita el fitxer amb el nano per exemple ...

35 15 * * * /sbin/shutdown -h now
35 21 * * * /sbin/shutdown -h now

Es guarda i ja està. Per a verificar-lo posem
#crontab -l
i ho verifiquem

Però quin és el problema ... que alguns ordinadors (sobretot els vells amb lliurex 9.09) no tenen l'hora sincronitzada. El que he fet és posar aquest script:

----
#!/bin/bash
export http_proxy="http://10.0.254.254:3128"
/bin/date -s "$(/usr/bin/wget --no-cache -S -O /dev/null google.com 2>&1 | sed -n -e '/  *Date: */ {' -e s///p -e q -e '}')"

----
L'he anomenat /root/data.sh i en l'script d'arranc he inclòs la seua cridada a /etc/init.d/rc.local

Per què he fet això .. perquè he provat a fer un ntpdate a pool.ntp.org i no anava i amb aquest script agafe l'hora d'un servidor i la modifique amb el comandament "date" de linux.

I mentre escric açò crec que he estat perdent el temps perquè crec que el server lliurex (en el meu cas 10.0.254.254) té un server ntp i podria haver afegit al script rc.local :

ntpdate 10.0.254.254 i ja estaria ... :)

En fi ... que també m'ho he passat bé provant l'script ... :)

Un saludet!

domingo, 19 de febrero de 2012

Veure pelis de netflix a casa amb un apple tv 2

Després d'una vesprada sencera .. ho he aconseguit .. i és que de vegades la cosa més fàcil es complica per una xorradeta ;)
El cas es que el meu cunyat em va dir que veia pelis de netflix amb l'ordinador utilitzant un servei de vpn i em vaig posar a investigar ... 

Netflix és el servei de pelis online de Estats Units, però que sols poden subscriure's aquelles personetes que es connecten des d'alli. Però hi ha serveis de pagament com BlackVPN que et permeten fer una VPN entre el teu ordenador i un d'ells en USA i pots enregistrar-te a Netflix. Fins ahi bé ...

Conseguisc connectar-me a Netflix i em done d'alta ... connecte amb l'ordinador (Mac OSx Lion) i va de perles ... puc veure pelis en l'ordinador.



Però i amb l'apple TV 2 ? ..  Passos que he seguit:
a) Fer el meu mac ox x, un Router.
a.1) Connectar amb BlackVPN (crea una interfície tun0 )
a.2) Crear script i executar-lo:
#!/bin/sh
natd -interface tun0
ipfw -f flush
ipfw add divert natd ip from any to any via tun0
ipfw add pass all from any to any
sysctl -w net.inet.ip.forwarding=1

 a.3) Configurar el aparatet (apple tv)

1.- Posar apple tv 2 amb el pais USA
2.- Modificar la IP del gateway per a posar la IP del ordinador amb MAC OS X (el que hem executat l'script)
3.- IMPORTANT: Canviar la DNS del apple tv a la de Google: 8.8.8.8
Açò és el que m'ha tornat boig .. com que no podia resoldre DNS amb les del meu ISP, el AppleTV no connectava a Internet.
4.- I a veure Netflix (Apareix a un submenu del apple tv)

Per tant .. una connexió VPN amb BlackVPN:  5€ / mes
Alquilers il·limitats al mes amb netflix: 7.99 USD = 6 €  i poquet

Per poc més d'11 € al mes puc veure pelis i documentals a tutiplen ;)

Cosa a tenir en compte: ESTÀ TOT EN ANGLÉS (Però podem posar subtitles amb anglés) ;)

Ale .. un saludet!

miércoles, 5 de octubre de 2011

Gestió d'Incidències TIC en un IES

Hola ... ja fa prou de temps que no escrivia cap cosa .. ja ha arribat el moment després d'un meset de setembre un poc liat :-)
Bé .. vos compte la experiència d'aquest any ... com que era la personeta que feia les tasques de coordinació TIC ( tot i que no ho era - aquesta any ja ho soc :-) .. i com que els profes es paraven pels corredors dient .. " es que l'ordinador de l'aula no va, .. que vull un grup en el moodle ... que .. etc. etc. "
i a mi moltes coses se m'oblidaven (uno ja va fent-se majoret :-) .. donc he pensat aquest any possar una gestió d'incidències TIC a la web i per això he possat el MANTIS bug tracker ...


La instal·lació es prou senzilla ... Crear BBDD i canviar el config.php ( o algun fitxeret per l'estil) i a còrrer ...
Funciona de la següent manera:
Cada departament té un usuari i pass. Entren .. creen una incidència (Poden escollir de diverses categories que he creat : Biblioteca, Sala profes, Aules d'informàtica ... etc) i m'arriba a mi (administrador :-) .. la resolc ( o no ) i a una altra .. així d'aquesta manera no he de anar apuntant en paperets les tasques a fer.
I així puc saber quins departaments donen més la llanda .. i tot això.
Bé .. res més per ara .. un saludet !
Antonio.