Show Posts
Pages: [1] 2 3 ... 23
1  International / Megatopic / Re: Ardu-Acquarium Controller v. 3.0 on: Today at 10:06:27 am
sembra tutto ok, promosso a pieni voti  smiley
una domanda, visto che sto schedino usa roba grossa, connettori, to220, perche' usare resistenze smd ?
lo spazio c'e', metterei le normali da 1/4 W

Ciao Testato,
grazie per avermi controllato  smiley
Le R SMD o i componenti SMD in generale, sono una scelta fatta insieme ad altri ragazzi che seguono il progetto, in più nei pochi pcb che mi sono fatto ho brutti ricordi di tempo perso a fare centinaia di fori per i componenti dil, così tendenzialmete li evito.
In ogni caso più avanti pubblicherò per ogni modulo sia la versione SMD che DIL, perché ogni tanto me le chiedono e vorrei lasciare aperte le strade a tutti.

@ PaoloP
Non avrei potuto risponderti meglio di Testato, ma approfitto per slutarti.  smiley

Ciao a tutti.
2  International / Megatopic / Re: Ardu-Acquarium Controller v. 3.0 on: Today at 05:55:08 am
Ridisegnato nuovamente tutto,
altri suggerimenti?  smiley

Riccardo.
3  International / Megatopic / Re: Ardu-Acquarium Controller v. 3.0 on: Today at 05:27:49 am
Grazie davvero Brunello,
io poi sono appunto tra gli inesperti ed ogni suggerimento o precisazione per me è un tesoro!

Riccardo
4  International / Megatopic / Re: Ardu-Acquarium Controller v. 3.0 on: Today at 04:48:53 am
Bhé effettivamente ho la capacità di autocomplicarmi la vita  smiley-yell smiley-yell smiley-yell
effettivamente potrei tranquillamente evitare di mettere i dissipatori a massa e dover poi usare gli isolatori giusto?

 smiley-confuse
5  International / Megatopic / Re: Ardu-Acquarium Controller v. 3.0 on: Today at 04:02:23 am
@ Brunello e Michele

Grazie a tutti e due, ho capito meglio il succo del discorso.

@PaoloP

Non sei il primo a parlarmi del Maker Faire, ma io sinceramente non credo di essere all'altezza, ci penso ogni tanto, ma senza troppa convinzione, in più c'è da considerare che si parla di un impegno che dura tra allestimento e tutto il resto più di 7 giorni che dovrei gestirmi interamente da solo...
I PCB me li faccio fare qui: http://oshpark.com/ carico il file eagle ed ho subito il costo di tre pezzi calcolato sulle misure effettive, non a forfait, con tanto di rendering, in più usano paypal, insomma, mi ci trovo benissimo e la qualità per quel poco che me ne intendo è ottima.  smiley

@ Tutti

Ho ridisegnato la scheda, credo che ora vada bene, la rimetto in allegato, sempre con preghiera di supervisione  smiley-lol
Grazie a tutti.

Riccardo.
6  International / Megatopic / Re: Ardu-Acquarium Controller v. 3.0 on: April 16, 2014, 05:00:57 pm
Grazie per aver risposto così velocemente, fino ad ora ho usato gli IRF con semplici led ed hanno sempre funzionato bene, ma nell'applicazione finale ci piloterò delle strip led e so che va tutto bene ugualmente perché un ragazzo che segue il progetto li sta già usando con queste ultime, le piste sono da 70mil quindi come da avviso sul PCB, il carico massimo non dovrà superare i 3,5 Ah
Domani ridisegno tutto ciao.

Riccardo
7  International / Megatopic / Re: Ardu-Acquarium Controller v. 3.0 on: April 16, 2014, 04:23:07 pm
Bravo @Rici
Stai diventando un professionista
e comunque bredboard con un cablaggio cosi' ordinato solo tu ci riesci
bravo
PS, quello switch navitec se non erro costa un botto

