|
|
| Il software è più provapila che altro...
/* Per ATTINY85: 1: I/O5 PB5 A0 RS 2: I/O3 PB3 A3 3: I/O4 PB4 A2 - Uscita per auricolare per Geiger 4: GND 5: I/O0 PB0 MOSI SDA - Uscita per LED provapila/Geiger 6: I/O1 PB1 MISO 7: I/O2 PB2 A1 SCLK SCL INT0 - Ingresso per sonda Geiger 8: Vcc */
#include<avr/sleep.h> byte state; volatile byte P;
void particella() {P=1;} // ISR(INT0_vect){}
void setup() { pinMode(0, OUTPUT); pinMode(2, INPUT); pinMode(2, INPUT_PULLUP); // Pull-up per il collettore del transistor. pinMode(4, OUTPUT);
PORTB|=0b00000001; // Appena acceso, accende il LED. delay(1000); PORTB&=0b11111110; // Dopo un secondo lo spegne. delay(1000); readVcc(); // Misura la tensione di alimentazione e genera n (tra 1 e 5).
for(byte n=1; n<=state; n++) // Emette un numero di lampi (tra 1 e 5) proporzionale allo stato di carica. { PORTB|=0b00000001; // Accende il LED su I/O0 = PB0 delay(50); PORTB&=0b11111110; // Spegne il LED su I/O0 = PB0 delay(250); }
attachInterrupt(0, particella, FALLING); // GIMSK |= _BV(INT0); }
void loop() { if(P) // Se una particella ha attivato l'interrupt, ponendo P=1, fa tic e lampeggia. { P=0; tone(3,1000,5); // Fa TIC nell'auricolare. PORTB|=0b00000001; // Accende il LED su I/O0 = PB0 delay(10); // Il LED rimane acceso 10mS. PORTB&=0b11111110; // Spegne il LED su I/O0 = PB0 } }
void readVcc() { // Read 1.1V reference against AVcc
// Set the reference to Vcc and the measurement to the internal 1.1V reference: #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) ADMUX = _BV(MUX5) | _BV(MUX0); #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) ADMUX = _BV(MUX3) | _BV(MUX2); #else ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); #endif
delay(2); // Wait for Vref to settle ADCSRA|=_BV(ADSC); // Imposta a 1 il bit ADSC del registro ADCSRA, facendo iniziare la conversione A/D. while(bit_is_set(ADCSRA,ADSC)); // Attende che il bit ADSC torni a 0, indicando la fine della conversione A/D. uint8_t lowB=ADCL; // must read ADCL first - it then locks ADCH uint8_t highB=ADCH; // unlocks both
long result=(highB<<8)|lowB; result=(1125300L/result)-3200; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000, then 0...1000
if(result>800) state=5; else if(result>650) state=4; else if(result>500) state=3; else if(result>300) state=2; else state=1; }
Edited by Datman - 12/8/2018, 16:17
|
| |