#include <TinyWireM.h>
#include <Tiny4kOLED.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#define REFERENCE 1.1 //Для измерения В аккумулятора
int procent;//процент заряда аккума
volatile int pat; //шарики
int pot = 500;
unsigned long last_time; // время милис
float ir; //флаг изменеия
byte hu;
bool it = 0; //очищает 10-
bool iy = 0; //очищает 100-
byte iee = 0; // для еепром
int itee = 0; // отладка
bool ip = 0; // чтоб не считал 0--
bool ipo = 0; //для отладки еепрома боол
int ttt = 0; // отладка
//для измерение батарейки. Снятие показаний
uint16_t getADC(void) {
ADCSRA = (0x01 << ADEN) | (0x01 << ADPS2) | (0x01 << ADPS1) | (0x01 << ADPS0);
ADMUX = (0x01 << MUX3) | (0x01 << MUX2);
_delay_ms(20); // стояла 2мс
ADCSRA |= (0x01 << ADSC);
while (ADCSRA & (0x01 << ADSC));
return (uint16_t)ADCL | ((uint16_t)ADCH << 8);
}
//для измерение батарейки. Перевод в показания В
float adcToVcc(uint16_t adc) {
return (REFERENCE * 1023.0) / adc;
}
// ============================================================================
void setup() {
GIMSK = 0b00100000; // turns on pin change interrupts
PCMSK = 0b00000010; // turn on interrupts on pins PB0, PB1, &amp; PB4
sei(); // enables interrupts
pat = eeprom_read_word(30); //еепром. Чтение ЕЕПРОМ
itee = eeprom_read_word(50); //еепром отладка
// This example is for a 128x64 screen Для дисплея
oled.begin(128, 64, sizeof(tiny4koled_init_128x64br), tiny4koled_init_128x64br);
oled.clear();
oled.on();
pinMode(PB4, INPUT); //Ресет
delay (300);
if (ip == 0){
ip = 1;
if (analogRead(A3) > 600){ // при первом примыкании минусует 4 шара
if (pat >= 4);{
pat = pat - 4;
if (pat <= 0) {
pat = 0;
}
}
}
}
}
//-------------------------------------------------------------------------------------------------------
void loop() {
if (digitalRead(PB4) == 1){
if (ipo == 0){
eeprom_update_word(50, pat);
ipo++;
}
pat = 0;
oled.clear();
}
// отображение % заряда аккумулятора
if (millis() - last_time > 500) {
last_time = millis();
procent = ((adcToVcc(getADC()) - 2.5)/1.1)*100;
//отображение заряда аккумулятора
oled.setFont(FONT6X8); // шрифт
oled.setCursor(35, 23);
oled.print("% "); oled.print (procent);
oled.setCursor(35, 22);
//ttt = eeprom_read_word(30);
// инфа для отладки на дисплей.
oled.print (analogRead(A3)); //для теста
oled.setCursor(80, 22);
oled.print (iee);
oled.setCursor(60, 22); //для теста через еепром какое сопротивление
oled.print (itee);
if (analogRead(A3) <= 600){ // шары +
oled.setFont(FONT6X8);
oled.setCursor(80, 23);
oled.print ("L");
} else {
oled.setFont(FONT6X8); // шары -
oled.setCursor(80, 23);
oled.print ("P");
}
// отладочная информация
}
//запись
if (analogRead(A3) <= 480){ //запись 520
if (iee == 0) {
eeprom_update_word(30, pat);
iee = 1;
}
}
// Отображение на дисплеи количество шаров
if (pot != pat){
pot = pat;
oled.setFontX2Smooth(FONT8X16CAPS); // шрифт
oled.setCursor(45, 2);
oled.print(pat);
// количестко шаров обнуление лишних нулей на дисплеи с 100 в 10, и с 10 в 1
if (pat >= 10){
it = 1;
}
if (pat <= 9){
if (it==1) {
oled.setFontX2Smooth(FONT8X16CAPS); // шрифт
oled.setCursor(45, 2);
oled.print("9 ");
it = 0;
}
}
if (pat >= 100){
iy = 1;
}
if (pat <= 99){
if (iy==1) {
oled.setFontX2Smooth(FONT8X16CAPS); // шрифт
oled.setCursor(45, 2);
oled.print("99 ");
iy = 0;
}
}
}
}
// Интеруп ИК подсчета.
ISR(PCINT0_vect){
if((PINB & 0b00000010) == 0 ) { //читает порт на 1 или 0
if (millis() - last_time > 6) {
last_time = millis();
if (analogRead(A3) <= 600){
pat++;
} else {
if (pat > 0) {
pat--;
}
}
}
}
}