Go Down

Topic: Partage de projet de gestion radiateur (Read 878 times) previous topic - next topic

Stef84

Mar 23, 2012, 11:09 pm Last Edit: Mar 23, 2012, 11:12 pm by Stef84 Reason: 1
Bonsoir,
à près avoir posé plein de question, et avoir eu des réponses
je partage mon projet, si ça peut donner des idées à quelqu un

le matos :
un ulcd32pt
une 2560
un protoshield avec un ds32hz et ds1307
des db18b20
du câble reseau
une carte relais kmtronic

et mon code quasi fini :
Quote

#include "proxySerial.h"
#include "Serial_LCD.h"
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <DS1307new.h>

// test release
#if SERIAL_LCD_RELEASE < 118
#error required SERIAL_LCD_RELEASE 118
#endif

ProxySerial myPort(&Serial3);


Serial_LCD myLCD( &myPort);

uint8_t aa;

uint16_t startAddr = 0x0000;            // Start address to store in the NV-RAM
uint16_t lastAddr;                      // new address for storing in NV-RAM
uint16_t TimeIsSet = 0xaa55;

//Définition pin de sortie
/*
Digital 5 = relais 1 = Cuisine
Digital 6 = relais 2 = Tom
Digital 4 = relais 3 = Bureau
Digital 3 = relais 4 = Chambre
Digital 2 = relais 5 = SAM
Digital 7 = relais 6 = SAM1
Digital 8 = relais 7 = Entree
Digital 9 = relais 8 = --
*/

int PinCuisine = 5;
int PinTom = 6;
int PinBureau = 4;
int PinChambre = 3;
int PinSalle = 2;
int PinSalle1 = 7;
int PinEntree = 8;

// Définition pin entrée digital Dallas
#define ONE_WIRE_BUS 36

// Définition communication avec tout matériel Onewire
OneWire oneWire(ONE_WIRE_BUS);

// Référence t° Dallas
DallasTemperature sensors(&oneWire);
// uint8_t T1[8] = { 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x }; // Sonde Cuisine
uint8_t T2[8] = { 0x28, 0x4, 0x49, 0xBB, 0x3, 0x0, 0x0, 0x39 }; // Sonde Tom
uint8_t T3[8] = { 0x28, 0x62, 0xEE, 0x74, 0x3, 0x0, 0x0, 0x89 }; // Sonde Bureau
uint8_t T4[8] = { 0x28, 0xDE, 0x2, 0x75, 0x3, 0x0, 0x0, 0x87 }; // Sonde Chambre
uint8_t T5[8] = { 0x28, 0x89, 0x23, 0x63, 0x3, 0x0, 0x0, 0x28 }; // Sonde SAM
// uint8_t T6[8] = { 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x }; // Entree
// uint8_t T8[8] = { 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x }; // Sonde Arduino

// capteur t°
float sensorCuisine;
float sensorTom;
float sensorBureau;
float sensorChambre;
float sensorSalle;
float sensorEntree;
float sensorArduino;
float sensordefault=-127.00;

// Nuit_Jour Temp et delta
float Temp1Nuit=18.00;  // cuisine
float Temp1Jour=20.00;
float Temp2Nuit=18.00;  // Tom
float Temp2Jour=20.00;
float Temp3Nuit=18.00;  // Bureau
float Temp3Jour=20.00;
float Temp4Nuit=18.00;  // Chambre
float Temp4Jour=20.00;
float Temp5Nuit=18.00;  // SAM
float Temp5Jour=20.00;
float Temp6Nuit=18.00;  // Entrée
float Temp6Jour=20.00;
float DeltaJ=0.5;
float DeltaN=1.0;

// Divers
//String s;
int Menu=1;
int MAJH;
int ligne;
int valid;
long TBas;
long THaut;
char buffer[8];

//balise
int MClear=0;
int CuisineAnnule=0;
int TomAnnule=0;
int BureauAnnule=0;
int ChambreAnnule=0;
int SAMAnnule=0;
int EntreeAnnule=0;
int Annule=0;
int RouteCuisine=0;
int RouteTom=0;
int RouteBureau=0;
int RouteChambre=0;
int RouteSAM=0;
int RouteEntree=0;
int TCuisine=0;
int TTom=0;
int TBureau=0;
int TChambre=0;
int TSAM=0;
int TEntree=0;

