<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Bag%C3%A0._Omplir_els_dip%C3%B2sits_del_rec</id>
	<title>Bagà. Omplir els dipòsits del rec - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Bag%C3%A0._Omplir_els_dip%C3%B2sits_del_rec"/>
	<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Bag%C3%A0._Omplir_els_dip%C3%B2sits_del_rec&amp;action=history"/>
	<updated>2026-08-30T08:21:14Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>http://wiki.joanillo.org/index.php?title=Bag%C3%A0._Omplir_els_dip%C3%B2sits_del_rec&amp;diff=253450&amp;oldid=prev</id>
		<title>Joan: /* Versió 4 de hardware (ATMEGA168) */</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Bag%C3%A0._Omplir_els_dip%C3%B2sits_del_rec&amp;diff=253450&amp;oldid=prev"/>
		<updated>2015-06-09T14:33:25Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Versió 4 de hardware (ATMEGA168)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Introducció=&lt;br /&gt;
(TBD)&lt;br /&gt;
=Desenvolupament=&lt;br /&gt;
[[Fitxer:Resum esquema.png | thumbnail]]&lt;br /&gt;
Hi ha 4 pins per  a l'alimentació:&lt;br /&gt;
*5V (els relés s'activen a 5V, s'agafa de la RPi. Es podria agafar de la font d'alimentació. La RPi s'alimenta de la font d'alimentació.)&lt;br /&gt;
*3,3V. Les entrades GPIO van a 3,3V, i per tant l'alimentació dels sensors de nivell i de llum van a 3,3V&lt;br /&gt;
*12V. És el secundari dels relés. La tensió ve d'una font d'alimentació de 12V.&lt;br /&gt;
*GND. És el comú de la RPi i de les fonts d'alimentació.&lt;br /&gt;
==Sensor de nivell==&lt;br /&gt;
El sensor de nivell és un interruptor, i per tant la manera de connectar-ho als pins GPIO és de la mateixa manera que amb les màquines Arcade.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
               ______       _______&lt;br /&gt;
    GPIO &amp;gt;----|__1K__|--+--|__10K__|----&amp;lt; +3V3&lt;br /&gt;
                        |&lt;br /&gt;
                        |&lt;br /&gt;
                        o |&lt;br /&gt;
                          |=#&lt;br /&gt;
                        o |&lt;br /&gt;
                        |&lt;br /&gt;
                        |&lt;br /&gt;
     GND &amp;gt;--------------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sensor LDR de crepuscle==&lt;br /&gt;
[[Fitxer:IhznT.png | thumbnail]]&lt;br /&gt;
Per tal d'ajustar la sensibilitat de quan commuta, he de substituir la resistència de 1K per un potenciòmetre trimmer de 1K. A 1K per tal de què commuti quasi bé he de tapar la LDR. Si baixés a 500ohm no caldria tapar tant la LDR. És un divisor de tensió.&lt;br /&gt;
&lt;br /&gt;
==Raspberry i relés==&lt;br /&gt;
[[Fitxer:Relay-Sample.png | thumbnail]]&lt;br /&gt;
El problema d'activar un relé amb un pin GPIO també interessa al projecte [[Interface_GPIO-rel%C3%A9s_per_a_efectes_de_LEDs]].&lt;br /&gt;
&lt;br /&gt;
La idea és segui l'esquema de&lt;br /&gt;
*http://www.susa.net/wordpress/2012/06/raspberry-pi-relay-using-gpio/&lt;br /&gt;
El pin GPIO són 3.5V, i el coil primari del relé són 5V. Per tant, les dues senyals les agafo de la RPi. El secundari de la bobina seran 12V o 220V depenent del projecte.&lt;br /&gt;
==Software==&lt;br /&gt;
instal.lació de la llibreria wiringPi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo apt-get install git-core&lt;br /&gt;
$ git clone git://git.drogon.net/wiringPi&lt;br /&gt;
$ cd wiringPi&lt;br /&gt;
$ ./build&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Primera prova des de la línia de comandes a la RPi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ gpio mode 7 input&lt;br /&gt;
&lt;br /&gt;
$ gpio read 7&lt;br /&gt;
0&lt;br /&gt;
$ gpio read 7&lt;br /&gt;
1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir rec_baga&lt;br /&gt;
$ cd rec_baga&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
portàtil:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /home/joan/projectes/rec_baga&lt;br /&gt;
$ scp rec_baga_v1.c pi@192.168.1.35:/home/pi/rec_baga&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
RPi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ gcc -o rec_baga -Wall -I/usr/local/include -L/usr/local/lib rec_baga_v1.c -lwiringPi&lt;br /&gt;
$ sudo ./rec_baga&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
fitxer '''rec_baga_v1.c''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;wiringPi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define	SENSOR_NIVELL	7 //GPIO7, pin 7 del header&lt;br /&gt;
#define	SENSOR_LDR	0 //GPIO0, pin 11 del header&lt;br /&gt;
#define	RELE	2 //GPIO2, pin 13 del header&lt;br /&gt;
&lt;br /&gt;
int estat_nivell; &lt;br /&gt;
int estat_ldr; &lt;br /&gt;
&lt;br /&gt;
void setup (void)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	if (geteuid () != 0)&lt;br /&gt;
	{&lt;br /&gt;
		fprintf (stderr, &amp;quot;prova1_gpio: Need to be root to run (sudo?)\n&amp;quot;) ;&lt;br /&gt;
		exit (0) ;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (wiringPiSetup () == -1)&lt;br /&gt;
		exit (1) ;&lt;br /&gt;
&lt;br /&gt;
	printf (&amp;quot;Setup ... &amp;quot;) ; &lt;br /&gt;
	fflush (stdout) ;&lt;br /&gt;
	//pinMode (0, OUTPUT) ;&lt;br /&gt;
	//digitalWrite (0, 0) ;&lt;br /&gt;
&lt;br /&gt;
 	pinMode (SENSOR_NIVELL, INPUT) ;&lt;br /&gt;
	pinMode (SENSOR_LDR, INPUT) ;&lt;br /&gt;
	pinMode (RELE, OUTPUT) ;&lt;br /&gt;
&lt;br /&gt;
	estat_nivell = digitalRead (SENSOR_NIVELL);&lt;br /&gt;
	printf(&amp;quot;Estat inicial del nivell: %d\n&amp;quot;, estat_nivell);&lt;br /&gt;
&lt;br /&gt;
	estat_ldr = digitalRead (SENSOR_LDR);&lt;br /&gt;
	printf(&amp;quot;Estat inicial del LDR: %d\n&amp;quot;, estat_ldr);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void waitCanviEstat (void)&lt;br /&gt;
{&lt;br /&gt;
	if (digitalRead (SENSOR_NIVELL) != estat_nivell) {&lt;br /&gt;
		estat_nivell = !estat_nivell;&lt;br /&gt;
		printf(&amp;quot;Estat del nivell: %d\n&amp;quot;, estat_nivell);&lt;br /&gt;
		digitalWrite (RELE,  estat_nivell);&lt;br /&gt;
	}&lt;br /&gt;
	if (digitalRead (SENSOR_LDR) != estat_ldr) {&lt;br /&gt;
		estat_ldr = !estat_ldr;&lt;br /&gt;
		printf(&amp;quot;Estat del LDR: %d\n&amp;quot;, estat_ldr);&lt;br /&gt;
		digitalWrite (RELE,  estat_ldr);&lt;br /&gt;
	}&lt;br /&gt;
	delay(100);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
	setup () ;&lt;br /&gt;
	for (;;)&lt;br /&gt;
	{&lt;br /&gt;
		waitCanviEstat () ;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
fitxer '''rec_baga_v2_a.c''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// gcc -o rec_baga -Wall -I/usr/local/include -L/usr/local/lib rec_baga_v2_a.c -lwiringPi&lt;br /&gt;
// sudo ./rec_baga&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;wiringPi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//http://opensourceecology.org/w/images/e/e5/Rasp_pinout.png&lt;br /&gt;
#define	SENSOR_NIVELL	7 //GPIO7, pin 7 del header&lt;br /&gt;
#define	SENSOR_LDR	6 //pin22 //5 //pin 18 //0 //GPIO0, pin 11 del header&lt;br /&gt;
#define	RELE1	2 //GPIO2, pin 13 del header. electrovalvula&lt;br /&gt;
#define	RELE2	3 //GPIO3, pin 15 del header. electrovalvula&lt;br /&gt;
#define RELE3    4 //GPIO4, pin 16 del header. sensor LDR&lt;br /&gt;
&lt;br /&gt;
int estat_nivell; &lt;br /&gt;
int estat_ldr; &lt;br /&gt;
&lt;br /&gt;
void setup (void)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	if (geteuid () != 0)&lt;br /&gt;
	{&lt;br /&gt;
		fprintf (stderr, &amp;quot;prova1_gpio: Need to be root to run (sudo?)\n&amp;quot;) ;&lt;br /&gt;
		exit (0) ;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (wiringPiSetup () == -1)&lt;br /&gt;
		exit (1) ;&lt;br /&gt;
&lt;br /&gt;
	printf (&amp;quot;Setup ... &amp;quot;) ; &lt;br /&gt;
	fflush (stdout) ;&lt;br /&gt;
	//pinMode (0, OUTPUT) ;&lt;br /&gt;
	//digitalWrite (0, 0) ;&lt;br /&gt;
&lt;br /&gt;
 	pinMode (SENSOR_NIVELL, INPUT);&lt;br /&gt;
	pinMode (SENSOR_LDR, INPUT);&lt;br /&gt;
	pinMode (RELE1, OUTPUT);&lt;br /&gt;
	pinMode (RELE2, OUTPUT);&lt;br /&gt;
	pinMode (RELE3, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
	estat_nivell = digitalRead (SENSOR_NIVELL);&lt;br /&gt;
	printf(&amp;quot;Estat inicial del nivell: %d\n&amp;quot;, estat_nivell);&lt;br /&gt;
&lt;br /&gt;
	estat_ldr = digitalRead (SENSOR_LDR);&lt;br /&gt;
	printf(&amp;quot;Estat inicial del LDR: %d&amp;quot;, estat_ldr);&lt;br /&gt;
	if (estat_ldr == 0) {&lt;br /&gt;
                printf(&amp;quot; dia. apagar el vailet&amp;quot;);&lt;br /&gt;
        } else {&lt;br /&gt;
                printf(&amp;quot; nit. encendre el vailet&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void waitCanviEstat (void)&lt;br /&gt;
{&lt;br /&gt;
	if (digitalRead (SENSOR_NIVELL) != estat_nivell) {&lt;br /&gt;
		estat_nivell = !estat_nivell;&lt;br /&gt;
		printf(&amp;quot;Estat del nivell: %d\n&amp;quot;, estat_nivell);&lt;br /&gt;
&lt;br /&gt;
        	if (estat_nivell == 0) {&lt;br /&gt;
                        digitalWrite (RELE1, !estat_nivell);&lt;br /&gt;
                        delay(1000);&lt;br /&gt;
                        digitalWrite (RELE1, estat_nivell);&lt;br /&gt;
                } else {&lt;br /&gt;
                        digitalWrite (RELE2, estat_nivell);&lt;br /&gt;
                        delay(1000);&lt;br /&gt;
                        digitalWrite (RELE2, !estat_nivell);                        &lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	if (digitalRead (SENSOR_LDR) != estat_ldr) {&lt;br /&gt;
		estat_ldr = !estat_ldr;&lt;br /&gt;
		printf(&amp;quot;Estat del LDR: %d\n&amp;quot;, estat_ldr);&lt;br /&gt;
        	if (estat_ldr == 0) {&lt;br /&gt;
                        printf(&amp;quot; dia. apagar el vailet&amp;quot;);&lt;br /&gt;
                } else {&lt;br /&gt;
                        printf(&amp;quot; nit. encendre el vailet&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
		digitalWrite (RELE3,  estat_ldr);&lt;br /&gt;
	}&lt;br /&gt;
	delay(100);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
	setup () ;&lt;br /&gt;
	for (;;)&lt;br /&gt;
	{&lt;br /&gt;
		waitCanviEstat () ;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=versió 3=&lt;br /&gt;
En la versiò 2 volia posar tot junt el sensor de llum/vailet i el sensor de nivell/electrovàlvula. La conseqüència és que hi ha molta incompatibiltat electromagnètica de l'alternador del vailet que ha generat molta inestabilitat en la RPi (model B) i al final s'han cascat els pints d'E/S.&lt;br /&gt;
&lt;br /&gt;
Per tant, elimino tot el temap de sensor de llum/vailet i em centro amb el sensor de nivell per activar l'electrovàlvula. Ho faig amb una Raspberry Pi A+.&lt;br /&gt;
&lt;br /&gt;
'''NOTA'''. Aquest projecte, tal com ha quedat, seria ideal per fer-ho amb un microcontrolador. És a dir, no caldria fer-lo amb la RPi. En definitiva és un interruptor que activen dos relés. També es pot fer més barato amb la plataforma que està sortint: C.H.I.P (https://www.kickstarter.com/projects/1598272670/chip-the-worlds-first-9-computer), que per 9$ tens el micro i tots els pins GPIO, i no cal xarxa ni HDMI...&lt;br /&gt;
&lt;br /&gt;
En aquesta versió 3 he utilitzat dos relés DPDT (doble pol, double throw) que em pemeten tenir a la sortida els +12/-12V que buscava en la versió 2. Sense cap relé actiu la sortida en els bornes de l'electrovàlvula està flotant. Quan es tanca l'interruptor s'activa un relé apareix els +12V, i torno a obrir al cap d'un segon. Quan s'obre l'interruptor es tanca l'altre relé i apareixen els -12V, i es torna a obrir al cap d'un segon. Per tant, l'estat normal de l'electrovàlvula és que té els bornes flotant.&lt;br /&gt;
&lt;br /&gt;
Per testejar els +/-12V amb un tester doncs ho faig directament amb el tester. Ara bé, el que no es pot fer és connectar un dels bornes de l'electrovàlvula al terra comú (!). Mirar l'esquema, els bornes de l'electrovàlvula han d'estar flotant.&lt;br /&gt;
&lt;br /&gt;
'''NOTA'''. Una altra cosa que m'ha despistat és que fent proves amb la RPi és que en comptes d'utilitzar una font de 12V he utilitzat el pin 5V de la RPi (el pin 3 que també és de 12V). I en ficar el tester no m'apareixien els +/-12V.&lt;br /&gt;
&lt;br /&gt;
La idea és que el circuit de la RPi i els sensors sigui TOTALMENT INDEPENDENT de la font d'alimentació de 12V.&lt;br /&gt;
&lt;br /&gt;
'''rec_baga_v3.c'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// gcc -o rec_baga -Wall -I/usr/local/include -L/usr/local/lib rec_baga_v3.c -lwiringPi&lt;br /&gt;
// sudo ./rec_baga&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;wiringPi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//raspberry pi A+&lt;br /&gt;
//http://pi4j.com/pins/model-a-plus.html&lt;br /&gt;
#define    EV  1     //GPIO1, pin 12 del header&lt;br /&gt;
#define    RELE1    0 //GPIO0, pin 11 del header. electrovalvula&lt;br /&gt;
#define    RELE2    2 //GPIO2, pin 13 del header. electrovalvula&lt;br /&gt;
&lt;br /&gt;
int estat_ev;&lt;br /&gt;
&lt;br /&gt;
void setup (void)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    if (geteuid () != 0)&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        fprintf (stderr, &amp;quot;prova1_gpio: Need to be root to run (sudo?)\n&amp;quot;) ;&lt;br /&gt;
        exit (0) ;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (wiringPiSetup () == -1)&lt;br /&gt;
        exit (1) ;&lt;br /&gt;
&lt;br /&gt;
    printf (&amp;quot;Setup ... &amp;quot;) ;&lt;br /&gt;
    fflush (stdout) ;&lt;br /&gt;
&lt;br /&gt;
    pinMode (EV, INPUT);&lt;br /&gt;
    pinMode (RELE1, OUTPUT);&lt;br /&gt;
    pinMode (RELE2, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
    estat_ev = digitalRead (EV); //normalment l'interruptor està obert, i el valor que es llegeix és un 1&lt;br /&gt;
    printf(&amp;quot;Estat inicial de l'electrovalvula: %d\n&amp;quot;, estat_ev);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void waitCanviEstat (void)&lt;br /&gt;
{&lt;br /&gt;
    if (digitalRead (EV) != estat_ev) {&lt;br /&gt;
        estat_ev = !estat_ev;&lt;br /&gt;
        printf(&amp;quot;Estat de la electrovalvula: %d\n&amp;quot;, estat_ev);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (estat_ev == 0) {&lt;br /&gt;
            printf(&amp;quot;rele1\n&amp;quot;);&lt;br /&gt;
            digitalWrite (RELE1, !estat_ev);&lt;br /&gt;
            delay(1000);&lt;br /&gt;
            digitalWrite (RELE1, estat_ev);&lt;br /&gt;
            delay(1000);&lt;br /&gt;
        } else {&lt;br /&gt;
            printf(&amp;quot;rele2\n&amp;quot;); &lt;br /&gt;
            digitalWrite (RELE2, estat_ev);&lt;br /&gt;
            delay(1000);&lt;br /&gt;
            digitalWrite (RELE2, !estat_ev);&lt;br /&gt;
            delay(1000);                  &lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    delay(100);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
    setup () ;&lt;br /&gt;
    for (;;)&lt;br /&gt;
    {&lt;br /&gt;
        waitCanviEstat () ;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aprofitant aquest projecte també testejo l'interruptor del moneder (el del filferro), que funciona correctament.&lt;br /&gt;
'''moneder_v3.c''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// gcc -o moneder -Wall -I/usr/local/include -L/usr/local/lib moneder_v3.c -lwiringPi&lt;br /&gt;
// sudo ./moneder&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;wiringPi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//raspberry pi A+&lt;br /&gt;
//http://pi4j.com/pins/model-a-plus.html&lt;br /&gt;
#define    MONEDER  1     //GPIO1, pin 12 del header&lt;br /&gt;
#define    RELE1    2 //GPIO0, pin 11 del header. electrovalvula&lt;br /&gt;
#define    RELE2    3 //GPIO2, pin 13 del header. electrovalvula&lt;br /&gt;
&lt;br /&gt;
int estat_moneder;&lt;br /&gt;
&lt;br /&gt;
void setup (void)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    if (geteuid () != 0)&lt;br /&gt;
    {&lt;br /&gt;
        fprintf (stderr, &amp;quot;prova1_gpio: Need to be root to run (sudo?)\n&amp;quot;) ;&lt;br /&gt;
        exit (0) ;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (wiringPiSetup () == -1)&lt;br /&gt;
        exit (1) ;&lt;br /&gt;
&lt;br /&gt;
    printf (&amp;quot;Setup ... &amp;quot;) ;&lt;br /&gt;
    fflush (stdout) ;&lt;br /&gt;
&lt;br /&gt;
    pinMode (MONEDER, INPUT);&lt;br /&gt;
    pinMode (RELE1, OUTPUT);&lt;br /&gt;
    pinMode (RELE2, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
    estat_moneder = digitalRead (MONEDER); //normalment l'interruptor està obert, i el valor que es llegeix és un 1&lt;br /&gt;
    printf(&amp;quot;Estat inicial del moneder: %d\n&amp;quot;, estat_moneder);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void waitCanviEstat (void)&lt;br /&gt;
{&lt;br /&gt;
    if (digitalRead (MONEDER) != estat_moneder) {&lt;br /&gt;
        estat_moneder = !estat_moneder;&lt;br /&gt;
        printf(&amp;quot;Estat del moneder: %d\n&amp;quot;, estat_moneder);&lt;br /&gt;
&lt;br /&gt;
        digitalWrite (RELE1, 1);&lt;br /&gt;
        delay(1000);&lt;br /&gt;
        digitalWrite (RELE1, 0);&lt;br /&gt;
        delay(1000);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //delay(100);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
    setup () ;&lt;br /&gt;
    for (;;)&lt;br /&gt;
    {&lt;br /&gt;
        waitCanviEstat () ;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ara que ja tenim el sistema en funcionament, hem de millorar el software.&lt;br /&gt;
&lt;br /&gt;
'''rec_baga_v6.c''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// gcc -o rec_baga -Wall -I/usr/local/include -L/usr/local/lib rec_baga_v6.c -lwiringPi&lt;br /&gt;
// sudo ./rec_baga&lt;br /&gt;
// funcionament de l'electrovàlvula: http://www.infojardin.com/foro/showthread.php?t=17559&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;wiringPi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//raspberry pi A+&lt;br /&gt;
//http://pi4j.com/pins/model-a-plus.html&lt;br /&gt;
#define    EV  1     //GPIO1, pin 12 del header&lt;br /&gt;
#define    RELE1    0 //GPIO0, pin 11 del header. electrovalvula&lt;br /&gt;
#define    RELE2    2 //GPIO2, pin 13 del header. electrovalvula&lt;br /&gt;
&lt;br /&gt;
int estat_ev;&lt;br /&gt;
int regant;&lt;br /&gt;
int esperant;&lt;br /&gt;
int esperant2;&lt;br /&gt;
int comptador;&lt;br /&gt;
int comptador2;&lt;br /&gt;
&lt;br /&gt;
void setup (void)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    if (geteuid () != 0)&lt;br /&gt;
    {&lt;br /&gt;
        fprintf (stderr, &amp;quot;prova1_gpio: Need to be root to run (sudo?)\n&amp;quot;) ;&lt;br /&gt;
        exit (0) ;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (wiringPiSetup () == -1)&lt;br /&gt;
        exit (1) ;&lt;br /&gt;
&lt;br /&gt;
    printf (&amp;quot;Setup ... &amp;quot;) ;&lt;br /&gt;
    fflush (stdout) ;&lt;br /&gt;
&lt;br /&gt;
    pinMode (EV, INPUT);&lt;br /&gt;
    pinMode (RELE1, OUTPUT);&lt;br /&gt;
    pinMode (RELE2, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
    estat_ev = digitalRead (EV); //normalment l'interruptor està obert, i el valor que es llegeix és un 1&lt;br /&gt;
    printf(&amp;quot;Estat inicial de l'electrovalvula: %d\n&amp;quot;, estat_ev); &lt;br /&gt;
    printf(&amp;quot;en estat normal, boia a l'extrem,  ha de valdre 0\n&amp;quot;);&lt;br /&gt;
    regant = 0;&lt;br /&gt;
    esperant = 0;&lt;br /&gt;
    comptador = 0;&lt;br /&gt;
    comptador2 = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//en la posició normal del sensor de nivell (sense aigua) l'interruptor està tancar (R=0) i el pin EV=0&lt;br /&gt;
void waitCanviEstat (void)&lt;br /&gt;
{&lt;br /&gt;
    //arriba aigua al sensor de nivell, s'obre el sensor (R=inf) i s'ha d'obrir la vàlvula&lt;br /&gt;
    if ( (digitalRead(EV)==1) &amp;amp;&amp;amp; (regant==0) ) {&lt;br /&gt;
        digitalWrite (RELE1, 1);&lt;br /&gt;
        printf(&amp;quot;rele1\n&amp;quot;);&lt;br /&gt;
        delay(5000);&lt;br /&gt;
        digitalWrite (RELE1, 0);&lt;br /&gt;
        delay(5000);&lt;br /&gt;
        //i ara està passant aigua... Però això s'ha de comprovar tres vegades cada 5 min.    &lt;br /&gt;
        regant = 1;&lt;br /&gt;
        esperant = 1;&lt;br /&gt;
        esperant2 = 1; //estic regant&lt;br /&gt;
        comptador = 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if ((regant == 1) &amp;amp;&amp;amp; (esperant == 1)) {&lt;br /&gt;
        if (comptador == 60) { //25 min: 60. test: 3&lt;br /&gt;
            printf(&amp;quot;hem arribat als 25min\n&amp;quot;);&lt;br /&gt;
            comptador = 0;&lt;br /&gt;
            esperant = 0;&lt;br /&gt;
        } else {&lt;br /&gt;
            comptador++;&lt;br /&gt;
            printf(&amp;quot;rele1*\n&amp;quot;);&lt;br /&gt;
            digitalWrite (RELE1, 1);&lt;br /&gt;
            delay(20000);&lt;br /&gt;
            digitalWrite (RELE1, 0);&lt;br /&gt;
            delay (5000);    &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
     &lt;br /&gt;
&lt;br /&gt;
    if (esperant2 == 1) {&lt;br /&gt;
        if (comptador2 &amp;lt;= 1440) { //4 hores: 1440. test: 15&lt;br /&gt;
            delay (5000);&lt;br /&gt;
            comptador2++;&lt;br /&gt;
        } else { //s'ha omplert els dipòsits durant una hora i mitja, i ja podem tancar&lt;br /&gt;
            printf(&amp;quot;ja han passat 4 hores\n&amp;quot;);&lt;br /&gt;
            printf(&amp;quot;rele2\n&amp;quot;);&lt;br /&gt;
            digitalWrite (RELE2, 1);&lt;br /&gt;
            delay (5000);&lt;br /&gt;
            digitalWrite (RELE2, 0);&lt;br /&gt;
            delay (5000);&lt;br /&gt;
            //ja no rego. Torno a començar el procés.&lt;br /&gt;
            regant = 0;&lt;br /&gt;
            esperant = 0;&lt;br /&gt;
            esperant2 = 0;&lt;br /&gt;
            comptador = 0;&lt;br /&gt;
            comptador2 = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    delay (100);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
    setup () ;&lt;br /&gt;
    for (;;)&lt;br /&gt;
    {&lt;br /&gt;
        waitCanviEstat () ;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
En aquesta versió del hardware el vailet està totalment separat a nivell electrònic, però comparteixen la mateixa capsa. Sembla ser que l'alternador del vailet ha espatllat la RPi A+ (TBD). Més motiu per fer una nova versió de hardware feta amb microcontrolador, no pas a amb la RPi.&lt;br /&gt;
&lt;br /&gt;
=Versió 4 de hardware (ATMEGA168)=&lt;br /&gt;
la versió 3 funcionava correctament. Ara bé, si he utilitzat la RPi (finalment una A+) és perquè últimament estava desenvolupant i programant la RPi i fent interfaces amb els pins GPIO. Però si ens posem a pensar amb perspectiva, és ''massa'' hardware per al projecte que es vol realitzar. El millor és utilitzar directament un microcontrolador com el ATMega168 que ja havia utilitzat. És millor econòmicament i com a solució tècnica. És al cap i a la fi com utilitzar un Arduino però sense l'arduino, fent una placa a mida de les necessitats, i gravant el software al microcontrolador). Ja havia fet un projecte amb el ATMega168 en la primera versió de la màquina de marcianitos, quan vaig fer una interface USB per fer un gamepad, i en aquell cas ja vaig documentar de com es grava el xip (sense el cable FTDI).&lt;br /&gt;
&lt;br /&gt;
Al cap i a la fi en aquest projecte tenim un interruptor d'entrada i dos pins de sortida que han d'habilitar dos relés.&lt;br /&gt;
&lt;br /&gt;
Fent un resum de diversos projectes basats en ATMega168 la configuració bàsica per fer començar a funcionar un petit projecte amb el ATMega168 (AVR):&lt;br /&gt;
ATMega168 pin mapping:&lt;br /&gt;
*http://www.arduino.cc/en/uploads/Hacking/Atmega168PinMap2.png&lt;br /&gt;
&lt;br /&gt;
*Entre Vcc i GND hi ha un electrolític de 0.1uF (hi ha d'altres possibilitats, com per exemple http://ba.protostack.com/2011/03/customer_clock_02_lrg.jpg). Una altra possibilitat és que sigui un ceràmic de 100nF. Però sembla ser que és important és que aquest condensador estigui a la vora dels pins Vcc i GND.&lt;br /&gt;
*AVcc va a Vcc. Aref pot anar a Vcc (https://petrockblog.files.wordpress.com/2012/07/wpid-photo-02-07-2012-0915.jpg)&lt;br /&gt;
*botó reset amb una resistència de 10K. Per veure com es connecta el reset, per exemple: http://s55.photobucket.com/user/icecreamterror/media/atmega8_schematiccopy-1.jpg.html. Si no es vol utilitzar un botó de reset el pin de reset ha d'anar connectat a Vcc a través d'una resistència com es veu a https://electrosome.com/wp-content/uploads/2013/05/Blinking-LED-using-Atmega32-AVR-Microcontroller-and-Atmel-Studio.jpg&lt;br /&gt;
*cristall de 16MHz i dos condensadors de 22-27-33pF&lt;br /&gt;
*La font d'alimentació ha de ser de 5V regulada. Moltes vegades es fa servir un 78L05. (Es pot connectar directament a un carregador de mòbil? És regulada?)&lt;br /&gt;
*Si en el pin de sortida vull connectar un led, s'ha de fer amb una resistència de 680 ohm connectada a terra (tal com es veu a https://electrosome.com/wp-content/uploads/2013/05/Blinking-LED-using-Atmega32-AVR-Microcontroller-and-Atmel-Studio.jpg)&lt;br /&gt;
*Per connectar un botó és tan fàcil com ficar el botó del pin a terra (doncs hi ha una resistència interna de pull-up que fa que el pin normalment està a 1 quan es configura el pin com a entrada) (tal com es mostra a: http://www.bristolwatch.com/arduino/img/arduino_ds1307.gif, http://d32zx1or0t1x0y.cloudfront.net/2009/08/atmega8_breadboard_24_lrg.jpg, http://ba.protostack.com/2011/03/customer_clock_02_lrg.jpg). Però també hi ha gent que fica resistències externes de pull-up i pull-down com faig amb els botons connectats a GPIO a la RPi (http://www.circuitstoday.com/wp-content/uploads/2012/02/Circuit1.jpg&lt;br /&gt;
*si vull un led que m'indiqui que el circuit està alimentat, fico un ressitència de 1K i un LED entre Vcc i GND (http://ba.protostack.com/2011/03/customer_clock_02_lrg.jpg)&lt;br /&gt;
&lt;br /&gt;
Un cop tenim dissenyat en el Eagle CadSoft el citcuit bàsic del ATmel168 (que ens pot servir de plantilla), ara només cal fer la interfície de l'interruptor del sensor de nivell, i els dos relés. Per cercar esquemes de com es connecten al ATmel168, en el Google no he de cercar per Atmel168 sinó que buscaré per Arduino, i així obtinc molts més exemples.&lt;br /&gt;
&lt;br /&gt;
El botó el connecto el puc connectar amb la configuració ''normalment a 1'' (que utilitza la resistència interna de pull-up i no cal cap resistència externa):&lt;br /&gt;
*http://hackaday.com/2010/11/19/avr-programming-04-writing-code-etc/&lt;br /&gt;
o bé ''normalment a 0'' (que utlitza una resistència externa):&lt;br /&gt;
*http://www.arduino.cc/en/Tutorial/Button&lt;br /&gt;
&lt;br /&gt;
En el cas de connectar un relé sí que hi ha una diferència important amb la RPi. El Atmel168 té en els pins de sortida 5V que poden ''drive'' directament el relé. Per tant, no cal l'amplificació dels transistor que feia amb els pins GPIO.&lt;br /&gt;
==software==&lt;br /&gt;
Un bon tutorial introductori:&lt;br /&gt;
*http://hackaday.com/2010/10/23/avr-programming-introduction/&lt;br /&gt;
En el projecte de la interface USB d'un gamepad ja vaig programar codi escrit amb C per als microcontroladors ATMEL, i tinc el programador. Amb la qual cosa ja tinc les eines i els coneixements per compilar, només cal repassar amb aquest tutorial els coneptes específics del microcontrolador (rellotge, etc).&lt;br /&gt;
&lt;br /&gt;
Finalment ja sé fer pampallugues d'un LED controlat amb un switch:&lt;br /&gt;
*Atmel_ISP_MCU_programmer_ATmega._Programador_AVR_USBasp#Blink_LED&lt;br /&gt;
&lt;br /&gt;
i ja puc migrar la v6 (software) basada en RPi A+, a la v7 (software) amb codi nadiu per a microcontrolador ATMega168.&lt;br /&gt;
&lt;br /&gt;
'''rec_baga_v7.c''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
ATMEGA168&lt;br /&gt;
fuses:&lt;br /&gt;
sudo avrdude -b19200 -P usb -c usbasp -p m168 -U lfuse:w:0xE2:m -U hfuse:w:0xDF:m&lt;br /&gt;
&lt;br /&gt;
avr-gcc -g -mmcu=atmega168 -c rec_baga_v7.c -Wa,-alh,-L -Os -o rec_baga_v7.o &amp;gt; rec_baga_v7.asm&lt;br /&gt;
avr-gcc -g -mmcu=atmega168 -Wl,-Map,rec_baga_v7.map -o rec_baga_v7.elf rec_baga_v7.o&lt;br /&gt;
avr-objdump -h -S rec_baga_v7.elf &amp;gt; rec_baga_v7.lst&lt;br /&gt;
avr-objcopy -j .text -j .data -O ihex rec_baga_v7.elf rec_baga_v7.hex&lt;br /&gt;
avr-size rec_baga_v7.elf&lt;br /&gt;
cat rec_baga_v7.hex&lt;br /&gt;
ja podem programar el xip:&lt;br /&gt;
sudo avrdude -b19200 -P usb -c usbasp -p m168 -U flash:w:rec_baga_v7.hex&lt;br /&gt;
&lt;br /&gt;
// funcionament de l'electrovàlvula: http://www.infojardin.com/foro/showthread.php?t=17559&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
   #define F_CPU 8000000UL //el rellotge intern va a 8MHz&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int estat_ev;&lt;br /&gt;
int regant;&lt;br /&gt;
int esperant;&lt;br /&gt;
int esperant2;&lt;br /&gt;
int comptador;&lt;br /&gt;
int comptador2;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	//setup del microcontrolador&lt;br /&gt;
	DDRD &amp;amp;= ~(1&amp;lt;&amp;lt;PD2); //Interruptor sensor de nivell. Tercer pin del PORTD as Input&lt;br /&gt;
	PORTD |= (1 &amp;lt;&amp;lt; PD2);       // Enable pull-up for switch on PORTD bit &lt;br /&gt;
	DDRD |= (1&amp;lt;&amp;lt;PD3); //RELE1. Quart pin del PORTD as Output&lt;br /&gt;
	DDRD |= (1&amp;lt;&amp;lt;PD4); //RELE2. Cinquè pin del PORTD as Output&lt;br /&gt;
&lt;br /&gt;
	//valors inicials&lt;br /&gt;
    regant = 0;&lt;br /&gt;
    esperant = 0;&lt;br /&gt;
    comptador = 0;&lt;br /&gt;
    comptador2 = 0;&lt;br /&gt;
&lt;br /&gt;
	delay(1000);&lt;br /&gt;
&lt;br /&gt;
	while(1) //infinite loop&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	    //arriba aigua al sensor de nivell, s'obre el sensor (R=inf), i el pin valdrà 1. S'ha d'obrir la vàlvula&lt;br /&gt;
	    if ( ((PIND &amp;amp; (1&amp;lt;&amp;lt;PIND2)) == 1) &amp;amp;&amp;amp; (regant==0) ) {&lt;br /&gt;
	        PORTD |= (1&amp;lt;&amp;lt;PD3); //RELE1 ON&lt;br /&gt;
	        delay(1000); //5000&lt;br /&gt;
	        PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;PD3); //RELE1 OFF&lt;br /&gt;
	        delay(1000); //5000&lt;br /&gt;
	        //i ara està passant aigua... Però això s'ha de comprovar tres vegades cada 5 min.    &lt;br /&gt;
	        regant = 1;&lt;br /&gt;
	        esperant = 1;&lt;br /&gt;
	        esperant2 = 1; //estic regant&lt;br /&gt;
	        comptador = 0;&lt;br /&gt;
	    }&lt;br /&gt;
&lt;br /&gt;
	    if ((regant == 1) &amp;amp;&amp;amp; (esperant == 1)) {&lt;br /&gt;
	        if (comptador == 3) { //25 min: 60. test: 3&lt;br /&gt;
	            //hem arribat als 25min&lt;br /&gt;
	            comptador = 0;&lt;br /&gt;
	            esperant = 0;&lt;br /&gt;
	        } else {&lt;br /&gt;
	            comptador++;&lt;br /&gt;
	        	PORTD |= (1&amp;lt;&amp;lt;PD3); //RELE1 ON&lt;br /&gt;
		        delay(5000); //20000&lt;br /&gt;
		        PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;PD3); //RELE1 OFF&lt;br /&gt;
		        delay(1000); //5000  &lt;br /&gt;
	        }&lt;br /&gt;
	    }&lt;br /&gt;
&lt;br /&gt;
	    if (esperant2 == 1) {&lt;br /&gt;
	        if (comptador2 &amp;lt;= 15) { //4 hores: 1440. test: 15&lt;br /&gt;
	            delay (1000); //5000&lt;br /&gt;
	            comptador2++;&lt;br /&gt;
	        } else { //s'ha omplert els dipòsits durant una hora i mitja, i ja podem tancar&lt;br /&gt;
	            //ja han passat 4 hores&lt;br /&gt;
		        PORTD |= (1&amp;lt;&amp;lt;PD4); //RELE2 ON&lt;br /&gt;
		        delay(1000); //5000&lt;br /&gt;
		        PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;PD4); //RELE2 OFF&lt;br /&gt;
		        delay(1000); //5000&lt;br /&gt;
	            //ja no rego. Torno a començar el procés.&lt;br /&gt;
	            regant = 0;&lt;br /&gt;
	            esperant = 0;&lt;br /&gt;
	            esperant2 = 0;&lt;br /&gt;
	            comptador = 0;&lt;br /&gt;
	            comptador2 = 0;&lt;br /&gt;
	        }&lt;br /&gt;
	    }&lt;br /&gt;
&lt;br /&gt;
		delay (100);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Autor}}, febrer 2015, juny 2015&lt;/div&gt;</summary>
		<author><name>Joan</name></author>
		
	</entry>
</feed>