Grazie Brunello, ma i complimenti, sono veramente immeritati credimi, faccio ancora troppi casini...  smiley-sad
E si costicchiano se si prende il modulo pronto, prendendo i tasti separatamente si risparmia, ma cmq non sono regalati, il fatto è che con due fori tondi il frontalino è fatto e poi mi piacciono un casino  smiley-lol smiley-lol smiley-lol
In ogni caso avevo preparato anche un modulo tasti per i più comuni Omron, a breve ripubblico anche quello.

fiiiiiicooooooo
domanda stupida: a che ti servono tutti qui relè, e il PWM led?

I relé pilotano l,alimentazione delle linee luci, il riscaldatore, elettro valvole varie in futuro,
Il PWM led è per creare gli effetti alba e tramonto   smiley

Metto in allegati il nuovo schema ed il PCB, credo si giusto ora, ma spero che qualche anima pia mi controlli per stare più sicuro...
abbassa la resistenza in serie ai gate a 100 Ohm, e dopo mettici una pulldown da 100k
Usa gli IRL540, perche' sono piu' adatti ad una tensione di pilotaggio di 5V

Ciao Testato,
Il consiglio per le R vale sia con gli IRF540 che con gli IRL540?
Poi perdonami, ma di solito ho visto usare gli IRL per pilotare i motori elettrici, io sono un autodidatta e non riesco a capire la differenza tra i due Mosfet, domani di sicuro cercherò di capirci qualcosa di più, ma nel frattempo, riusciresti a darmi una spiegazioncina terra terra?
Te ne sarei molto grato,
Grazie in anticipo
8  International / Megatopic / Re: Ardu-Acquarium Controller v. 3.0 on: April 16, 2014, 01:35:51 pm
Ciao a tuti,
un pò di temp fa ho postato un po' di schemini dei moduli del mio  progetto, c'è voluto un pò di tempo ma alla fine le schede sono arrivate, eccone alcune già montate:

La 1a: Displaye switch I2C interface





Purtroppo ho avuto un paio di problemini con questa: nello schema non mi sono accorto che il pin 16 del display, anche se lo sembrava non era effettivamente collegato a massa, ho risolto semplicemente grattando il solder mask vicino e saladandolo al piano di massa, in più ho invertito i tasti Su e Giù sul PCF ed anche questo l'ho risolto semplicemente rimappando i tasti nello sketch  smiley-red

La 2a: Only switch Navimec



Ed eccole  insieme:





Ovviamente, ho rifatto anche il prototipo:





Ma quì mi sono accorto di aver completamente cannato il modulo PWM Led dopo averlo assemplato ovviamente, altrimenti che gusto c'è  smiley-sad-blue  smiley-red ad ogni modo eccolo:



Metto in allegati il nuovo schema ed il PCB, credo si giusto ora, ma spero che qualche anima pia mi controlli per stare più sicuro...

A breve, ripubblichero tutti gli schemi revisionati e corretti, anche in versione completamente DIL, visto che me li stanno chiedendo, nel frattempo però vista la mia cialtronagine ho rimosso i vecchi...  smiley-sad-blue

9  International / Software / Re: RTC DS3231 lettura registro interno della temperatura on: April 11, 2014, 02:42:31 am
Sì, mea culpa. Ho scritto && al posto di &.

Ma daiiiii... ci mancherebbe scherzi  smiley-eek
Senza te e gli altri chissa dove sarei ancora!!!

@PaoloP
Grazie anche a te, ora ho le idee decisamente più chiare come avrai notato  smiley

Riccardo.
10  International / Software / Re: RTC DS3231 lettura registro interno della temperatura on: April 11, 2014, 12:36:45 am
Buongiorno,
grazie a tutti e due per le risposte,
Stai commettendo lo stesso errore che ti ho citato prima. Ossia che se non metti "0b" davanti ad un numero, il compilatore non lo interpreta come binario..
Nel tuo codice c'è:
Code:
char dato =  11100111;
E' da cambiare in:
Code:
char dato =  0b11100111;
Tu stai assegnando i numero 11.100.111 (undici milioni, centomila, centoundici) ad un char, che ovviamente non può contenerlo e lo tronca.