// Gestion heure
int heure;
int minutes;
int secondes;
long current;
char* jour;
int date=10;
int mois;
int annee;

// basculement heure/nuit
long heureN=72000L;  // 20h
long heureJ=19800L; //5 h30

// remise en route des radiateurs après arrêt
long currentCuisine;
long currentTom;
long currentBureau;
long currentChambre;
long currentSAM;
long currentEntree;
long Remiseenroute=30L;

uint8_t c;

void setup() {
 Serial.begin(19200);
 Serial.print("\n\n\n***\n");
 Serial.print("avr\n");
 Serial3.begin(9600);

 myLCD.begin();

delay(100);  
 myLCD.initSD();
 
delay(100);
// myLCD.checkSD();
 
delay(100);

myLCD.setFontSolid(1);
delay(100);  

Serial.print("\n setTouch \t");
aa=myLCD.setTouch(true);
Serial.print(aa, DEC);
Serial.print("\n ");


pinMode(PinCuisine, OUTPUT);
pinMode(PinTom, OUTPUT);
pinMode(PinBureau, OUTPUT);
pinMode(PinChambre, OUTPUT);
pinMode(PinSalle, OUTPUT);
pinMode(PinSalle1, OUTPUT);
pinMode(PinEntree, OUTPUT);

RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));
RTC.getTime();
RTC.ctrl = 0x00;                      // 0x00=disable SQW pin, 0x10=1Hz,
RTC.setCTRL();
myLCD.setFont(02);
delay(100);

}  

uint16_t x, y;
uint8_t b;

