Binary Clock

eppur si muove!

cablaggio interminabile!

domani o domenica preparo l'attiny85 secondo il pdf di Leo e vedo se và!

sono ancora indeciso se usare un RTC esterno o il Software. l'unico dubbio è la questione del mantenimento dell'ora senza alimentazione!

ah, visto che ho 11 ulteriori led da poter controllare, pensavo ad un'unità separata che visualizzi in qualche modo (ancora devo studiare un sistema figo) la data! giorno, mese e anno!

In questi giorni sto affrondanto il problema in prima persona.
Ti posso dire che la swRTC ha bisogno di un quarzo esterno! Scordati di usare l'oscillatore interno o un risonatore ceramico. Troppo scarto. Inoltre senza il deltaT non sarei lo stesso andato lontano dato che ci sono sempre delle variabili non calcolabili. Dopo 1 giorno di accensione ininterrotta il Micrologio prima versione ad occhio mantiene l'ora egregiamente. Non ho controllato i secondi ma poco mi importa: è un piccolo orologino da tavolo, in fondo, mi serve giusto per vedere "che ore sono" :stuck_out_tongue:

Questione RTC hardware. Sicuramente è più preciso ma perdi 2 pin per l'I2C per comunicare con esso. Devi valutare il tuo progetto quanti pin ti porta via. Gli AttinyX5 ne hanno 5 usabili. Potresti pensare ad un Attiny84: 11 pin al costo di un piccolo ingombro in più.

bhe Leo, ero propenso al RTC hardware perché già il SAA1064 è I2C! pertanto potrei semplicemente collegare il DS1307 che ho preso in cascata al bus.

l'idea era: I2C per SAA e DS (2 Pin), tasto per la regolazione come il tuo multiplexing (poi mi studio una sequenza di led che mi indica in che parte della programmazione mi trovo) (1pin)!

me ne resterebbero 2! o per rendere più agevole la programmazione con un'altro tasto, o per spegnere e accendere i led in condizioni di bisogno! boo insomma, funzioni future, come si legge spesso nei DataSheet! :slight_smile:

che ne dici?

l'attiny85 a 8Mhz non dovrebbe trovare grossi problemi a gestire i due moduli no?

Bene, sempre meglio lasciare il progetto con almeno 1 pin libero: non si sa mai :smiley:

Nessun problema per gli 8 MHz. Il mio Micrologio 2 va ad 1 MHz :wink:

Poi voglio gli schemi, eh :wink:

sei bravissimo con la CNC, mi fai un paio di lavori a pagamento :slight_smile: ?
mi piacerebbe inscatolare i miei due amati progetti

@leo

ovvio, a progetto finito, schemi, sunto e codice per farti ridere un po!

@Testato

no problem!

mandami un MP che ti aiuto volentieri! mi piace realizzare contenitori! :wink:

Testato:
sei bravissimo con la CNC

Più che altro, sei fortunato ad avere una CNC :wink:

tempo fà, avevo in mente di produrre una piccola serie di CNC in MDF e guide lineari economiche per lavorare legno e plastica!

bhe, potrebbe essere un'idea per molti smanettoni del forum! anche sono per le scatole delle robe fatte con arduino.

magari ritiro fuori il progetto e valuto la spesa (irrisoria) e vedo se ho tempo di farne una per testarla!

Vi segnalo questo Forum (http://www.cncitalia.net/forum/), ma probabilmente lo conoscete già. :wink:

si si, io ci vivo li dentro! :wink:

visitatelo, è il migliore e il più rigoglioso di gente che ne capisce sul serio! dei veri dei della meccanica!

z3us:
si si, io ci vivo li dentro! :wink:

visitatelo, è il migliore e il più rigoglioso di gente che ne capisce sul serio! dei veri dei della meccanica!

Come lo é questa sezione per Arduino. :slight_smile:

avoglia!!!

ho visto cose qui nel forum che non avrei mai immaginato! Complimenti a tutti!

(per non parlare della mole di roba che ho appreso!!)

allora!

aggiornamento orologio binario:

ieri ho deciso di procedere con l'istallazione e la programmazione dell'Attiny85, come da progetto!

ho subito scaricato la guida + file dal sito di Leo, guida molto completa e precisa, complimenti! Inserito i Core, gli esempi e le librerie, tra cui l'I2C!

è stata un po dura modificare i fuse per ottenere gli 8 Mhz, il processo è ben spiagato per linux, ma per Winzoz me lo sono dovuto adattare. per fortuna ha funzionato COM3 come parametro "porta" e tutto è andato liscio! Ma esiste solo questo programma per modificare i fuses? Mi sa che costruisco il programmatore HV di Michele! :slight_smile:

Ho usato la UNO per tutti i lavori, compreso caricare poi il software dell'orologio!
ma andiamo con ordine.

intanto, cosa vuol dire questo errore dell'IDE? l'Attiny funziona, ma le cose scritte in rosso non mi piacciono!

Binary sketch size: 2322 bytes (of a 8192 byte maximum)
avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny85
avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny85

sia il TinyI2C che la swRTC funzionano bene! e a primo colpo tra l'altro! Ora mi resta solo da assemblare il modulo DS1307 e interfacciarlo. La libreria di Adafruit va bene vero? la usano pure su ElettronicaIn! Mi piace l'istruzione : RTC.adjust(DateTime(DATE, TIME)); che a quanto ho capito al momento dell'upload inserisce la data corrente presente sul PC! :slight_smile:

ora arrivano le richieste d'aiuto:

mi sono trovato davanto ad un problema grosso! ho capito le cause, sò forse come aggirarlo. ma meglio chiedere prima!

ho predisposto sul PCB dell'Attiny il connettore ISP, correttamente collegato e riverificato più volte! Infatti funziona! ma non appena collego qualcosa I2C non posso più programmarlo! la UNO va in blocco, avvolte si riavvia! Senza I2C, come appena detto, tutto và! il Bus è connesso ai pin 5 e 7 come da libreria originale!

mi chiedo se cambiando i pin, visto che è software tutto il lavoro, posso aggirare il problema! tipo sui pin 2 e 3, che sono proprio liberi da tutto! a voi è successo?

per il resto sono pienamente soddisfatto del lavoro! :slight_smile:

foto nel pomeriggio!

z3us:
allora!

aggiornamento orologio binario:

ieri ho deciso di procedere con l'istallazione e la programmazione dell'Attiny85, come da progetto!

ho subito scaricato la guida + file dal sito di Leo, guida molto completa e precisa, complimenti! Inserito i Core, gli esempi e le librerie, tra cui l'I2C!

Grazie :wink:

è stata un po dura modificare i fuse per ottenere gli 8 Mhz, il processo è ben spiagato per linux, ma per Winzoz me lo sono dovuto adattare. per fortuna ha funzionato COM3 come parametro "porta" e tutto è andato liscio!

Io ho Linux, la guida è scritta per questo SO. Ma non dire che è stato difficile adattare i parametri perché è una sciocchezza, dai! :stuck_out_tongue:

Ma esiste solo questo programma per modificare i fuses? Mi sa che costruisco il programmatore HV di Michele! :slight_smile:

Se hai Windows dovrebbe esistere un'interfaccia grafica per avrdude, non mi ricordo come si chiama ma se cerchi su Google la trovi.

Ho usato la UNO per tutti i lavori, compreso caricare poi il software dell'orologio!
ma andiamo con ordine.

intanto, cosa vuol dire questo errore dell'IDE? l'Attiny funziona, ma le cose scritte in rosso non mi piacciono!

Binary sketch size: 2322 bytes (of a 8192 byte maximum)

avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny85
avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny85

Ignoralo. Si tratta di 2 voci non configurate nel file avrdude.conf.

sia il TinyI2C che la swRTC funzionano bene! e a primo colpo tra l'altro! Ora mi resta solo da assemblare il modulo DS1307 e interfacciarlo. La libreria di Adafruit va bene vero? la usano pure su ElettronicaIn! Mi piace l'istruzione : RTC.adjust(DateTime(DATE, TIME)); che a quanto ho capito al momento dell'upload inserisce la data corrente presente sul PC! :slight_smile:

Non è proprio così. Al momento della compilazione dello sketch, il compilatore salva all'interno del programma la data e l'ora attuali. Quindi se compili alle 12:00:00 dello 01/05/2012 e fra 5 anni resetti l'orologio, anche fra 5 anni riparti dalle 12:00:00 dello 01/05/2012 :wink:

ora arrivano le richieste d'aiuto:

mi sono trovato davanto ad un problema grosso! ho capito le cause, sò forse come aggirarlo. ma meglio chiedere prima!

ho predisposto sul PCB dell'Attiny il connettore ISP, correttamente collegato e riverificato più volte! Infatti funziona! ma non appena collego qualcosa I2C non posso più programmarlo! la UNO va in blocco, avvolte si riavvia! Senza I2C, come appena detto, tutto và! il Bus è connesso ai pin 5 e 7 come da libreria originale!

mi chiedo se cambiando i pin, visto che è software tutto il lavoro, posso aggirare il problema! tipo sui pin 2 e 3, che sono proprio liberi da tutto! a voi è successo?

per il resto sono pienamente soddisfatto del lavoro! :slight_smile:

foto nel pomeriggio!

La comunicazione ISP può essere influenzata da segnali presenti sulle linee MOSI/MISO/SCK. Prova a convogliare la linea Vcc del connettore ICSP solo verso l'Attiny85, per non attivare anche altre cose (ad esempio usando un jumperino) oppure con qualche altro accorgimento per poter disaccoppiare le linee.

bene, grazie Leo! esaustivo come sempre!

Si, è stato facile adattare i parametri di avrdude, ovvio dopo aver appreso dalla tua spiegazione dettagliata a cosa servissero i singoli parametri! :wink: altrimenti non sarei riuscito così velocemente! Cercherò l'interfaccia grafica!

Grazie per l'errore, se non è nulla di grave, a me basta che funzioni tutto!

riguardo la data avevo capito che funzionava in questo modo. ma l'assenza del reset nell'Attiny e il tastino che metterò per regolare l'ora renderanno il tutto perfetto e semplice pure! in più, utilizzando il DS1307, con la batteria tampone a corredo posso dormire sonni tranquilli! (spero!)

passando per ultimo alla questione più importante:

dici che basta disalimentare le periferiche I2C collegate al Attiny? umh, proverò! posso alimentare il tutto da un'altra parte e porre un diodo prima dell'Attiny, così che se programmo si accende solo l'Attiny, se accendo l'orologio, parte tutto!

in caso non vada, cambiare pin I2C può funzionare?

I pin dell'I2C sono mappati su PB0 e PB2, non so se puoi cambiarli, non mi pare.
Metti 3 jumperini sui 3 pin MOSI/MISO/SCK: in questo modo, nel caso tu debba programmare l'Attiny, li apri così che il collegamento sia solo connettore-Tiny.

z3us:
le cose scritte in rosso non mi piacciono!

Dal sito di GioBlu --> http://www.gioblu.com/tutorials/programmazione/312-come-far-sparire-lerrore-di-qpagelq-programmando-attiny85

AVRdudeGUI --> AVRdude GUI download | SourceForge.net

:wink:

Helps!!!!!

la libreria di adafruit per il DS1307 sfrutta il Wire normale, non il TinyWireM! non compila nemmeno! arg!

qualcuno ci ha già smanettato?

ho provato a cambiare il "wire" in "TinyWireM" nel .cpp della libreria (creandomene una copia!) ma nn và uguale! avrò impiastricciato qualcosa!

cosa vi serve per darmi una mano? che vi posto?

errore:

In file included from Orologio_Binario_BCD.cpp:1:
D:\arduino\libraries\TinyRTC_lib/TinyRTClib.h:7: error: expected `)' before 't'
D:\arduino\libraries\TinyRTC_lib/TinyRTClib.h:8: error: expected `)' before 'year'
D:\arduino\libraries\TinyRTC_lib/TinyRTClib.h:11: error: 'uint16_t' does not name a type
D:\arduino\libraries\TinyRTC_lib/TinyRTClib.h:12: error: 'uint8_t' does not name a type
D:\arduino\libraries\TinyRTC_lib/TinyRTClib.h:13: error: 'uint8_t' does not name a type
D:\arduino\libraries\TinyRTC_lib/TinyRTClib.h:14: error: 'uint8_t' does not name a type
D:\arduino\libraries\TinyRTC_lib/TinyRTClib.h:15: error: 'uint8_t' does not name a type
D:\arduino\libraries\TinyRTC_lib/TinyRTClib.h:16: error: 'uint8_t' does not name a type
D:\arduino\libraries\TinyRTC_lib/TinyRTClib.h:17: error: 'uint8_t' does not name a type
D:\arduino\libraries\TinyRTC_lib/TinyRTClib.h:22: error: 'uint32_t' does not name a type
D:\arduino\libraries\TinyRTC_lib/TinyRTClib.h:25: error: 'uint8_t' does not name a type
D:\arduino\libraries\TinyRTC_lib/TinyRTClib.h:31: error: 'uint8_t' does not name a type
D:\arduino\libraries\TinyRTC_lib/TinyRTClib.h:33: error: 'uint8_t' does not name a type
Orologio_Binario_BCD.cpp: In function 'void setup()':
Orologio_Binario_BCD:14: error: 'class RTC_DS1307' has no member named 'begin'
Orologio_Binario_BCD.cpp: In function 'void loop()':
Orologio_Binario_BCD:58: error: 'class DateTime' has no member named 'second'
Orologio_Binario_BCD:59: error: 'class DateTime' has no member named 'minute'
Orologio_Binario_BCD:60: error: 'class DateTime' has no member named 'hour'