Hai ragione, ma per me dato è ciò che arriva dall'RTC e non posso scrivere:
dato = 0b(wire.read());
oppure dato = 0bwire.read();
ancora meno funziona
if (0bdato && 0b10000000)
oppure if (0b(dato) && 0b10000000)
Tu non avresti mai fatto ste prove, ma io che sono un pivellino mi sono voluto togliere la sete col prosciutto  smiley-lol smiley-red
Il problema però sta nel tuo suggerimento dell'altra mattina, quando le braccia di Morfeo ancora non ti avevano completamente liberato  smiley-lol smiley-lol smiley-lol smiley-lol smiley-lol smiley-lol

Il complemento a due è il modo usato dai compilatori. Hai provato semplicemente ad assegnare il risultato che leggi ad un char, che è un signed ad 8 bit?

A parte questo, il controllo dell'ottavo bit (non il settimo!), lo puoi fare così:
if (dato && 0b10000000) { .... }

Infatti ha ragione MauroTec

Si è come dice leo. Inoltre non ha notato *&&* al posto di &.
Code:
if (dato && 0b10000000)

Deve diventare:
Code:
if (dato & 0b10000000)

Con una sola "&" funziona, anche senza mettere il prefisso "0b"

In ogni caso grazie di nuovo grazie a tutti e due per gli insegnamenti e la pazienza  smiley

Riccardo.
11  International / Software / Re: RTC DS3231 lettura registro interno della temperatura on: April 10, 2014, 06:24:47 am
Ecco il codice, un pò brutale ma spero renda l'idea.

Code:
boolean confronto = false;

char dato =  11100111; //-25 o contenuto reg. RTC quindi non posso mettere davanti ob


void setup() {
  Serial.begin(9600);
  if (dato && 0b10000000)
    confronto = true;

  Serial.print(confronto);
}

void loop() {
  // put your main code here, to run repeatedly:

}

se cambi il valore di dato mettendo un positivo vedrai che confronto è sempre vero, ma perché?  smiley-sad

Riccardo
12  International / Software / Re: RTC DS3231 lettura registro interno della temperatura on: April 10, 2014, 05:22:44 am
Ciao Leo,
ho fatto le prove che mi hai suggerito ovvero con char e l'AND ed ecco le mie  smiley-roll-sweat conclusioni:
char effettivamente è un signed, io non ci avrei mai pensato  smiley-red, questo mi ha permesso di fare confronti direttamente per >= 0 senza scomodare AND con i bit, per sapere se il dato è positivo o negativo, in più ho corretto anche un'altro mio errore, infatti in caso di parte intera negativa, la parte frazionaria per essere aggiunta va sottratta non sommata, così ho differenziato le operazioni, ecco il codice rielaboato:

Code:
#include <Wire.h>

byte secondi, minuti, ora, giornosett, giorno, mese;
int anno;
char* gset[] = {"Lunedi", "Martedi", "Mercoledi", "Giovedi", "Venerdi", "Sabato", "Domenica"};

byte decToBcd(byte val) // Da decimale a binario
{ return ( (val / 10 * 16) + (val % 10) );
}

byte bcdToDec(byte val) // Da binario a decimale
{ return ( (val / 16 * 10) + (val % 16) );
}

void LetturaDataOra()
{ Wire.beginTransmission(0x68);
  Wire.write((byte)0x00);
  Wire.endTransmission();

  Wire.requestFrom(0x68, 7);
  //recupero i 7 byte relativi ai corrispondenti registri

  secondi = bcdToDec(Wire.read() & 0x7f);
  minuti = bcdToDec(Wire.read());
  ora = bcdToDec(Wire.read() & 0x3f);
  giornosett = bcdToDec(Wire.read());
  giorno = bcdToDec(Wire.read());
  mese = bcdToDec(Wire.read());
  anno = bcdToDec(Wire.read()) + 2000;
}

float Temp() {
  Wire.beginTransmission(0x68);
  Wire.write(0x11);
  Wire.endTransmission();

  Wire.requestFrom(0x68, 2);
  char MSBtemp = Wire.read();
  char LSBtemp = Wire.read();
  
  if (MSBtemp >= 0) {
    float Temperature = (float) (MSBtemp) + (float) ((LSBtemp >> 6) * 0.25);
    return Temperature;
  }
  else  {  // se la parte intera della temp. è negativa lo è anche la parte frazionaria, quindi per aggiungerla la devo sottrarre.
    float Temperature = (float) (MSBtemp) - (float) ((LSBtemp >> 6) * 0.25);
    return Temperature;
  }
}

