Go Down

Topic: Partage de projet de gestion radiateur (Read 727 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
imac PPC G3 os X Pa

Stef84

oui tout a fait des radiateurs électriques

Go Up