void loop() {
myLCD.setFont(02);
delay(50);

c=myLCD.getTouchActivity();

//affichage menu
myLCD.readScreenFAT("Menu.gci", 0, 0);
 
// envoie de commande de récupération
RTC.getTime();
sensors.requestTemperatures();

// Récuperation/Affichage Heure
date=RTC.day;
mois=RTC.month;
annee=RTC.year;
heure = RTC.hour;
minutes = RTC.minute;
secondes = RTC.second;

//calcul temps en seconde
current=(((long)RTC.hour*3600L)+((long)RTC.minute*60L)+(long)RTC.second);

//affichage jour
 switch (RTC.dow)                      
 {
   case 1:
     jour=("Lundi   ");
     break;
   case 2:
     jour=("Mardi   ");
     break;
   case 3:
     jour=("Mercredi");
     break;
   case 4:
     jour=("Jeudi   ");
     break;
   case 5:
     jour=("Vendredi");
     break;
   case 6:
     jour=("Samedi  ");
     break;
   case 0:
     jour=("Dimanche");
     break;
 }
 
// affichage date/heure
myLCD.gText(55, 15, Serial_LCD::rgb16(254, 254, 1), jour);


 if (RTC.day < 10)
 {
 myLCD.gText(126, 15, Serial_LCD::rgb16(254, 254, 1), "0");
 myLCD.gText(134, 15, Serial_LCD::rgb16(254, 254, 1), (date));
 }
 else
 {
 myLCD.gText(126, 15, Serial_LCD::rgb16(254, 254, 1), (date));
 }
 

 myLCD.gText(143, 15, Serial_LCD::rgb16(254, 254, 1), "/");
 

 if (RTC.month < 10)
 {
 myLCD.gText(152, 15, Serial_LCD::rgb16(254, 254, 1), "0");
 myLCD.gText(160, 15, Serial_LCD::rgb16(254, 254, 1), (mois));
 }
 else
 {
 myLCD.gText(152, 15, Serial_LCD::rgb16(254, 254, 1), (mois));
 }

 myLCD.gText(169, 15, Serial_LCD::rgb16(254, 254, 1), "/");


myLCD.gText(178, 15, Serial_LCD::rgb16(254, 254, 1), (annee));

 if (RTC.hour < 10)                    
 {
 myLCD.gText(247, 15, Serial_LCD::rgb16(254, 254, 1), "0");
 myLCD.gText(255, 15, Serial_LCD::rgb16(254, 254, 1), (heure));
 }
 else
 {
 myLCD.gText(247, 15, Serial_LCD::rgb16(254, 254, 1), (heure));
 }
 

myLCD.gText(262, 15, Serial_LCD::rgb16(254, 254, 1), ":");


 if (RTC.minute < 10)                  
 {
 myLCD.gText(271, 15, Serial_LCD::rgb16(254, 254, 1), "0");
 myLCD.gText(279, 15, Serial_LCD::rgb16(254, 254, 1), (minutes));
 }
 else
 {
 myLCD.gText(271, 15, Serial_LCD::rgb16(254, 254, 1), (minutes));
 }


myLCD.gText(286, 15, Serial_LCD::rgb16(254, 254, 1), ":");


 if (RTC.second < 10)
 {
 myLCD.gText(295, 15, Serial_LCD::rgb16(254, 254, 1), "0");
 myLCD.gText(303, 15, Serial_LCD::rgb16(254, 254, 1), (secondes));
 }
 else
 {
myLCD.gText(295, 15, Serial_LCD::rgb16(254, 254, 1), (secondes));
 }
 
// Gestion/Récuperation/Affichage Temp

//sensorCuisine = sensors.getTempC(T1);
sensorTom = sensors.getTempC(T2);
sensorBureau = sensors.getTempC(T3);
sensorChambre = sensors.getTempC(T4);
sensorSalle = sensors.getTempC(T5);
//sensorEntree = sensors.getTempC(T6);
//sensorArduino = sensors.getTempC(T8);



   


il sera mis a jour quand j aurai fini, les possibilités de mise a jour à travers l écran
je rappelle que je suis débutant, donc il n est pas forcément optimisé mais fonctionnel

Stef84

la suite

Quote
if ((heureJ<current) && (current<heureN)) {
 
    myLCD.gText(58, 38, Serial_LCD::rgb16(254, 254, 1), "J");
                                                                                                        // pour créer une espèce de délestage
    if (((Temp2Jour-DeltaJ)>(sensorTom)) && ((sensorTom) != sensordefault) && (TomAnnule == Annule) && (RouteCuisine==0) && (RouteBureau==0) && (RouteChambre==0) && (RouteSAM==0) && (RouteEntree==0))
        {
        TTom=1;  // pour afficher thermometre chaud
        digitalWrite(PinTom, HIGH);
        (RouteTom=1); // pour indiquer que le radiateur est en route
        }


    if ((sensorTom) > (Temp2Jour))
      {
        TTom=0; // pour afficher thermometre froid
        digitalWrite(PinTom, LOW);
        (RouteTom=0); // pour indiquer que le radiateur est en arrêté
      }
     

     
   if (((Temp3Jour-DeltaJ) > (sensorBureau)) && ((sensorBureau) != sensordefault)  && (BureauAnnule == Annule) && (RouteCuisine==0) && (RouteTom==0) && (RouteChambre==0) && (RouteSAM==0) && (RouteEntree==0))
        {
        TBureau=1;
        digitalWrite(PinBureau, HIGH);
        (RouteBureau=1);
      }
     
   
   if ((sensorBureau) > (Temp3Jour))
      {
        TBureau=0;
        digitalWrite(PinBureau, LOW);
        (RouteBureau=0);
      }
     
   
     
   if (((Temp4Jour-DeltaJ)>(sensorChambre)) && ((sensorChambre) != sensordefault) && (ChambreAnnule == Annule) && (RouteCuisine==0) && (RouteTom==0) && (RouteBureau==0) && (RouteSAM==0) && (RouteEntree==0))
      {
        TChambre=1;
        digitalWrite(PinChambre, HIGH);
        (RouteChambre=1);
      }


   if ((sensorChambre) > (Temp4Jour))
      {
        TChambre=0;
        digitalWrite(PinChambre, LOW);
      (RouteChambre=0);
      }

   
   if (((Temp5Jour-DeltaJ)>(sensorSalle))&& ((sensorSalle) != sensordefault) && (SAMAnnule == Annule) && (RouteCuisine==0) && (RouteTom==0) && (RouteBureau==0) && (RouteChambre==0) && (RouteEntree==0))
           {
          TSAM=1;
          digitalWrite(PinSalle, HIGH);
          digitalWrite(PinSalle1, HIGH);
          (RouteSAM=1);
          }

    if ((sensorSalle) > (Temp5Jour))
          {
          TSAM=0;
          digitalWrite(PinSalle, LOW);
          digitalWrite(PinSalle1, LOW);
          (RouteSAM=0);
          }

}

else {
 
    myLCD.gText(58, 38, Serial_LCD::rgb16(254, 254, 1), "N");
   
    if (((Temp2Nuit-DeltaN)>(sensorTom)) && ((sensorTom) != sensordefault) && (TomAnnule == Annule) && (RouteCuisine==0) && (RouteBureau==0) && (RouteChambre==0) && (RouteSAM==0) && (RouteEntree==0))
      {
       TTom=1;
        digitalWrite(PinTom, HIGH);
        (RouteTom=1);
      }

   if ((sensorTom) > (Temp2Nuit))
      {
        TTom=0;
        digitalWrite(PinTom, LOW);
        (RouteTom=0);
      }


   if (((Temp3Nuit-DeltaN)>(sensorBureau)) && ((sensorBureau) != sensordefault)  && (BureauAnnule == Annule) && (RouteCuisine==0) && (RouteTom==0) && (RouteChambre==0) && (RouteSAM==0) && (RouteEntree==0))   
       {
        TBureau=1;
        digitalWrite(PinBureau, HIGH);
        (RouteBureau=1);
      }

   if ((sensorBureau) > (Temp3Nuit))
      {
        TBureau=0;
        digitalWrite(PinBureau, LOW);
        (RouteBureau=0);
      }
     
     
   if (((Temp4Nuit-DeltaN) > (sensorChambre)) && ((sensorChambre) != sensordefault) && (ChambreAnnule == Annule) && (RouteCuisine==0) && (RouteTom==0) && (RouteBureau==0) && (RouteSAM==0) && (RouteEntree==0)) 
       {
        TChambre=1;
        digitalWrite(PinChambre, HIGH);
        (RouteChambre=1);
      }
 
   if ((sensorChambre) > (Temp4Nuit))
      {
        TChambre=0;
        digitalWrite(PinChambre, LOW);
        (RouteChambre=0);
      }


     
   if (((Temp5Nuit-DeltaN)>(sensorSalle)) && ((sensorSalle) != sensordefault) && (SAMAnnule == Annule) && (RouteCuisine==0) && (RouteTom==0) && (RouteBureau==0) && (RouteChambre==0) && (RouteEntree==0))
      {
        TSAM=1;
        digitalWrite(PinSalle, HIGH);
        digitalWrite(PinSalle1, HIGH);
        (RouteSAM=1);
      }

   if ((sensorSalle) > (Temp5Nuit))
      {
        TSAM=0;
        digitalWrite(PinSalle, LOW);
        digitalWrite(PinSalle1, LOW);
        (RouteSAM=0);
      }

  }
//---------------------------------------------------------------------------------

if ((c==1) || (c==3))
{
 
myLCD.getTouchXY(x, y);

  if ((x>0 && x<30) && (y>0 && y<39)) // Affichage Menu
          {
        myLCD.clear();
        Menu=1;
        myLCD.readScreenFAT("Menu.gci", 0, 0);
        MClear=1;
          }
 
   if ((x>0 && x<30) && (y>157 && y<196)) // Affichage Setup
          {
        myLCD.clear();
        Menu=2;
        myLCD.readScreenFAT("Setup.gci", 39, 34);
        MClear=1;
          }
         
     if ((x>0 && x<30) && (y>201 && y<240)) // Affichage About
          {
        myLCD.clear();
        myLCD.setFont(0);
        myLCD.gText(130, 85, Serial_LCD::rgb16(254, 254, 1), "Controleur Radiateur");
        myLCD.gText(100, 95, Serial_LCD::rgb16(254, 254, 1), "Developpe par Stephane EMLINGER");
          }
     
     if (((x>55 && x<140) && (y>35 && y<133)) && (Menu==1)) // met en route/arrete radiateur par ecran tactile
          {
           if (CuisineAnnule==0)
          {
          (CuisineAnnule=1);
          currentCuisine=(current+(Remiseenroute*60L));
              if(digitalRead(PinCuisine) == HIGH)
              {
              digitalWrite(PinCuisine, LOW);
              (RouteCuisine=0);
              }
          }
           else
          {
          MClear=1;
          (CuisineAnnule=0);
          }     
         
        }


      if (((x>140 && x<225) && (y>35 && y<133)) && (Menu==1)) // met en route/arrete radiateur
         {
          if (TomAnnule==0)
         {
         (TomAnnule=1);
         currentTom=(current+(Remiseenroute*60L));
              if(digitalRead(PinTom) == HIGH)
              {
              digitalWrite(PinTom, LOW);
              (RouteTom=0);
              }
         }
         else
         {
         MClear=1;
         (TomAnnule=0);
         }         
      }

      if (((x>225 && x<310) && (y>35 && y<133)) && (Menu==1)) // met en route/arrete radiateur
         {
          if (BureauAnnule==0)
         {
         (BureauAnnule=1);
         currentBureau=(current+(Remiseenroute*60L));
              if(digitalRead(PinBureau) == HIGH)
              {
              digitalWrite(PinBureau, LOW);
              (RouteBureau=0);
              }         
         }
         else
         {
         MClear=1;
         (BureauAnnule=0);
         }         
      }

      if (((x>55 && x<140) && (y>133 && y<230)) && (Menu==1)) // met en route/arrete radiateur
         {
          if (ChambreAnnule==0)
         {
         (ChambreAnnule=1);
         currentChambre=(current+(Remiseenroute*60L));
              if(digitalRead(PinChambre) == HIGH)
              {
              digitalWrite(PinChambre, LOW);
              (RouteChambre=0);
              }           
         }
         else
         {
         MClear=1;
         (ChambreAnnule=0);
         }         
      }

      if (((x>140 && x<225) && (y>133 && y<230)) && (Menu==1)) // met en route/arrete radiateur
         {
          if (SAMAnnule==0)
         {
         (SAMAnnule=1);
         currentSAM=(current+(Remiseenroute*60L));
              if (digitalRead(PinSalle) == HIGH)
              {
              digitalWrite(PinSalle, LOW);
              digitalWrite(PinSalle1, LOW);
              (RouteSAM=0);
              }           
         }
         else
         {
         MClear=1;
         (SAMAnnule=0);
         }         
      }

Stef84

la fin

Quote
if (((x>225 && x<310) && (y>133 && y<230)) && (Menu==1)) // met en route/arrete radiateur
         {
          if (EntreeAnnule==0)
         {
         (EntreeAnnule=1);
         currentEntree=(current+(Remiseenroute*60L));
              if(digitalRead(PinEntree) == HIGH)
              {
              digitalWrite(PinEntree, LOW);
              (RouteEntree=0);
              }           
         }
         else
         {
         MClear=1;
         (EntreeAnnule=0);
         }         
      }     


       
}
//-----------------------------------------------------------------------------------   

switch (Menu)
{
case 1: {
  if (MClear==1)
  {
  myLCD.clear();
  MClear=0;
  }
 
    myLCD.line(55, 35, 55, 230, Serial_LCD::rgb16(254, 254, 1));
    myLCD.line(310, 35, 310, 230, Serial_LCD::rgb16(254, 254, 1));
    myLCD.line(55, 35, 310, 35, Serial_LCD::rgb16(254, 254, 1));
    myLCD.line(55, 230, 310, 230, Serial_LCD::rgb16(254, 254, 1));
    myLCD.line(55, 133, 310, 133, Serial_LCD::rgb16(254, 254, 1));
    myLCD.line(140, 35, 140, 230, Serial_LCD::rgb16(254, 254, 1));
    myLCD.line(225, 35, 225, 230, Serial_LCD::rgb16(254, 254, 1));
   
    if ((CuisineAnnule==1) && (currentCuisine>current)) // remet en route le radiateur au bout de 30 min quelque soit l option
    {
    myLCD.readScreenFAT("Interdit.gci", 56, 36);
    }
    else
    {
    memset(buffer, 0, 8 * sizeof(char));
    dtostrf(sensorCuisine, 6, 2, buffer);
    myLCD.gText(75, 105, Serial_LCD::rgb16(254, 254, 1),  buffer);
    }     

    if ((TomAnnule==1) && (currentTom>current))
    {
    myLCD.readScreenFAT("Interdit.gci", 141, 36);
    }
    else
    {
    memset(buffer, 0, 8 * sizeof(char));
    dtostrf(sensorTom, 6, 2, buffer);
    myLCD.gText(163, 105, Serial_LCD::rgb16(254, 254, 1), buffer);
    }
   
    if ((BureauAnnule==1) && (currentBureau>current))
    {
    myLCD.readScreenFAT("Interdit.gci", 226, 36);   
    }
    else
    {
    memset(buffer, 0, 8 * sizeof(char));
    dtostrf(sensorBureau, 6, 2, buffer);
    myLCD.gText(248, 105, Serial_LCD::rgb16(254, 254, 1), buffer);
    }
   
    if ((ChambreAnnule==1)  && (currentChambre>current))   
    {   
    myLCD.readScreenFAT("Interdit.gci", 56, 134);
    }
    else
    {
    memset(buffer, 0, 8 * sizeof(char));
    dtostrf(sensorChambre, 6, 2, buffer);
    myLCD.gText(75, 200, Serial_LCD::rgb16(254, 254, 1), buffer);
    }   

    if ((SAMAnnule==1) && (currentSAM>current))   
    {   
    myLCD.readScreenFAT("Interdit.gci", 141, 134);
    }
    else
    {
    memset(buffer, 0, 8 * sizeof(char));
    dtostrf(sensorSalle, 6, 2, buffer);
    myLCD.gText(163, 200, Serial_LCD::rgb16(254, 254, 1), buffer);
    }

    if ((EntreeAnnule==1) && (currentEntree>current))
    {
    myLCD.readScreenFAT("Interdit.gci", 226, 134);
    }
    else
    { 
    memset(buffer, 0, 8 * sizeof(char));
    dtostrf(sensorEntree, 6, 2, buffer);
    myLCD.gText(248, 200, Serial_LCD::rgb16(254, 254, 1), buffer);
    }
   
    if (CuisineAnnule == Annule)
    {
    if (TCuisine==0)
    {
    myLCD.readScreenFAT("TFroid.gci", 60, 95);
    }
    else
    {
    myLCD.readScreenFAT("TChaud.gci", 60, 95);
    }
    }
   
    if (TomAnnule == Annule)
    {
    if (TTom==0)
    {
    myLCD.readScreenFAT("TFroid.gci", 145, 95);
    }
    else
    {
    myLCD.readScreenFAT("TChaud.gci", 145, 95);
    }
    }
   
    if (BureauAnnule == Annule)
    {
    if (TBureau==0)
    {
    myLCD.readScreenFAT("TFroid.gci", 230, 95);
    }
    else
    {
    myLCD.readScreenFAT("TChaud.gci", 230, 95);
    }
    }
   
    if (ChambreAnnule == Annule)
    {
    if (TChambre==0)
    {
    myLCD.readScreenFAT("TFroid.gci", 60, 190);
    }
    else
    {
    myLCD.readScreenFAT("TChaud.gci", 60, 190);
    }
    }
   
    if (SAMAnnule == Annule)
    {
    if (TSAM==0)
    {
    myLCD.readScreenFAT("TFroid.gci", 145, 190);
    }
    else
    {
    myLCD.readScreenFAT("TChaud.gci", 145, 190);
    }       
    }
   
    if (EntreeAnnule == Annule)
    {
    if (TEntree==0)
    {
    myLCD.readScreenFAT("TFroid.gci", 230, 190);
    }
    else
    {
    myLCD.readScreenFAT("TChaud.gci", 230, 190);
    }
    } 
  }   
}

//----------------------------------------------------------------------------------------



}   

Stef84

ce que je cherche à faire :

gérer les radiateurs avec un basculement jour/nuit, une température différente pour le jour/nuit, un delta différent jour/nuit
pouvoir les arrêter avec un redémarrage auto au bout de 30mins
pas de mise en route simultanée
un mode auto/nuit/jour/vacances
MAJ des paramètres date/heure, T°, Delta, Temps de pause à travers l'écran

jplaville

Tout d'abord, il faudrait savoir quel type de radiateur tu as ?
Electrique, hydraulique... ???
Car le commande ne s'effectue forcément pas pareil.

Jean-François

Probablement des radiateur électriques, il utilise un carte relais.
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5<br />imac PPC G3 os X Pa

Stef84

oui tout a fait des radiateurs électriques

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy