OK, attiny nuovo vita nuova
nessun probelma di timing con questo, anche se dopo aver fatto qualche prova credo che convenga tenere un qualche percento più bassa la velocità, la trasmissione va bene lo stesso ma sembra che ci sia più margine d'errore verso il basso che verso l'alto
diamo per assodato che lo attiny precedente avessa qualche problema, non saprei che altro dire
ecco il risultato della serata di programmazione disperata
#include <SoftwareSerial.h>
#define RX 1 // *** D1, Pin 6
#define TX 2 // *** D2, Pin 7
#define LED 4 // *** D4, Pin 3
#define AT 0 // *** D0, pin 4
SoftwareSerial Radio(RX, TX);
unsigned long int tempo;
int temp; // temperatura in centesimi di grado
int oldt; // vecchia temperatura
// Librerie termometro
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 3 // *** D3, Pin 2
// Su il protocollo onewire
OneWire oneWire(ONE_WIRE_BUS);
// dichiariamo un termometro sul bus unewire
DallasTemperature sensors(&oneWire);
#define TEMPOSTABILE 20000
#define INDIRIZZO 'A'
#define START '#'
char messaggio[] = "#A0123x"; // inizializzare stringa di trasmissione
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <avr/power.h>
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
EMPTY_INTERRUPT(WDT_vect)
void setup(void)
{
pinMode(4, OUTPUT);
pinMode(AT, OUTPUT);
digitalWrite(4, 0);
digitalWrite(AT, 1);
Radio.begin(9600);// sembra sia meglio tenere le velocità casomai un poco piu' basse
}
void loop(void)
{
digitalWrite(4, 1); // energia al termometro
delay(TEMPOSTABILE);// per dare il tempo di stabilizzarsi
sensors.begin();
// leggo
sensors.requestTemperatures(); // Send the command to get temperatures
temp = sensors.getTempCByIndex(0) * 100;
if (temp < 0)
{
temp = 0;
}
if (temp > 9000)
{
temp = 9000;
}
digitalWrite(4, 0);
// spengo il termometro
// ora, solo se la temperatura è cambiata
if (abs(temp - oldt) > 50)
{
// solo se è cambiata piu' di mezzo grado
oldt = temp;
trasmetti();
}
Sleep_now(1, 7); //quanti cicli di sleep, divisore
// 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
// 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
}
void trasmetti(void)
{
messaggio[0] = START;
messaggio[1] = INDIRIZZO;
messaggio[5] = temp % 10 + '0';
temp = temp / 10;
messaggio[4] = temp % 10 + '0';
temp = temp / 10;
messaggio[3] = temp % 10 + '0';
temp = temp / 10;
messaggio[2] = temp % 10 + '0';
messaggio[6] = '\0';
messaggio[6] = checkchar(messaggio);
messaggio[7] = '\0';
// accendo la radio
digitalWrite(AT, 0); // abbasso set
delay(80); //tempo di reazione
digitalWrite(AT, 1); // alzo set, radio accesa
delay(200); // tempo di reazione, adesso è ON
Radio.begin(9600);// sembra sia meglio tenere le velocità casomai un poco piu' basse
delay(100);
Radio.print(messaggio);
delay(80);
// spengo la radio
digitalWrite(AT, 0); // abbasso set
delay(80); //tempo di reazione, adesso siamo in AT mode
Radio.print("AT+SLEEP");
delay(40);
// via set
digitalWrite(AT, 1);
// adesso la radio è spenta
}
void Config_wdt(byte timeout)
{
cli();
wdt_reset(); // reset watchdog timer
MCUSR &= ~(1 << WDRF); // clear reset flag
WDTCR = (1 << WDE) | (1 << WDCE); // enable watchdog
WDTCR = (1 << WDIE) | timeout; // watchdog interrupt instead of reset
//+reset, timeout can be 15,30,60,120,250,500ms or 1,2,4,8s
sei();
}
void Sleep_now(byte i, byte timeout)
{
// 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
// 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
Config_wdt(timeout);
for (byte y = i; y > 0; --y)
{
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // set type of sleepmode
power_all_disable(); // disable unneeded loads
wdt_reset(); // timer should start at zero
sleep_enable(); // approach sleep mode
sleep_mode(); // enter sleep mode (confirm)
sleep_disable(); // entrance point when woken up
power_all_enable(); // re-enable the loads
}
}
char checkchar(char messaggio[])
{
// restituisce il carattere di controllo per il messaggio in ingresso
// una cosa semplice, non troppo elaborata
byte appoggio = 0;
byte index = 0;
while (messaggio[index])
{
appoggio = ((appoggio >> 1) | (appoggio << 7)) ^ messaggio[index++];
}
return (char)(appoggio % 93) + 33;
}
che manda in sleep lo attiny per un tempo programmabile
dopo lo sleep legge la temperatura, preaccendendo il termometro per 20 secondi (essi' un'eternità, ma tant'è)
spegne il termometro
solo se la temperatura è cambiata, ricrea la stringa di trasmissione: START INDIRIZZO valore e checksum
sveglia la radio dal sonno
trasmette
e rimanda a nanna la radio
manca da sviluppare la parte che ritrasmette in mancanza di un ack dalla centrale
quella domani, oggi sono steso
buonanotte a voi del forum, e grazie per l'aiuto