После отключения считает слева направо

А код то где? В том что выложен переменная а нигде не используется. Как из памяти переменные достаются не видно. Код секретный? Так даже по той малости что есть видно что колбасить должно железо. Гистерезиса по температуре совсем нет.

Да есть она, шаг регулировки это.

Это циклично происходит все время выполнения программы? Не надо так. Считали,сравнили, если надо- пишем заново. Так у Вас пустой перезаписи не будет. И перечитайте документацию к библиотеке EEPROM.

1 лайк

Я так понял, такая ошибка выходит из-за eeprom?

Загрузил скетч: работает нормально, и счетает как положено 1,2,3… и так далее.
Только отключаешь питание или просто перезагружаешь и он начинает считать от десяток то есть 11,21,31… и так далее. Значения после перезагрузки сохраняются как положено, как выставил на Tv или Tn так и показывает.

#include <EEPROM.h>
#include <OneButton.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);

#define B 3950 // B-коэффициент термистора
#define SERIAL_R 102000 // сопротивление последовательного резистора, 102 кОм
#define THERMISTOR_R 100000 // номинальное сопротивления термистора, 100 кОм
#define NOMINAL_T 25 // номинальная температура (при которой TR = 100 кОм)

const byte tempPin = A0;
int NASOS = 2;
int relem = 12; 

uint8_t addr = 0;
uint8_t addr1 = 1; 

#if defined(ARDUINO_AVR_UNO) || defined(ARDUINO_AVR_NANO_EVERY)
#define PIN_INPUT1 3
#define PIN_INPUT2 4
#define PIN_INPUT3 5
#define PIN_INPUT4 6
#define PIN_INPUT5 7
#endif
  
int8_t verh = 0;
int8_t niz = 0;
int8_t a=1;

OneButton button1(PIN_INPUT1, OUTPUT);
OneButton button2(PIN_INPUT2, OUTPUT);
OneButton button3(PIN_INPUT3, OUTPUT);
OneButton button4(PIN_INPUT4, OUTPUT);
OneButton button5(PIN_INPUT5, OUTPUT);

void setup() {
    Serial.begin( 9600 );
    pinMode( tempPin, INPUT );
   
    pinMode(NASOS, OUTPUT);
    pinMode(relem, OUTPUT);
    lcd.init();  
    lcd.backlight();
 lcd.clear();
   button1.attachClick(click1);
  button2.attachClick(click2);
  button3.attachClick(click3);
  button4.attachClick(click4);
  button5.attachClick(click5);

  }
void loop() {
    int t = analogRead( tempPin );
    float tr = 1023.0 / t;
    tr = SERIAL_R /tr;
  float temperatura;
    temperatura = tr / THERMISTOR_R; // (R/Ro)
    temperatura = log(temperatura); // ln(R/Ro)
    temperatura /= B; // 1/B * ln(R/Ro)
    temperatura += 1.0 / (NOMINAL_T + 273.15); // + (1/To)
    temperatura = 1.0 / temperatura; // Invert
    temperatura -= 273.15; 
     
  if(temperatura >= verh) digitalWrite(NASOS,HIGH);
  if(temperatura <= niz) digitalWrite(NASOS,LOW);
    lcd.setCursor(0,0);
    lcd.print("T:");
    lcd.print(temperatura);
    
    lcd.setCursor(0,1);
    lcd.print("Tv:");
    lcd.print(verh);

    lcd.setCursor(9,1);
    lcd.print("Tn:");
    lcd.print(niz);
if (niz >= 1)EEPROM.write(addr1, niz);
   niz = EEPROM.read(addr1);
 if (verh >= 2)EEPROM.write(addr, verh);
   verh = EEPROM.read(addr);

  int st = 85;  
  if(temperatura >= st) digitalWrite(relem,HIGH);
else digitalWrite(relem,LOW);
  button1.tick();
  button2.tick();
  button3.tick();
  button4.tick();
  button5.tick();

    delay(10);
}  
void click1() {
  niz = ++a;
} 
void click2() {
 niz = --a;
 }
