En natt batteri Monitor för trådlösa hörlurar (2 / 5 steg)
Steg 2: Attiny och koden
#include
#ifndef cbi / / denna och sbi är för jävlas med bitar i register.
#define cbi (sfr, lite) (_SFR_BYTE(sfr) & = ~_BV(bit))
#endif
#ifndef sbi
#define sbi (sfr, lite) (_SFR_BYTE(sfr) | = _BV(bit))
#endif
void setup() {//everything är under Inställningar, som vi behöver bara läsa en gång. Processorn återställs i stället för ytterligare avläsningar
analogRead 2, //take en massa avläsningar, som ibland förstabehandlingen från analogRead är opålitliga
analogRead(2);
analogRead(2);
analogRead(2);
analogRead(2);
analogRead(2);
analogRead(2);
analogRead(2);
DDRB = 0x1f; //set ut 5 utgångar till utgång. Detta är pinMode motsvarande 5 gånger
fördröjning (1); //several waits här bara för att se till att läsa är en bra en. Det är inte looping, så några millisekunder försening här och där inte kommer vara ett problem
uint8_t låg, hög; //the låga och höga byte från ADC
ADMUX = 0b00001100; //the värdet av Analog till Digital MUltipleXer (därav ADMUX). Detta läser en internt upparbetad ~1.1V hänskjuta
fördröjning (10), //wait en stund för att ändringarna ska arbeta
SBI (ADCSRA, ADSC); //start "analogRead()"
samtidigt (bit_is_set (ADCSRA, ADSC)); //wait för processorn att avsluta behandlingen
låg = ADCL; //read utdata när det är gjort
hög = ADCH;
int volt = (hög << 8) | låg, //shift de höga bitarna över, eftersom det är en 10 bitars läsa, och därför behöver du två byte
osignerade långa spänning = 1125300L/volt; //convert det att spänningen (angiven i millivolt)
spänning-= 1500; //this är "tomma" spänningen, 0 på displayen
spänning / = 50; / / avdelare, hitta toppen av din range, subtrahera botten och dividera med 30 för att få detta nummer.
PORTB = (spänning & 0b00011111); //mask utdata till bara de fem lägre bitar (som är förmodligen onödigt, men inte kan hiurt), och lägga ut det till stift
fördröjning (3000); //give oss tre sekunder för att se utdata
PORTB = 0; //and inaktivera lysdioderna.
DDRB = 0; //set dem till hög imedence att spara ström
CBI(ADCSRA,ADEN); / / stänga Analog till Digital omvandlare av
set_sleep_mode(SLEEP_MODE_PWR_DOWN); ställa in den att stänga så fullständigt som möjligt, för minimal strömförbrukning
PRR = PRR | 0b00001111; //this linje stängs av i princip allt när det går in i viloläge
sleep_enable (); //allow enheten ange viloläge,
sleep_mode (); //and slutligen stänga av. Vi behöver aldrig avsluta viloläget, eftersom det så när återställs automatiskt.
}
void loop() {}; //we inte behöver detta för att göra något