void stampa0 (int dato_tempo)
{ if (dato_tempo < 10)
    Serial.print(F("0"));
  Serial.print(dato_tempo);
}

void setup()
{
  //inizializzo la seriale
  Serial.begin(9600);

  //inizializzo la libreria
  Wire.begin();

  /*Wire.beginTransmission(0x68); //il primo byte stabilisce il registro iniziale da scivere
  Wire.write((byte)0x00);
  Wire.write(decToBcd(1));
  Wire.write(decToBcd(41));
  Wire.write(decToBcd(10));
  Wire.write(decToBcd(2));
  Wire.write(decToBcd(8));
  Wire.write(decToBcd(4));
  Wire.write(decToBcd(14));
  Wire.endTransmission();*/
}


void loop()
{

  LetturaDataOra();

  Serial.print(gset[giornosett - 1]);
  Serial.print(" ");
  stampa0(giorno);
  Serial.print("/");
  stampa0(mese);
  Serial.print("/");
  stampa0(anno);
  Serial.print("  ");
  stampa0(ora);
  Serial.print(":");
  stampa0(minuti);
  Serial.print(":");
  stampa0(secondi);
  Serial.print("  Temperatura: ");
  Serial.print(Temp());
  Serial.println();

  delay(1000);
}

Invece per l'AND con i char, ho riscontrato che fare:

Code:
char dato =   11100111 //-25
if (dato && 0b10000000)
oppure
Code:
char dato =   00000111 // 7
if (dato && 0b10000000)

è sempre vero e non capisco perché  smiley-sad.

Come sempre grazie sinceramente per i suggerimenti ed il supporto.

Riccardo.
13  International / Software / Re: RTC DS3231 lettura registro interno della temperatura on: April 10, 2014, 12:34:16 am
Ciao Leo,
grazie per la risposta.
Il bit 7 partendo la numerazione da 0 è appunto l'ottavo bit, di fatto facendo
Code:
if (MSBtemp >> 7 == 1)
non sto leggendo proprio quello?
Forse sbaglio io, anzi sicuramene, più tardi verifico sia questo che l'assegnazione a char come mi hai suggerito.
Grazie ancora.

Ciao Riccardo.
14  International / Software / Re: RTC DS3231 lettura registro interno della temperatura on: April 09, 2014, 04:28:44 pm
Ho fatto le prove di cui parlavo (RTC in freezer)
ed il codice, sembra funzionare, lo riporto perché avevo omesso un comando e sbagliato la dichiarazione di MSB:

Code:
#include <Wire.h>

byte secondi, minuti, ora, giornosett, giorno, mese;
int anno;
char* gset[] = {"Lunedi", "Martedi", "Mercoledi", "Giovedi", "Venerdi", "Sabato", "Domenica"};

byte decToBcd(byte val) // Da decimale a binario
{ return ( (val / 10 * 16) + (val % 10) );
}

byte bcdToDec(byte val) // Da binario a decimale
{ return ( (val / 16 * 10) + (val % 16) );
}

void LetturaDataOra()
{ Wire.beginTransmission(0x68);
  Wire.write((byte)0x00);
  Wire.endTransmission();

  Wire.requestFrom(0x68, 7);
  //recupero i 7 byte relativi ai corrispondenti registri

  secondi = bcdToDec(Wire.read() & 0x7f);
  minuti = bcdToDec(Wire.read());
  ora = bcdToDec(Wire.read() & 0x3f);
  giornosett = bcdToDec(Wire.read());
  giorno = bcdToDec(Wire.read());
  mese = bcdToDec(Wire.read());
  anno = bcdToDec(Wire.read()) + 2000;
}

