0
Offline
Full Member
Karma: 0
Posts: 185
Arduino rocks
|
 |
« Reply #60 on: May 17, 2010, 02:55:49 pm » |
@kokiua quoto @emanuele ora che ci guardo, così com'è hai una risoluzione di circa 0,5°C (il che non aiuta). Intanto cambia inserendo nel setup() analogReference(INTERNAL); e modificando la conversione dell'ADC in °C come segue tempC = (tempC * 110.0)/1024.0; //convert the analog data to temperature
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 0
Posts: 102
Arduino rocks
|
 |
« Reply #61 on: May 17, 2010, 04:09:36 pm » |
si andava meglio perche era piu stabile e il led non impazziva.. ho inserito la correzione mi sbaglia di 1° ed il led arrivato a soglia lampeggia sempre mi sa che era meglio che mi compravo un termostato cosi non vi scocciavo
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 0
Posts: 185
Arduino rocks
|
 |
« Reply #62 on: May 17, 2010, 04:21:14 pm » |
allora, un passetto alla volta. proviamo con le letture distanziate l'una dall'altra #include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#define RIT_TEMP (unsigned int)(0x00FF) /*costante di ritardo lettura temperatura */ unsigned int RitTemp; /* variabile conteggio ritardo lettura temperatura */
float tempC; float umiditaC; float buffer_tempC[] = {0, 0, 0, 0, 0, 0 ,0, 0, 0, 0}; float tamporanea_media = 0; byte indice_buffer = 0;
int tempPin = 0; int umiditaPin = 1; int DigitalPin = 13; int DigitalPin1 = 6; // imposta il pin 6 per attivazione macchina umidita' float TemperaturaMinima = 22; float UmiditaMinima = 57; //soglia di umidita
int buttonPin_inc = 7; int buttonPin_dec = 9; int buttonPin_inc_umidita = 8; // imposta il pin 8 per incremento pulsanti umidita' int buttonPin_dec_umidita = 10; // imposta il pin 10 per diminuzione pulsante umidita' char stato_pulsanti = 0; char stato_pulsanti_umidita = 0; int lettura_pulsante = 0; int lettura_pulsante_umidita = 0; int isteresi = 0.5;
void setup() { RitTemp = 0; lcd.begin(3,20);
pinMode(DigitalPin, OUTPUT); pinMode(DigitalPin1, OUTPUT); pinMode(buttonPin_inc, INPUT); pinMode(buttonPin_dec, INPUT); pinMode(buttonPin_inc_umidita, INPUT); pinMode(buttonPin_dec_umidita, INPUT); }
void loop() { //gestione della pressione del pulsante collegato al pin 7 per incrementare l'isteresi lettura_pulsante = digitalRead(buttonPin_inc); if((lettura_pulsante == HIGH) && !(stato_pulsanti & 0x01)) { TemperaturaMinima += 0.5; stato_pulsanti |= 0x01; } else { if(lettura_pulsante == LOW) { stato_pulsanti &= ~0x01; } }
//gestione della pressione del pulsante collegato al pin 9 per decrementare l'isteresi lettura_pulsante = digitalRead(buttonPin_dec); if((lettura_pulsante == HIGH) && !(stato_pulsanti & 0x02)) { TemperaturaMinima -= 0.5; stato_pulsanti |= 0x01; } else { if(lettura_pulsante == LOW) { stato_pulsanti &= ~0x01; } } //gestione della pressione del pulsante collegato al pin 8 per incrementare l'isteresi d'umidita' lettura_pulsante_umidita = digitalRead(buttonPin_inc_umidita); if((lettura_pulsante_umidita == HIGH) && !(stato_pulsanti_umidita & 0x01)) { UmiditaMinima += 0.5; stato_pulsanti_umidita |= 0x01; } else { if(lettura_pulsante_umidita == LOW) { stato_pulsanti_umidita &= ~0x01; } } //gestione della pressione del pulsante collegato al pin 10 per decrementare l'isteresi d'umidita' lettura_pulsante_umidita = digitalRead(buttonPin_dec_umidita); if((lettura_pulsante_umidita == HIGH) && !(stato_pulsanti_umidita & 0x02)) { UmiditaMinima -= 0.5; stato_pulsanti_umidita |= 0x01; } else { if(lettura_pulsante_umidita == LOW) { stato_pulsanti_umidita &= ~0x01; } } if( ++RitTemp == RIT_TEMP ) { /* incrementa il conteggio e verifica se raggiunto il ritardo */ RitTemp = 0; /* se raggiunto azzera il contatore */ //calcolo dela temperatura attuale tempC = analogRead(tempPin); //read the value from the sensor tempC = (tempC * 500.0)/1024.0; //convert the analog data to temperature //calcolo dell'umidita attuale umiditaC = analogRead(umiditaPin); //read the value from the sensor umiditaC = (5.0 * umiditaC * 100.0)/1024.0; //convert the analog data to temperature //visualizzazione a display lcd.clear(); lcd.print ( "Temp. Int. +" ); lcd.setCursor (14,0); lcd.print(tempC); lcd.setCursor (14,3); lcd.print(umiditaC); lcd.setCursor (0,3); lcd.print ("Umidita Int. %"); lcd.setCursor (0,1); lcd.print ( "Temp. Set +" ); lcd.setCursor (14,1); //sposta i gradi di soglia sull'lcd lcd.print(TemperaturaMinima); // scrive temperatura di soglia lcd.setCursor (14,2); //sposta i gradi di soglia sull'lcd lcd.print(UmiditaMinima); // scrive umidita' di soglia lcd.setCursor (0,2); lcd.print ("Umidita Set %"); //gestione dell'attivazione/disattivazione dell'uscita in base alla temperatura letta if (tempC < TemperaturaMinima) { digitalWrite(DigitalPin, HIGH); // set the LED on delay(40); // wait for a second } else { if (tempC > (TemperaturaMinima + isteresi)) { digitalWrite(DigitalPin, LOW); // set the LED off delay(40); } } delay(200); //gestione dell'attivazione/disattivazione dell'uscita in base all'umidita' letta if (umiditaC < UmiditaMinima) { digitalWrite(DigitalPin1, HIGH); // set the LED on delay(40); // wait for a second } else { if (umiditaC > (UmiditaMinima + isteresi )) { digitalWrite(DigitalPin1, LOW); // set the LED off delay(40); } } delay(200); } } per aumentare la distanza fra le letture aumenta il #define RIT_TEMP, ad esempio con 0x02FF mi scocci? ma va là! questa sera non avevo niente da fare 
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 0
Posts: 102
Arduino rocks
|
 |
« Reply #63 on: May 17, 2010, 04:29:33 pm » |
grazie  e impossibile provarlo perche appena sposto la temp di soglia invece di varialmela di 0,5° varia 405.50°
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 0
Posts: 185
Arduino rocks
|
 |
« Reply #64 on: May 17, 2010, 04:32:40 pm » |
questo problema è nato con questa ultima versione?
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 0
Posts: 102
Arduino rocks
|
 |
« Reply #65 on: May 17, 2010, 04:34:27 pm » |
si
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 0
Posts: 185
Arduino rocks
|
 |
« Reply #66 on: May 17, 2010, 04:38:58 pm » |
ho visto un errorino nell'ultima versio del codice che hai postato. ecco l acorrezione, dimmi se si risolve qualcosa #include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#define RIT_TEMP (unsigned int)(0x00FF) /*costante di ritardo lettura temperatura */ unsigned int RitTemp; /* variabile conteggio ritardo lettura temperatura */
float tempC; float umiditaC; float buffer_tempC[] = {0, 0, 0, 0, 0, 0 ,0, 0, 0, 0}; float tamporanea_media = 0; byte indice_buffer = 0;
int tempPin = 0; int umiditaPin = 1; int DigitalPin = 13; int DigitalPin1 = 6; // imposta il pin 6 per attivazione macchina umidita' float TemperaturaMinima = 22; float UmiditaMinima = 57; //soglia di umidita
int buttonPin_inc = 7; int buttonPin_dec = 9; int buttonPin_inc_umidita = 8; // imposta il pin 8 per incremento pulsanti umidita' int buttonPin_dec_umidita = 10; // imposta il pin 10 per diminuzione pulsante umidita' char stato_pulsanti = 0; char stato_pulsanti_umidita = 0; int lettura_pulsante = 0; int lettura_pulsante_umidita = 0; int isteresi = 0.5;
void setup() { RitTemp = 0; lcd.begin(3,20);
pinMode(DigitalPin, OUTPUT); pinMode(DigitalPin1, OUTPUT); pinMode(buttonPin_inc, INPUT); pinMode(buttonPin_dec, INPUT); pinMode(buttonPin_inc_umidita, INPUT); pinMode(buttonPin_dec_umidita, INPUT); }
void loop() { //gestione della pressione del pulsante collegato al pin 7 per incrementare l'isteresi lettura_pulsante = digitalRead(buttonPin_inc); if((lettura_pulsante == HIGH) && !(stato_pulsanti & 0x01)) { TemperaturaMinima += 0.5; stato_pulsanti |= 0x01; } else { if(lettura_pulsante == LOW) { stato_pulsanti &= ~0x01; } }
//gestione della pressione del pulsante collegato al pin 9 per decrementare l'isteresi lettura_pulsante = digitalRead(buttonPin_dec); if((lettura_pulsante == HIGH) && !(stato_pulsanti & 0x02)) { TemperaturaMinima -= 0.5; stato_pulsanti |= 0x02; } else { if(lettura_pulsante == LOW) { stato_pulsanti &= ~0x02; } } //gestione della pressione del pulsante collegato al pin 8 per incrementare l'isteresi d'umidita' lettura_pulsante_umidita = digitalRead(buttonPin_inc_umidita); if((lettura_pulsante_umidita == HIGH) && !(stato_pulsanti_umidita & 0x04)) { UmiditaMinima += 0.5; stato_pulsanti_umidita |= 0x04; } else { if(lettura_pulsante_umidita == LOW) { stato_pulsanti_umidita &= ~0x04; } } //gestione della pressione del pulsante collegato al pin 10 per decrementare l'isteresi d'umidita' lettura_pulsante_umidita = digitalRead(buttonPin_dec_umidita); if((lettura_pulsante_umidita == HIGH) && !(stato_pulsanti_umidita & 0x08)) { UmiditaMinima -= 0.5; stato_pulsanti_umidita |= 0x08; } else { if(lettura_pulsante_umidita == LOW) { stato_pulsanti_umidita &= ~0x08; } } if( ++RitTemp == RIT_TEMP ) { /* incrementa il conteggio e verifica se raggiunto il ritardo */ RitTemp = 0; /* se raggiunto azzera il contatore */ //calcolo dela temperatura attuale tempC = analogRead(tempPin); //read the value from the sensor tempC = (tempC * 500.0)/1024.0; //convert the analog data to temperature //calcolo dell'umidita attuale umiditaC = analogRead(umiditaPin); //read the value from the sensor umiditaC = (5.0 * umiditaC * 100.0)/1024.0; //convert the analog data to temperature //visualizzazione a display lcd.clear(); lcd.print ( "Temp. Int. +" ); lcd.setCursor (14,0); lcd.print(tempC); lcd.setCursor (14,3); lcd.print(umiditaC); lcd.setCursor (0,3); lcd.print ("Umidita Int. %"); lcd.setCursor (0,1); lcd.print ( "Temp. Set +" ); lcd.setCursor (14,1); //sposta i gradi di soglia sull'lcd lcd.print(TemperaturaMinima); // scrive temperatura di soglia lcd.setCursor (14,2); //sposta i gradi di soglia sull'lcd lcd.print(UmiditaMinima); // scrive umidita' di soglia lcd.setCursor (0,2); lcd.print ("Umidita Set %"); //gestione dell'attivazione/disattivazione dell'uscita in base alla temperatura letta if (tempC < TemperaturaMinima) { digitalWrite(DigitalPin, HIGH); // set the LED on delay(40); // wait for a second } else { if (tempC > (TemperaturaMinima + isteresi)) { digitalWrite(DigitalPin, LOW); // set the LED off delay(40); } } delay(200); //gestione dell'attivazione/disattivazione dell'uscita in base all'umidita' letta if (umiditaC < UmiditaMinima) { digitalWrite(DigitalPin1, HIGH); // set the LED on delay(40); // wait for a second } else { if (umiditaC > (UmiditaMinima + isteresi )) { digitalWrite(DigitalPin1, LOW); // set the LED off delay(40); } } delay(200); } }
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 0
Posts: 102
Arduino rocks
|
 |
« Reply #67 on: May 17, 2010, 04:53:36 pm » |
adesso si imposta bene, la lettura sembra piu' stabile pero quando arriva a soglia fa lo stesso difetto . ma se lo taglio e lo butto quel led  forse e meglio se preparo il contenitore e lo testo in condizioni reali digitalWrite(DigitalPin, HIGH); // set the LED on delay(40); potrebbe essere questa la causa che allorigine era di 4000 e poi lo tolto perche dovevo aspettare 4+4+4+4 secondi per impostare 0.5° di soglia
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 0
Posts: 102
Arduino rocks
|
 |
« Reply #68 on: May 17, 2010, 04:58:53 pm » |
quell'errore che mi hai correttonella prima versione andava bene nell'ultima no lo avevo fatto io di proposito perche cosi non dovevo premere ripetutamente il pulsante per aumentare il livello di soglia con quello basta che tenevo premuto e aumentava di 0,5° per volta fino a che non lasciavo
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 0
Posts: 185
Arduino rocks
|
 |
« Reply #69 on: May 17, 2010, 05:01:49 pm » |
ma no! piuttosto di togliere "quel led" cambia pin per abilitare il relè (ma secondo me non centra)
ma la simulazione che fai è di cambiare la soglia tramite i pulsanti? puoi provare a impostare una sogli a di 25°C e scaldare il sensore con le dita?
ci aggiorniamo a domani che mi butto in branda (domani sono in trasferta per lavoro)
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 0
Posts: 102
Arduino rocks
|
 |
« Reply #70 on: May 17, 2010, 05:10:30 pm » |
"ma la simulazione che fai è di cambiare la soglia tramite i pulsanti?" si la metto a temperatura ambiente prova fatta soglia 25° scaldato con le mani ma appena arriva al traguardo il led e intermittente
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 0
Posts: 185
Arduino rocks
|
 |
« Reply #71 on: May 18, 2010, 03:08:23 pm » |
allora, ci ho un po' pensato e sono giunto alla conclusione che potrebbe essere colpa del fatto che così com'è il sistema ha una risoluzione di poco inferiore a 0.5°C e l'isteresi è proprio di 0.5°C il che è un po' rischioso. proverei a fare così: 1) aumento della risoluzione del sistema (circa 0.1°C) 2) ampiamento dell'isteresi (1.0°C) 3) diminuzione degli incrementi della soglia di temperatura in seguito alla pressione del pulsante (0.3°C) di seguito il codice #include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#define RIT_TEMP (unsigned int)(0x00FF) /*costante di ritardo lettura temperatura */ unsigned int RitTemp; /* variabile conteggio ritardo lettura temperatura */
float tempC; float umiditaC; float buffer_tempC[] = {0, 0, 0, 0, 0, 0 ,0, 0, 0, 0}; float tamporanea_media = 0; byte indice_buffer = 0;
int tempPin = 0; int umiditaPin = 1; int DigitalPin = 13; int DigitalPin1 = 6; // imposta il pin 6 per attivazione macchina umidita' float TemperaturaMinima = 22; float UmiditaMinima = 57; //soglia di umidita
int buttonPin_inc = 7; int buttonPin_dec = 9; int buttonPin_inc_umidita = 8; // imposta il pin 8 per incremento pulsanti umidita' int buttonPin_dec_umidita = 10; // imposta il pin 10 per diminuzione pulsante umidita' char stato_pulsanti = 0; #define PULSANTE_TEMPERATURA_INC_PREMUTO 0x01 #define PULSANTE_TEMPERATURA_DEC_PREMUTO 0x02 #define PULSANTE_UMIDITA_INC_PREMUTO 0x04 #define PULSANTE_UMIDITA_DEC_PREMUTO 0x08
#define STEP_TEMPERATURA 0.3 #define STEP_UMIDITA 0.5
char stato_pulsanti_umidita = 0; int lettura_pulsante = 0; int lettura_pulsante_umidita = 0; int isteresi = 1.0;
void setup() { RitTemp = 0; lcd.begin(3,20); analogReference(INTERNAL); pinMode(DigitalPin, OUTPUT); pinMode(DigitalPin1, OUTPUT); pinMode(buttonPin_inc, INPUT); pinMode(buttonPin_dec, INPUT); pinMode(buttonPin_inc_umidita, INPUT); pinMode(buttonPin_dec_umidita, INPUT); }
void loop() { //gestione della pressione del pulsante collegato al pin 7 per incrementare l'isteresi lettura_pulsante = digitalRead(buttonPin_inc); if((lettura_pulsante == HIGH) && !(stato_pulsanti & PULSANTE_TEMPERATURA_INC_PREMUTO)) { TemperaturaMinima += STEP_TEMPERATURA; stato_pulsanti |= PULSANTE_TEMPERATURA_INC_PREMUTO; } else { if(lettura_pulsante == LOW) { stato_pulsanti &= ~PULSANTE_TEMPERATURA_INC_PREMUTO; } }
//gestione della pressione del pulsante collegato al pin 9 per decrementare l'isteresi lettura_pulsante = digitalRead(buttonPin_dec); if((lettura_pulsante == HIGH) && !(stato_pulsanti & PULSANTE_TEMPERATURA_DEC_PREMUTO)) { TemperaturaMinima -= STEP_TEMPERATURA; stato_pulsanti |= PULSANTE_TEMPERATURA_DEC_PREMUTO; } else { if(lettura_pulsante == LOW) { stato_pulsanti &= ~PULSANTE_TEMPERATURA_DEC_PREMUTO; } } //gestione della pressione del pulsante collegato al pin 8 per incrementare l'isteresi d'umidita' lettura_pulsante_umidita = digitalRead(buttonPin_inc_umidita); if((lettura_pulsante_umidita == HIGH) && !(stato_pulsanti & PULSANTE_UMIDITA_INC_PREMUTO)) { UmiditaMinima += STEP_UMIDITA; stato_pulsanti |= PULSANTE_UMIDITA_INC_PREMUTO; } else { if(lettura_pulsante_umidita == LOW) { stato_pulsanti &= ~PULSANTE_UMIDITA_INC_PREMUTO; } } //gestione della pressione del pulsante collegato al pin 10 per decrementare l'isteresi d'umidita' lettura_pulsante_umidita = digitalRead(buttonPin_dec_umidita); if((lettura_pulsante_umidita == HIGH) && !(stato_pulsanti & PULSANTE_UMIDITA_DEC_PREMUTO)) { UmiditaMinima -= STEP_UMIDITA; stato_pulsanti |= PULSANTE_UMIDITA_DEC_PREMUTO; } else { if(lettura_pulsante_umidita == LOW) { stato_pulsanti &= ~PULSANTE_UMIDITA_DEC_PREMUTO; } } if( ++RitTemp == RIT_TEMP ) { /* incrementa il conteggio e verifica se raggiunto il ritardo */ RitTemp = 0; /* se raggiunto azzera il contatore */ //calcolo dela temperatura attuale tempC = analogRead(tempPin); //read the value from the sensor tempC = (tempC * 107.421875L)/1000.0; //convert the analog data to temperature //calcolo dell'umidita attuale umiditaC = analogRead(umiditaPin); //read the value from the sensor umiditaC = (5.0 * umiditaC * 100.0)/1024.0; //convert the analog data to temperature //visualizzazione a display lcd.clear(); lcd.print ( "Temp. Int. +" ); lcd.setCursor (14,0); lcd.print(tempC); lcd.setCursor (14,3); lcd.print(umiditaC); lcd.setCursor (0,3); lcd.print ("Umidita Int. %"); lcd.setCursor (0,1); lcd.print ( "Temp. Set +" ); lcd.setCursor (14,1); //sposta i gradi di soglia sull'lcd lcd.print(TemperaturaMinima); // scrive temperatura di soglia lcd.setCursor (14,2); //sposta i gradi di soglia sull'lcd lcd.print(UmiditaMinima); // scrive umidita' di soglia lcd.setCursor (0,2); lcd.print ("Umidita Set %"); //gestione dell'attivazione/disattivazione dell'uscita in base alla temperatura letta if (tempC < TemperaturaMinima) { digitalWrite(DigitalPin, HIGH); // set the LED on delay(40); // wait for a second } else { if (tempC > (TemperaturaMinima + isteresi)) { digitalWrite(DigitalPin, LOW); // set the LED off delay(40); } } delay(200); //gestione dell'attivazione/disattivazione dell'uscita in base all'umidita' letta if (umiditaC < UmiditaMinima) { digitalWrite(DigitalPin1, HIGH); // set the LED on delay(40); // wait for a second } else { if (umiditaC > (UmiditaMinima + isteresi )) { digitalWrite(DigitalPin1, LOW); // set the LED off delay(40); } } delay(200); } } se così facendo il led pazzerino mette la testa a posto possiamo cominciare ad affinare le cose
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 0
Posts: 102
Arduino rocks
|
 |
« Reply #72 on: May 18, 2010, 04:46:54 pm » |
woww il led si e calmato ma che cera un po di valeriana nel codice
dati attuali temperatura di soglia 23.20 resta acceso fino a 24.20 (no dovrebe staccare a23.20)( e ripartire appena arriva a 22.20)
e riparte nuovamente a 23.20 lettura umidita(che per il momento ce un lm35) mi segna +106.42° credo sia sballato
temperatura con srumento di precisione 22.25 temperatura con arduino 22.34/22.45
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 0
Posts: 185
Arduino rocks
|
 |
« Reply #73 on: May 18, 2010, 04:59:02 pm » |
yuppi! ci ho preso 8-) resta acceso fino a 24.2 perché è così nel codice //gestione dell'attivazione/disattivazione dell'uscita in base alla temperatura letta if (tempC < TemperaturaMinima) { digitalWrite(DigitalPin, HIGH); // set the LED on delay(40); // wait for a second } else { if (tempC > (TemperaturaMinima + isteresi)) { digitalWrite(DigitalPin, LOW); // set the LED off delay(40); } } per avere lo stacco a 23.2 e attivazione sotto i 22.2 si deve cambiare con //gestione dell'attivazione/disattivazione dell'uscita in base alla temperatura letta if (tempC < (TemperaturaMinima - isteresi)) { digitalWrite(DigitalPin, HIGH); // set the LED on delay(40); // wait for a second } else { if (tempC > TemperaturaMinima) { digitalWrite(DigitalPin, LOW); // set the LED off delay(40); } } per avere una lettura corretta anche sul secondo sensore va modificata la formula di conversione da umiditaC = (5.0 * umiditaC * 100.0)/1024.0; //convert the analog data to temperature in umiditaC = (umiditaC * 107.421875L)/1000.0; //convert the analog data to temperature lo strumento di precisione di cui parli misura la temperatura ambiente o la tensione di uscita del sensore (che converti in temperatura)?
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 0
Posts: 102
Arduino rocks
|
 |
« Reply #74 on: May 18, 2010, 05:13:12 pm » |
perche avevi dubbi che ci prendevi  che pensi e meglio cosi ho farlo scendere lo strumento misura la temperatura ambiente li ho affiancati ok funziona anche umidita'
|
|
|
|
|
Logged
|
|
|
|
|
|