void click3() {
 verh = ++a;
}
void click4() {
verh = --a;

}
void click5() {

@Alexei.kz
Опять какой- то огрызок вместо скетча, обрывающийся на середине.
Неужели так трудно просто скопировать весь код и вставить в сообщение?

А сверху по вашему что?

По твоему, код может закачиваться на открывающей скобке?

Куда тебе программировать, парень, если ты код даже скопировать не а состоянии?

1 лайк

Прежде чем читать из EEPROM, в него надо что-то записать
стр.79, 81(#29). Запишите нужные значения в setup();

Я так думал это и есть запись того что выставляю кнопками на Tv и Tn

При запуске программы niz = 0. Что будет дальше?

Далее кнопкой
void (click1){
niz = ++a
}
Добавляю по единице к значению Tn-это нижнее положение температуры при котором отключается мысленный насос

Тем самым настраиваю положение включение и отключение насоса

Здесь сравнивает значение термистора и выставленного значения на Tn

#include <EEPROM.h>
#include <OneButton.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);

#define B 3950 // B-коэффициент термистора
#define SERIAL_R 102000 // сопротивление последовательного резистора, 102 кОм
#define THERMISTOR_R 100000 // номинальное сопротивления термистора, 100 кОм
#define NOMINAL_T 25 // номинальная температура (при которой TR = 100 кОм)

const byte tempPin = A0;
int NASOS = 2;
int relem = 12; 

uint8_t addr = 0;
uint8_t addr1 = 1; 

#if defined(ARDUINO_AVR_UNO) || defined(ARDUINO_AVR_NANO_EVERY)
#define PIN_INPUT1 3
#define PIN_INPUT2 4
#define PIN_INPUT3 5
#define PIN_INPUT4 6
#define PIN_INPUT5 7
#endif
  
int8_t verh;
int8_t niz;
EEPROM.get(0,verh);
EEPROM.get(1,niz);
int8_t a=1;

OneButton button1(PIN_INPUT1, OUTPUT);
OneButton button2(PIN_INPUT2, OUTPUT);
OneButton button3(PIN_INPUT3, OUTPUT);
OneButton button4(PIN_INPUT4, OUTPUT);
OneButton button5(PIN_INPUT5, OUTPUT);

void setup() {
    Serial.begin( 9600 );
    pinMode( tempPin, INPUT );
   
    pinMode(NASOS, OUTPUT);
    pinMode(relem, OUTPUT);
    lcd.init();  
    lcd.backlight();
 lcd.clear();
   button1.attachClick(click1);
  button2.attachClick(click2);
  button3.attachClick(click3);
  button4.attachClick(click4);
  button5.attachClick(click5);

  }
void loop() {
    int t = analogRead( tempPin );
    float tr = 1023.0 / t;
    tr = SERIAL_R /tr;
  float temperatura;
    temperatura = tr / THERMISTOR_R; // (R/Ro)
    temperatura = log(temperatura); // ln(R/Ro)
    temperatura /= B; // 1/B * ln(R/Ro)
    temperatura += 1.0 / (NOMINAL_T + 273.15); // + (1/To)
    temperatura = 1.0 / temperatura; // Invert
    temperatura -= 273.15; 
     
  if(temperatura >= verh) digitalWrite(NASOS,HIGH);
  if(temperatura <= niz) digitalWrite(NASOS,LOW);
    lcd.setCursor(0,0);
    lcd.print("T:");
    lcd.print(temperatura);
    
    lcd.setCursor(0,1);
    lcd.print("Tv:");
    lcd.print(verh);

    lcd.setCursor(9,1);
    lcd.print("Tn:");
    lcd.print(niz);
/*
if (niz >= 1)EEPROM.write(addr1, niz);
   niz = EEPROM.read(addr1);
 if (verh >= 2)EEPROM.write(addr, verh);
   verh = EEPROM.read(addr);
*/
  int st = 85;  
  if(temperatura >= st) digitalWrite(relem,HIGH);
else digitalWrite(relem,LOW);
  button1.tick();
  button2.tick();
  button3.tick();
  button4.tick();
  button5.tick();

    delay(10);
}  
void click1() {
  niz = ++a;
} 
void click2() {
 niz = --a;
 }
void click3() {
 verh = ++a;
}
void click4() {
verh = --a;

}
void click5() {
    EEPROM.put(0,verh);
    EEPROM.put(1,niz);
}
1 лайк

@Yurik
Спасибо, что решил помочь болезному :slight_smile:
А то автор сам, наверно, никогда бы код не выложил

1 лайк

всё неправильно идеологически:

  1. Расписать структуру EEPROM в самой структуре должен быть флаг использования EEPROM
  2. Сформировать процедуру инициализации EEPROM первичными значениями с записью в EEPROM флага
  3. При старте в setup() проверяем флаг и если он выставлен значения уставок берём из EEPROM если нет пишем в EEPROM наши уставки по умолчанию и используем их

А вот дальше уже всё остальное и, только в этом случае можно говорит, что не так с EEPROM

1 лайк

Спасибо тебе Добрый человек, вечером загружу и посмотрю что выйдет. Единственный адекватный человек, без лишнего пафоса.

Ок спасибо

Да все тут одинаковые. Я ж не знаю заработает или нет)
Выше ув. ua6em написал, как правильно.

1 лайк