float Temp() {
  Wire.beginTransmission(0x68);
  Wire.write(0x11);
  Wire.endTransmission();

  Wire.requestFrom(0x68, 2);
  int MSBtemp = Wire.read();
  byte LSBtemp = Wire.read();
  Serial.print("  "); Serial.print(MSBtemp, BIN); Serial.print("  ");

  if (MSBtemp >> 7 == 1) {//controllo il bit 7 per sapere se ho ricevuto un numero negativo
    bitWrite(MSBtemp, 7, 0);
    MSBtemp = ~(~MSBtemp + 1 + 128) + 1;  //  se lo è eseguo la coversione del byte con complemento a 2
  }

  float Temperature = (float) (MSBtemp) + (float) ((LSBtemp >> 6) * 0.25);
  return Temperature;
}

void stampa0 (int dato_tempo)
{ if (dato_tempo < 10)
    Serial.print(F("0"));
  Serial.print(dato_tempo);
}

void setup()
{
  //inizializzo la seriale
  Serial.begin(9600);

  //inizializzo la libreria
  Wire.begin();

  /*Wire.beginTransmission(0x68); //il primo byte stabilisce il registro iniziale da scivere
  Wire.write((byte)0x00);
  Wire.write(decToBcd(1));
  Wire.write(decToBcd(41));
  Wire.write(decToBcd(10));
  Wire.write(decToBcd(2));
  Wire.write(decToBcd(8));
  Wire.write(decToBcd(4));
  Wire.write(decToBcd(14));
  Wire.endTransmission();*/
}


void loop()
{

  LetturaDataOra();

  Serial.print(gset[giornosett - 1]);
  Serial.print(" ");
  stampa0(giorno);
  Serial.print("/");
  stampa0(mese);
  Serial.print("/");
  stampa0(anno);
  Serial.print("  ");
  stampa0(ora);
  Serial.print(":");
  stampa0(minuti);
  Serial.print(":");
  stampa0(secondi);
  Serial.print("  Temperatura: ");
  Serial.print(Temp());
  Serial.println();

  delay(1000);
}

Però ripropongo la domanda, ho usato il metodo giusto, o c'è un metodo migliore di quello che ho usato io?

Code:
  if (MSBtemp >> 7 == 1) {//controllo il bit 7 per sapere se ho ricevuto un numero negativo
    bitWrite(MSBtemp, 7, 0);
    MSBtemp = ~(~MSBtemp + 1 + 128) + 1;  //  se lo è eseguo la coversione del byte con complemento a 2
  }

Grazie ancora per il vostro tempo.

Riccardo

