Show Posts
Pages: 1 2 3 [4] 5 6 ... 25
46  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
47  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

48  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.
49  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.
50  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
51  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.
52  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.
53  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

54  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.
55  Community / Bar Sport / Re: [OT ITA] Lo spamm bar on: April 08, 2014, 12:59:22 am
@riciweb: ehhhh male male male... per poter essere a conoscenza di questo thread devi prima superare un giro di quizzzone, ovviamente preventivamente devi crearne un pezzo

Aiutoooooooo!!! E mo che è sto quizzone???
Quante pagine indietro delle attuali 185 devo andare per capire di cosa si tratta  smiley-razz
Buaaaaa... Buaaaaa.... non ci scrivo più qui! Ho capito l'antifona e me ne vado...

 smiley-twist Buona giornata a tutti.
56  International / Generale / Re: A quando una UNO plus? on: April 08, 2014, 12:53:00 am
Anche io da tempo pensavo di disegnare una Uno plus come te e basata appunto, sul 1248p e mantenedo il layout della Uno attuale per preservare la compatibilità con le shield già in commercio, soprattutto quelle ufficiali; sul lato disegno sarei anche riuscito credo, ma poi ho desistito perche lato core e compatibilità delle librerie (almeno quelle ufficiali) non sarei nemmeno riuscito a capire da dove cominciare  smiley-red però potrebbe essere un bel progettino della board italiana, magari da portare al maker faire  smiley-lol
Ovviamente questo non ha nulla a che vedere con i possibili futuri sviluppi del mio progettino!!!
Non siate maligni eh!!! Ahahahahah  smiley-lol smiley-lol smiley-lol smiley-lol

Riccardo

P.S. nel caso anche io potrei essere un beta tester  smiley
57  Community / Bar Sport / Re: [OT ITA] Lo spamm bar on: April 07, 2014, 01:21:36 pm
Stavo cercando su Ebay dei "sensori a ultrasuino" ma non ne ho trovati.
Qualcuno sa perché?  smiley-mr-green smiley-mr-green
sono strumenti pregiati, non li trovi su ebay, devi prenderli direttamente al produttore  smiley-mr-green

Che matti che siete ROTFL
Non sapevo che c'era anche questo angolino nel forum, vi ho letto per un pò di pagine, forte!

Ciaoooo...  smiley smiley
58  International / Generale / Re: A quando una UNO plus? on: April 07, 2014, 11:19:19 am
x iscrizione  smiley
59  International / Generale / Re: Arduino proclama il Arduino Day 2014 on: March 31, 2014, 03:52:13 am
A va beh!
Non ero arrivato fino in fondo...  smiley-lol
60  International / Generale / Re: Arduino proclama il Arduino Day 2014 on: March 31, 2014, 03:33:37 am
Si sto guardando ora, forse non sono ancora del tutto sveglio, ma non capisco nemmeno da dove si comincia, c'è un login, ma se volessi registrarmi da dove si fa?  smiley-red
Pages: 1 2 3 [4] 5 6 ... 25