ADMUX = 0b01000000; // 0B0100000 10 bit A0
ADCSRA = 0b11110011; // Делитель частоты на 8
val = (ADCL|ADCH << 8);
Если в условие добавить ещё одну изменяющююся переменную, всё перестаёт работать. Через прерывания ситуация чуть получше, если очень медленно вращать энкодер, то показания успевают считаться.Если ваш код
снабдить выводом по изменению значения, например так:
То скорость будет около 63 000 циклов loop в секунду.C++:int n=0; int old_n=0; void loop() { enc1.tick(); if (enc1.isRight()) n++; if (n!=old_n) { old_n=n; Serial.print(n); } ShowFPS(); }
Однако самое правильное было выводить это все в условии там, где меняется n, как в 1-ом посте работающие примеры, скорость будет 66000 lps
if (millis() - Timer >= 300) {
Timer = millis();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("U=");
lcd.print(U);
lcd.print(L"в");
lcd.setCursor(8,0);
lcd.print("P=");
lcd.print(P);
lcd.print(L"Вт");
lcd.setCursor(0,1);
lcd.print("I=");
lcd.print(I);
lcd.print(L"А");
}
int n=0;
int old_n=0;
void loop() {
a=analogRead(A0);
enc1.tick();
if (enc1.isRight()) n++;
b=a*n;
if (n!=old_n || a!=old_a)
{
old_n=n;
old_a=a;
lcd.clear();
lcd.print(b);
}
dt какое предполагается ?нагрев должен отслеживаться по dT/t, если дельта стала быстро возрастать,
#include <Wire.h>
#include <LCD_1602_RUS.h>
#include <GyverEncoder.h>
#include <nRF24L01.h>
#include <printf.h>
#include <RF24.h>
#include <RF24_config.h>
uint32_t myTimer2;
LCD_1602_RUS lcd(0x27, 20, 4);
byte poza, nov_poza = 2 ;
Encoder enc1(A0, A1, 13);
bool NO, INT = 1;
void setup() {
pinMode(A3, INPUT_PULLUP);
Serial.begin(9600);
enc1.setType(TYPE2);
}
void loop() {
enc1.tick();
if (millis() - myTimer2 >= 500) { // ищем разницу (500 мс)
myTimer2 = millis(); // сброс таймера
NO = !(digitalRead(A3)); // если a больше b, то c = 10
}
if (NO) {
if (INT) {
INT = 0;
lcd.init() ;
lcd.backlight();
lcd.display();
}
if (enc1.isRight())nov_poza = constrain(nov_poza + 1, 1, 4);
if (enc1.isLeft())nov_poza = constrain(nov_poza - 1, 1, 4);
if (poza != nov_poza) {
lcd.setCursor(0, poza - 1);
lcd.print(" ");
lcd.setCursor(0, nov_poza - 1);
lcd.print(">");
poza = nov_poza;
}
}
Serial.print(INT);
Serial.println(NO);
}
if (!SW_state && flags.butt_flag && (debounceDelta > ENC_DEBOUNCE_BUTTON)) {
if (!flags.turn_flag && !flags.hold_flag) { // если кнопка отпущена и ручка не поворачивалась
flags.turn_flag = false;
flags.isRelease_f = true;
}
if (enc.isReleaseHold()) {
Serial.println("encoder released after hold");
}
if (enc.isRelease()) {
Serial.println("encoder released");
}
if (enc.isRightH()) {
Serial.println("R");
}
Если вращение закончено ранее 700мс.Если вращение начато ранее 700 мс
if (!SW_state && flags.butt_flag && (debounceDelta > ENC_DEBOUNCE_BUTTON)) {
if (/*!flags.turn_flag && */!flags.hold_flag) {
//flags.turn_flag = false; // зачем флаг устанавливается в false, если 'false' — это часть условия? :)
flags.isRelease_f = true;
}
Ну вот жеТакой функции, как удержание+кручение не предусмотрено.
boolean isRightH(); // возвращает true при удержании кнопки и повороте направо, сама сбрасывается в false
boolean isLeftH(); // возвращает true при удержании кнопки и повороте налево, сама сбрасывается в false
if (!flagSet) {
flagSet = false;
}