А вот это ATtiny85 выполнит ????? Код (C++): unsigned long time4 = 0; const byte ledPin = 12; const byte maxVoltage =5;// максимально возможное измеряемое напряжение void setup() { pinMode(ledPin, OUTPUT); } void loop() { if(millis()>=(time4+1000)) // если прошло 5 секунд то проверяем напряжение { float voltage = map(analogRead(A4),0,1060,0,maxVoltage*100)/100.0; time4=millis();// засекаем время if(voltage<2.8) blink(); } } void blink() { for(int i=0;i<10;i++) { digitalWrite(ledPin, HIGH); delay(250); digitalWrite(ledPin, LOW); delay(250);} }
Выберите в IDE "Плата - Attiny85/DigiSpark", если скомпилируется, то с 90%-й вероятностью и запустится.
Как минимум А4 не поймет Тиня 85. )) Да и прочие ledPin = 12; А если пины правильные подставить, то компилируется без проблем. 27% памяти занимает всего.
Будет работать. Замените лед пин, например на 1, а аналоговый на A1 и все ок. Только вопрос по самому коду. Зачем в лупе делать паузы по таймеру, при том что в блинке используются delay()? Других задач кроме замера напряжения каждые 5 сек с миганием по факту заряда программа не выполняет. Сделайте все через два delay() и один if(). Код (C++): #define ledPin 1 #define analogPin A1 #define maxVoltage 5 // максимально возможное измеряемое напряжение #define pause 5000 // период замера void setup() { pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); } void loop() { float voltage = map(analogRead(analogPin), 0, 1060, 0, maxVoltage * 100) / 100.0; if (voltage < 2.8) { for (byte i = 0; i < 20; i++) { digitalWrite(ledPin, !digitalRead(ledPin)); delay(250); } } delay(pause); } А если убрать delay(pause) так и вовсе будет мигать сразу после снижения напруги ниже 2.8 безостановочно.
Ну или сделать по уму без dealy() вообще: Код (C++): #define ledPin 1 #define analogPin A1 #define maxVoltage 5 // максимально возможное измеряемое напряжение #define pause 5000 // период замера #define mig 250 // частота мигания unsigned long timerMeas; unsigned long timerMig; float voltage; void setup() { pinMode(ledPin, OUTPUT); } void loop() { if ((millis() - timerMeas) > pause) { // пора замерять voltage = map(analogRead(analogPin), 0, 1060, 0, maxVoltage * 100) / 100.0; timerMeas = millis(); } if ((millis() - timerMig) > mig) { // пора мигать (voltage < 2.8) ? digitalWrite(ledPin, !digitalRead(ledPin)) : digitalWrite(ledPin, LOW); timerMig = millis(); } } ] Пока напруга выше 2.8В - светодиод не горит, когда ниже - мигает. И еще, вместо огромной формулы приведения показания аналогового пина к вольтажу, я бы вычислил непосредственные показания на этом пине при 2,8В и сверял бы с ними. Это примерно 573 (не забываем про AREF). В таком случае код упрощаем сокращаем до: Код (C++): #define ledPin 1 #define analogPin A1 #define pause 5000 // период замера #define mig 250 // частота мигания #define minVoltage 574 // минимальное напряжение unsigned long timerMeas; unsigned long timerMig; unsigned int voltage; void setup() { pinMode(ledPin, OUTPUT); } void loop() { if ((millis() - timerMeas) > pause) { // пора замерять voltage = analogRead(analogPin); timerMeas = millis(); } if ((millis() - timerMig) > mig) { // пора мигать (voltage < minVoltage) ? digitalWrite(ledPin, !digitalRead(ledPin)) : digitalWrite(ledPin, LOW); timerMig = millis(); } } И получаем всего 11% использованной памяти МК. Можно чего нибудь еще на него повесить, либо перейти на Attiny13. )