Ho trovato nei miei sketch questo. Non posso provarlo perché non sono a casa, ma ce l'ho registrato col nome "attiny_ds1307.pde". Prova a vedere se ti funziona.

#include "TinyWireM.h"
#include <stdlib.h>
#include "NewSoftSerial.h"

#define TEMP_PIN 1
#define SERIAL_RX 4
#define SERIAL_TX 5

#define DS1307_ADDR 0x68

unsigned long time_next_reading;
boolean flag;
int count;

//int tempC = 0;                          // holds temp in C
char temperature[10];
byte seconds,minutes,hours,day_of_week,days,months,years,PM,hour12,DST;
char timeString[10];                    // HH:MM 12 Hr. no AM/PM or 24 Hr (based on param)
char dateString[10];                    // MM/DD or DD/MM (based on param)- no year
bool HR24; 

NewSoftSerial mySerial(SERIAL_RX, SERIAL_TX);

void setup() {
    
    TinyWireM.begin();                    // initialize I2C lib
    delay(3000);
    mySerial.begin(9600);
    flag=true;
    count=0;
    time_next_reading=millis()+1000;

}


void loop(){

    if (millis()>time_next_reading) {
        Get_Temp();                           // read current temperature
        Get_Time();                           // read current time
        mySerial.print("Temp: ");
        mySerial.println(temperature);
        mySerial.println(timeString);
        mySerial.println(dateString);
        mySerial.println();
        time_next_reading=millis()+1000;
    }
    
}