15  International / Software / RTC DS3231 lettura registro interno della temperatura on: April 09, 2014, 12:32:21 pm
Ciao a tutti  smiley,
da un paio di giorni, mi sono messo a giocare con un RTC DS3231 (http://datasheets.maximintegrated.com/en/ds/DS3231.pdf), appurato che  tutto sommato lo si può tranquillamente leggere e scrivere come fosse un DS1307, mi sono concentrato nella lettura del suo registro della temperatura, nel datasheet se ne parla a pag. 15.
Purtroppo per me restituisce i valori negativi in complemento a 2, mi sono andato a studiare come funziona la cosa ed avrei scritto lo sketch che vedete qui sotto.

Code:
#include <Wire.h>

byte secondi, minuti, ora, giornosett, giorno, mese;
int anno;
char* gset[] = {"Lunedi", "Martedi", "Mercoledi", "Giovedi", "Venerdi", "Sabato", "Domenica"};

byte decToBcd(byte val) // Da decimale a binario
{ return ( (val / 10 * 16) + (val % 10) );
}

byte bcdToDec(byte val) // Da binario a decimale
{ return ( (val / 16 * 10) + (val % 16) );
}

void LetturaDataOra()
{ Wire.beginTransmission(0x68);
  Wire.write((byte)0x00);
  Wire.endTransmission();

  Wire.requestFrom(0x68, 7);
  //recupero i 7 byte relativi ai corrispondenti registri

  secondi = bcdToDec(Wire.read() & 0x7f);
  minuti = bcdToDec(Wire.read());
  ora = bcdToDec(Wire.read() & 0x3f);
  giornosett = bcdToDec(Wire.read());
  giorno = bcdToDec(Wire.read());
  mese = bcdToDec(Wire.read());
  anno = bcdToDec(Wire.read()) + 2000;
}

float Temp() {
  Wire.beginTransmission(0x68);
  Wire.write(0x11);
  Wire.endTransmission();

  Wire.requestFrom(0x68, 2);
  int MSBtemp = Wire.read();
  byte LSBtemp = Wire.read();
  
  if (MSBtemp >> 7 == 1) //controllo il bit 7 per sapere se ho ricevuto un numero negativo
    MSBtemp = ~(~MSBtemp + 1 + 128) + 1;  //  se lo è eseguo la coversione del byte con complemento a 2
  
  float Temperature = (float) (MSBtemp) + (float) ((LSBtemp >> 6) * 0.25);
  return Temperature;
}

void stampa0 (int dato_tempo)
{ if (dato_tempo < 10)
    Serial.print(F("0"));
  Serial.print(dato_tempo);
}

void setup()
{
  //inizializzo la seriale
  Serial.begin(9600);

  //inizializzo la libreria
  Wire.begin();

  Wire.beginTransmission(0x68); //il primo byte stabilisce il registro iniziale da scivere
  Wire.write((byte)0x00);
  Wire.write(decToBcd(1));
  Wire.write(decToBcd(41));
  Wire.write(decToBcd(10));
  Wire.write(decToBcd(2));
  Wire.write(decToBcd(8));
  Wire.write(decToBcd(4));
  Wire.write(decToBcd(14));
  Wire.endTransmission();
}


void loop()
{

  LetturaDataOra();

  Serial.print(gset[giornosett - 1]);
  Serial.print(" ");
  stampa0(giorno);
  Serial.print("/");
  stampa0(mese);
  Serial.print("/");
  stampa0(anno);
  Serial.print("  ");
  stampa0(ora);
  Serial.print(":");
  stampa0(minuti);
  Serial.print(":");
  stampa0(secondi);
  Serial.print("  Temperatura: ");
  Serial.print(Temp());
  Serial.println();

  delay(1000);
}

Nella pratica, ho fatto un po’ di prove in quest’altro sketch e sembra che la conversione dei binari a 7 bit funzioni, in alto nei commenti ho messo un paio di esempi da provare.

Code:
/* -25 = -00011001
          11100110 + byte negato
                 1
          --------
          11100111 complemento a 2 ovvero come dovrebbe essere il registro dell'RTC in caso di temperatura -25

   -40 = -00101000
          11010111 + byte negato
                 1
          --------
          11011000 complemento a 2 ovvero come dovrebbe essere il registro dell'RTC in caso di temperatura -25

*/

byte regtemp_RTCDS3231 = B11100111; // -25 complemento a due

void setup() {
  Serial.begin(9600);
  Serial.print("regRTCDS3231= ");
  Serial.print(regtemp_RTCDS3231, BIN); // giusto per essere sicuro che il byte sia memorizzato correttamente
  
  Serial.print("  Valore decimale = ");
  if (regtemp_RTCDS3231 >> 7 == 1)  { // se il bit 7 è 1 ho un valore negativo
    bitWrite(regtemp_RTCDS3231, 7, 0); // azzero il bit del segno
    int valore_dec = ~(~regtemp_RTCDS3231 + 1 + 128) + 1;
    Serial.print("  Valore decimale = ");
    Serial.print(valore_dec);
  }
  else
    Serial.print(regtemp_RTCDS3231);
}

void loop() {
  // put your main code here, to run repeatedly:

}

Nella teoria però non sono sicuro di aver fatto le cose a modino, a dirla tutta, a furia di fare tentativi non ricordo nemmeno più come ci sono arrivato  smiley-red, magari c’è un metodo molto più semplice, se fosse me lo potreste illustrare?

Chiaramente la prova pratica la farò stasera tenendo l’RTC nel freezer per un po’ e andandolo a leggere poi, ovviamente con le dovute cautele e cercando il più possibile di evitare corti dovuti alla condensa o altro.

Grazie in anticipo per il tempo che vorrete dedicarmi.
Pages: [1] 2 3 ... 23