void Get_Temp(){  
float i,  x;
int ii;
    
    x = analogRead(TEMP_PIN);
    i =  (((x / 1023.0) * 5.00) - 2.7315) * 100.0;
    dtostrf(i, 5, 1, temperature);
}


void Get_Time(){         // get the time and date from the DS1307 chip
    byte wireRet = 0;
    
    memset(timeString,0,sizeof(timeString));  // initialize the strings
    memset(dateString,0,sizeof(dateString));

    TinyWireM.beginTransmission(DS1307_ADDR); // reset DS1307 register pointer 
    TinyWireM.send(0); 
    wireRet = TinyWireM.endTransmission(); 
    if (wireRet) {                            // report any send esrrors
        mySerial.print("TX error: ");
        mySerial.println(wireRet,DEC);
        delay(1500);
    }
    wireRet = TinyWireM.requestFrom(DS1307_ADDR, 7);    // request 7 bytes from DS1307
    if (!wireRet) {                                      // report any receive esrrors
        mySerial.print("RX error: ");
        mySerial.println(wireRet,DEC);
        delay(1500);
    }
    seconds = bcdToDec(TinyWireM.receive());  // handle the 7 bytes received
    minutes = bcdToDec(TinyWireM.receive());      
    hours = bcdToDec(TinyWireM.receive());        
    day_of_week = TinyWireM.receive();    
    days = bcdToDec(TinyWireM.receive());          
    months = bcdToDec(TinyWireM.receive());      
    years = bcdToDec(TinyWireM.receive());  
    // deal with AM/PM global and 12 hour clock 
    if (hours >= 12) {
        PM = true;
    } else {
        PM = false;
    }
    if (hours > 12) {
        hour12 = hours - 12;
    } else {
        hour12 = hours;
    }
    if (hours == 0) {
        hour12 = 12;
    }

    // make time string
    if (HR24) {
        AppendToString (hours,timeString);   // add 24 hour time to string
    } else {
        AppendToString (hour12,timeString);       // add 12 hour time to string
    }
    strcat(timeString,":");
    if (minutes < 10) {
        strcat(timeString,"0");
    }
    AppendToString (minutes,timeString);           // add MINUTES to string
    if (!HR24) {
        if (hours >= 12) {
            strcat(timeString," PM");   // deal with AM/PM
        } else {
            strcat(timeString," AM");
        }
    }
    // make date string
    if (HR24) {
        AppendToString (days,dateString);     // add DAY to string
    } else {
        AppendToString (months,dateString);       // add MONTH to string
    }
    strcat(dateString,"/");
    if (HR24) {
        AppendToString (months,dateString);   // add MONTH to string
    } else {
        AppendToString (days,dateString);         // add DAY to string
    }
    strcat(dateString,"/");
    if (years < 10) {
        strcat(dateString,"0");
    }
    AppendToString (years,dateString);             // add YEAR to string
}


void AppendToString (byte bValue, char *pString){ // appends a byte to string passed
    char tempStr[6];
    memset(tempStr,'\0',sizeof(tempStr));
    itoa(bValue,tempStr,10);
    strcat(pString,tempStr);
}


byte bcdToDec(byte val) {               // Convert binary coded decimal to normal decimal numbers
    return ((val / 16 * 10) + (val % 16));
}