Проблема с кодом

dn_prince
Offline
Зарегистрирован: 21.01.2017

Здравствуйте форумчане!

Собрал одометр по счетчику нажатий кнопок на ардуино. Кнопок две. Счетчик работает, но при мониторинге счетчик начинает с нуля. Т.е. когда ардуино подключен к бп и подключаю телефон для мониторинга, то предыдущие значения обнуляются и начинается всё заного. При подключении к компьютеру и включении Мониторг порта в Arduino IDE так же самая история. Предназначение устройства, поставить на ночь ардуино и считать пробег, утром подключить телефон и посмотреть результат.

 

const int rt = 200;
const int buttonPin = 5; //  кнопка (1)
const int button1Pin = 6; //кнопка (2)
bool button_old = 1; // предыдущее значение button0
bool button1_old = 1; // предыдущее значение button1
int count = 0;         // переменная для подсчета нажатий на кнопку
float rast_m = 0;      // переменная для подсчета расстояния в метрах
int rast_km = 0;       // переменная для подсчета расстояния в километрах

void setup() {
  Serial.begin(9600);
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(button1Pin, INPUT_PULLUP);
}
void loop() {
  bool button = digitalRead(buttonPin);
  if (!button && button_old) {
    button_old = 0;
    delay(rt);// ждем чтобы дребезг прошел
    count = count + 1;
    //Serial.println(count);
     rast_m = count * 2 * 3.14 * 89 / 1000 ;
     Serial.print("Пробежал ");
     Serial.print(rast_m );
     Serial.print(" м. или ");
     Serial.print(rast_km);
     Serial.println(" км.");
  }
  if (button && !button_old) {
    button_old = 1;
    delay(rt);// ждем чтобы дребезг прошел
  }

  bool button1 = digitalRead(button1Pin);
  if (!button1 && button1_old) {
    button1_old = 0;
    delay(rt);// ждем чтобы дребезг прошел
    count = count + 1;
    //Serial.println(count);
     rast_m = count * 2 * 3.14 * 89 / 1000;
     //Serial.println(rast_m; "m ili"; rast_km; "km");
     Serial.print("Пробежал ");
     Serial.print(rast_m );
     Serial.print(" м. или ");
     Serial.print(rast_km);
     Serial.println(" км.");
  }
  if (button1 && !button1_old) {
    button1_old = 1;
    delay(rt);// ждем чтобы дребезг прошел
  }

}

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Что в этом удивительного? Когда компьютер выключаете/включаете - он тоже всё с начала начинает.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Все правильно, если данные не сохранены в EEPROM, то после отключения питания они исчезают ))

Kakmyc
Offline
Зарегистрирован: 15.01.2018

А то что при подключении к компорту происходит перезагрузка Ардуино, за это спасибо преобразователю usb-ttl скажите.
Рекомендации по лечению ищите в сети.

Moro_500
Offline
Зарегистрирован: 08.03.2021

еепром хорошая весч

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Можно перейти на ESP. Там ничего не перезагружается. Но EEPROM, разумеется, никто не отменял при этом. Только надо понять, как часто его теребонькать придется новыми значениями. Можно длинный кольцевой буфер запилить на весь размер

Moro_500
Offline
Зарегистрирован: 08.03.2021

если точность не критична, то может сохранять в еепром каждые 10 или 100 оборотов?

Rumata пишет:
кольцевой буфер

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

Вавена
Offline
Зарегистрирован: 07.05.2019

Помогите чайнику при проверке кода выдается ошибка:

Arduino: 1.6.4 (Windows 7), Плата"Arduino Uno"

Изменена опция сборки, пересобираем все

inkubator.ino: In function 'void loop()':

inkubator:191: error: 'EEPROM_read' was not declared in this scope

inkubator.ino: In function 'void startInk()':

inkubator:275: error: 'EEPROM_read' was not declared in this scope

inkubator:287: error: 'EEPROM_write' was not declared in this scope

inkubator:291: error: 'EEPROM_write' was not declared in this scope

inkubator.ino: In function 'void bird_setup()':

inkubator:322: error: 'EEPROM_read' was not declared in this scope

inkubator:331: error: 'EEPROM_write' was not declared in this scope

и так далее оп всему скетчу.

Где и как объявить ? Приведу кусочек где ругается: 

  SerialReceive();

    SerialSend();
    serialTime += 500;
  }
  EEPROM_read(1, startDayUnixtime);                                         (строка 191)
  currentDay = (currentTime_day - startDayUnixtime);
 
  EEPROM_read(17, bird);
  for (int d = 3; d >= 0; d--) {
    if (currentDay < r_array[bird][d][0]) {
      needTemp = float(r_array[bird][d][1] / 10.0);
      needHum = float(r_array[bird][d][2] / 10.0);
/////////////
  button_read();
    EEPROM_read(1, memoryDay);                                             (строка 275)
    //Serial.print(currentTime_day);
    //Serial.print("-");
    //Serial.print(memoryDay);
    //Serial.print("=");
    //Serial.println(currentTime_day-memoryDay);
    if (button_enter) {
      delay(del);
      lcd.clear(); //очищаем экран
      break;
    }
    if (button_minus) {
      EEPROM_write(1, currentTime_day);                               (строка 287)      
      lcd.clear();
    }
    if (button_plus) {
      EEPROM_write(1, memoryDay - 1);
      lcd.clear();

 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Moro_500 пишет:

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

Если, как у ТСа, нужно хранить один единственный уинт32 - уапще легко! Быстро пробежаться на старте по килобайту и найти ячейку с содержимым !=0 вопрос пары сотен миллис. 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Вавена пишет:

Быстренько, пока старшие веки не разлепили на этот ужас, поправьте сообщение в соответствии с правилами вставки кода. Код отдельно, письмо от компилатора отдельно

Вавена
Offline
Зарегистрирован: 07.05.2019

Код:

#include <PID_v1.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM2.h>
#include "RTClib.h"
#include <DallasTemperature.h>
#include <OneWire.h>
//#include <Sensirion.h>
#include <avr/wdt.h>
#include <Encoder.h>
#include "Adafruit_HTU21DF.h"


int del = 80;                     // переменная ожидания между выборами меню
unsigned int interval = 300;      // интервал сколько будет длиться цикл while, после чего перейдёт к следующему меню.(кол-во итераций)
//#define EXT_HEATING                  // ИСПОЛЬЗУЕМ ДОП.НАГРЕВАТЕЛЬ ВМЕСТО УВЛАЖНИТЕЛЯ. Если нужен увлажнитель, просто закомментируйте эту строку.
#define heater_pin 13                  // нагреватель
#define humidifer_pin 12               // увлажнитель
#define fan_pin 11                     // вентилятор
#define alarm_pin 14                   // пин аварии
#define beeper_pin 9                   //пищалка по аварии
#define dataPin 5                      //SHT10
#define clockPin 6                     //SHT10 
#define turn_pin 10                    // управление поворотом
#define extend_heater_pin 8          // дополнительный нагреватель
#define button_minus_pin 2            //пин кнопки "минус"    роскоментировал кнопки
#define button_plus_pin 3             //пин кнопки "плюс"
#define button_enter_pin 4            //пин кнопки "enter"
#define DS18B20_Pin 7                 //пин термометра
#define setSampleTime 300            //время цикла ПИД
#define voltmeter_pin 1               //вход А1 через делитель (22к/10к) подключен к питанию модуля. Измеряет до 16В.
#define T_correction -0.1             // коррекция температуры SHT10
#define h_histeresis 1.0              // гистерезис влажности
#define door_pin 16                 // пин открытой двери (А2)

//boolean button_minus;                // статус нажатия кнопок
//boolean button_plus;               
//boolean button_enter;
boolean turnFlag = 0;              // флаг поворота для случайного периода
boolean heater_off;               // флаг запрета нагреателя
boolean needFan;                 // флаг аварийной вентиляции
float humidity;                    // Влажность
float temp1Ink;                    // Температура DS18B20
float temp2Ink;                    // Температура SHT10
float needTemp = 37.6;             // нужная для текущего дня температура инкубации (по умолчанию)
float needHum = 60.5;              // ---- влажность
//float dewpoint;                    // Точка росы

unsigned char button_minus;           // статус нажатия кнопок
unsigned char button_plus;            
unsigned char button_enter;
long oldPosition  = 500;            // позиция энкодера
unsigned int rawData;
unsigned long currentTime;            // задаем переменные для тайминга поворота
unsigned long loopTime;
unsigned long serialTime;             //это поможет нам узнать, когда следует обращаться к обработчику
unsigned long now;
unsigned long trhMillis = 0;           // период опроса датчиков
//byte measActive = false;
//byte measType = TEMP;
const unsigned long TRHSTEP   = 300UL;  // Период опроса датчиков
unsigned int currentDay;                // текущий день в юникс-формате
String birdPrint = "CHICK";

LiquidCrystal_I2C lcd(0x3F, 20, 4);  // инициализация библиотеки дисплея
//SHT1x sht1x(dataPin, clockPin);
OneWire oneWire(DS18B20_Pin);
DallasTemperature sensors(&oneWire);
//Sensirion sht = Sensirion(dataPin, clockPin);
Adafruit_HTU21DF htu = Adafruit_HTU21DF();

double Setpoint, Input, Output;            //объявляем переменные для ПИД
PID myPID(&Input, &Output, &Setpoint, 50, 0.5, 0.1, DIRECT); //Инициализируем ПИД-библиотеку и коэффициенты
int WindowSize = 1000;                  // ширина окна терморегулятора 1 секунда.
unsigned long windowStartTime;
unsigned long alarmDelay;
RTC_DS3231 RTC;
Encoder myEnc(3, 2);
unsigned int startDayUnixtime;           //вписал ! ! !!!
//SimpleTimer timer;

  /*  EEPROM(1) -     temp1Ink (float)
    EEPROM(13) -  set_humidity (float)
    EEPROM(5) -     +-alarmTemp  (float)
    EEPROM(9) -     alarm_fan    (bool)
    EEPROM(11) -    turnPeriod   (int)
    EEPROM(17) -     bird         (int)
 */


////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
  Serial.begin(9600);

  RTC.begin();         // Старт часов
  lcd.begin();          // Старт дисплея
  Wire.begin();        // старт I2C
  lcd.backlight();     // Включаем подсветку дисплея
  windowStartTime = millis();
  //  byte stat;
  //  byte error = 0;
  //  float tempInk;
  //  float set_humidity;
  //  float alarmTemp;

  delay(15);
  wdt_enable (WDTO_8S);                 //взводим сторожевой таймер на 8 секунд.
  myPID.SetOutputLimits(0, WindowSize); //задаем лимиты ширины ПИД-импульса от 0 до 1 секунды.
  myPID.SetMode(AUTOMATIC);             //включаем ПИД-регулирование
  myPID.SetSampleTime(setSampleTime);

  pinMode(extend_heater_pin, OUTPUT);      //пин дополнительного нагревателя. Переводим в 1 чтобы не включать реле.
  digitalWrite(extend_heater_pin, HIGH);
  pinMode(heater_pin, OUTPUT);
  pinMode(turn_pin, OUTPUT);              // устанавливаем выводы
  digitalWrite(turn_pin, HIGH);
  pinMode(humidifer_pin, OUTPUT);
  pinMode(fan_pin, OUTPUT);
  digitalWrite(fan_pin, HIGH);
  pinMode(alarm_pin, OUTPUT);
  digitalWrite(alarm_pin, HIGH);
  //pinMode(button_minus_pin, INPUT_PULLUP); //подтягиваем входы кнопок к плюсу встроенными резисторами
  //pinMode(button_plus_pin, INPUT_PULLUP);
  //pinMode(button_enter_pin, INPUT_PULLUP);
  //pinMode(door_pin, INPUT_PULLUP);
  alarmDelay = millis();
  htu.begin();
  sensors.begin();
  sensors.setResolution(12);            // установить разрешение (точность)
  sensors.setWaitForConversion(false);  // отключить ожидание
  birdSelect();                         // читаем птицу
 // windowStartTime = millis();
  //RTC.adjust(DateTime(__DATE__, __TIME__));   //раскоментируйте для установки системмных даты и времени
   startDayUnixtime = EEPROM.read(1);                      //вписал присвоение памяти  !!!
}

//////////////////////////////////////////////////////////////////////////
void loop() {
  // Input = getTemp();
  unsigned int startDayUnixtime;          // хранящийся в памяти день старта программы в юникс-формате
  //float needTemp = 37.6;                  // нужная для текущего дня температура инкубации (по умолчанию)
  //float needHum = 60.5;                   // ---- влажность
  int ventTime = 2;                       // длительность проветривания
  boolean needTurn = false;               // нужен ли поворот яиц?
  unsigned int currentTime_day;           //текущий день в юникс-формате (сколько дней минуло с 1 января 1970)
  int bird;                         // выбор птицы
  int r_array[6][4][5] = {
    {{2, 382, 650, 0, 1}, {12, 377, 540, 5, 1}, {18, 374, 480, 20, 1}, {20, 371, 855, 10, 0}},  // chick
    {{2, 382, 600, 0, 1}, {12, 376, 600, 3, 1}, {15, 374, 480, 10, 1}, {18, 370, 855, 10, 0}},  // quail
    {{7, 381, 700, 0, 1}, {13, 376, 600, 3, 1}, {25, 373, 560, 20, 1}, {30, 370, 855, 10, 0}},  // duck
    {{15, 380, 610, 5, 1}, {26, 375, 520, 20, 1}, {27, 374, 690, 10, 0}, {35, 370, 800, 0, 0}}, // muskus
    {{2, 382, 600, 0, 1}, {11, 378, 600, 3, 1}, {15, 374, 480, 10, 1}, {18, 370, 855, 10, 0}},  // perepel
    {{6, 379, 560, 0, 1}, {12, 376, 530, 3, 1}, {26, 373, 520, 20, 1}, {30, 370, 855, 10, 0}},  // turkey
  };

  DateTime now = RTC.now();
  currentTime_day = (now.unixtime() / 86400L);
  //timer.run();
  button_read();
  if (button_enter) {
    delay(del);
    lcd.clear();
    menu();
    lcd.clear();
  }
  if (button_minus) {
    delay(del);
    lcd.clear();
    alarmDelay = millis();    // задержка аварии по нажатии кнопки Минус
  }
  if (button_plus) {
    delay(del);
    lcd.clear();
    digitalWrite(turn_pin, !digitalRead(turn_pin));       // включаем/выключаем реле поворота по кнопке Плюс
  }
  if (button_plus && button_plus) {
    delay(del);
    lcd.clear();
    // bottomView = !bottomView;       // переключаем режим показа нижней строки.
  }
  //send-receive with processing if it's time
  if (millis() > serialTime * 5)
  {
    SerialReceive();
    SerialSend();
    serialTime += 500;
  }
  EEPROM_read(1, startDayUnixtime);
  currentDay = (currentTime_day - startDayUnixtime);

  EEPROM_read(17, bird);
  for (int d = 3; d >= 0; d--) {
    if (currentDay < r_array[bird][d][0]) {
      needTemp = float(r_array[bird][d][1] / 10.0);
      needHum = float(r_array[bird][d][2] / 10.0);
      ventTime = r_array[bird][d][3];
      needTurn = r_array[bird][d][4];
    }
  }
  getSensors();
  thermostat(needTemp, needHum);    // влажность передаем только для вывода на дисплей )))
  humidifer(needHum);
  turn(needTurn);
  fan(ventTime);
  alarm(needTemp);
  ext_heater(needTemp);
  //outpuPower();
  wdt_reset();
}


/// чтиаем энкодер ////////////////////////////////////////////////////////////////////////
void button_read() {
  long newPosition = myEnc.read();
  if (newPosition != oldPosition) {
    if (newPosition >= oldPosition + 2) {
      button_plus = 1;
    }
    if (newPosition <= oldPosition - 2) {
      button_minus = 1;
    }
    oldPosition = newPosition;
    //Serial.println(newPosition);
  }
  else {
    button_plus = 0;
    button_minus = 0;
  }

  if (digitalRead(button_enter_pin) == LOW )  {
    delay(del / 2);
    button_enter = 1;
  }
  if (digitalRead(button_enter_pin) == HIGH )  {
    delay(del / 2);
    button_enter = 0;
  }
  if (button_minus || button_plus || button_enter) beeper(50);
  wdt_reset();
}


////меню////////////////////////////////////////////////////////////////
void menu() {
  bird_setup();
  turn_setup();
  alarm_setup();
  vent_setup();
  startInk();
  //data_time_setup();
}


// записываем в память день начала инкубации в юникс-формате////////////
void startInk() {
  unsigned int currentTime_day;
  unsigned int memoryDay;
  DateTime now = RTC.now();
  currentTime_day = (now.unixtime() / 86400L);

  delay(del);
  button_read();
  lcd.setCursor(4, 0);
  lcd.print("START INK");
  delay(1000);
  lcd.clear();
  int x = 0;
  while (1) {
    x++;
    if (x > interval) break;
    button_read();
    EEPROM_read(1, memoryDay);
    //Serial.print(currentTime_day);
    //Serial.print("-");
    //Serial.print(memoryDay);
    //Serial.print("=");
    //Serial.println(currentTime_day-memoryDay);
    if (button_enter) {
      delay(del);
      lcd.clear(); //очищаем экран
      break;
    }
    if (button_minus) {
      EEPROM_write(1, currentTime_day);
      lcd.clear();
    }
    if (button_plus) {
      EEPROM_write(1, memoryDay - 1);
      lcd.clear();
    }
    EEPROM_read(1, memoryDay);
    lcd.setCursor(5, 0);
    lcd.print("DAY = ");
    lcd.print(currentTime_day - memoryDay);
    lcd.setCursor(2, 1);
    lcd.print("ZERO START +1");
    delay(del);
  }
}


//выбираем птицу /////////////////////////////////////////////////////////
void bird_setup() {
  int birdType;
  lcd.clear();
  delay(del);
  button_read();
  lcd.setCursor(4, 0);
  lcd.print("BIRD SETUP");
  delay(1000);
  lcd.clear();
  int x = 0;
  while (1) {
    x++;
    if (x > interval) {
      break;
    }
    button_read();
    EEPROM_read(17, birdType);
    if (button_enter) {
      delay(del);
      lcd.clear(); //очищаем экран
      break;
    }
    if (button_plus) {
      x = 0;
      if (birdType >= 5)      //проверяем, если выше или равно 5,
        EEPROM_write(17, 0);  //пишем в память 0
      else EEPROM_write(17, birdType + 1);
      lcd.clear();
    }
    if (button_minus) {
      x = 0;
      if (birdType <= 0)      //проверяем, если ниже или равно 0,
        EEPROM_write(17, 5);  //пишем в память 5
      else EEPROM_write(17, birdType - 1);
      lcd.clear();
    }
    birdSelect();
    lcd.setCursor(6, 0);
    lcd.print(birdPrint);
    lcd.setCursor(1, 1);
    lcd.print("minus NEXT plus");
    delay(del);
  }
}

//выбираем из памяти птицу///////////////////////////////////////
void birdSelect() {
  int birdType;
  EEPROM_read(17, birdType);
  lcd.setCursor(2, 0);
  lcd.print("BIRD - ");
  switch (birdType) {
    case 0:
      //lcd.print("CHICK");  // курица
      birdPrint = "CHICK";
      break;
    case 1:
      //lcd.print("QUAIL");  // перепелка
      birdPrint = "QUAIL";
      break;
    case 2:
      //lcd.print("DUCK");   // утка
      birdPrint = "DUCK";
      break;
    case 3:
      //lcd.print("MUSKUS");  // индоутка
      birdPrint = "MUSKUS";
      break;
    case 4:
      //lcd.print("PEREPEL");  // гусь
      birdPrint = "PEREPEL";
      break;
    case 5:
      //lcd.print("TURKEY"); // индюк
      birdPrint = "TURKEY";
      break;
  }
}

//устанавливаем поворот/////////////////////////////////////////////////
void turn_setup() {
  int turnPeriod;

  delay(del);
  button_read();
  lcd.setCursor(4, 0);
  lcd.print("TURN SETUP");
  delay(1000);
  lcd.clear();
  int x = 0;
  while (1) {
    x++;
    if (x > interval) {
      break;
    }
    button_read();
    EEPROM_read(11, turnPeriod);
    if (button_enter) {
      delay(del);
      lcd.clear(); //очищаем экран
      break;
    }
    if (button_plus) {
      x = 0;
      EEPROM_write(11, turnPeriod + 1);
      if (turnPeriod >= 13) {     //проверяем, если выше 13,
        EEPROM_write(11, 13);  //пишем в память 13
      }
      lcd.clear();
    }
    if (button_minus) {
      x = 0;
      EEPROM_write(11, turnPeriod - 1);
      if (turnPeriod <= 0) {     //проверяем, если ниже 0,
        EEPROM_write(11, 0);  //пишем в память 0
      }
      lcd.clear();
    }
    EEPROM_read(11, turnPeriod);
    lcd.setCursor(0, 0);
    lcd.print("PERIOD = ");
    if (turnPeriod < 13)lcd.print(turnPeriod);
    if (turnPeriod > 12) lcd.print("RND");
    lcd.print(" Hour");
    lcd.setCursor(1, 1);
    lcd.print("minus NEXT plus");
    delay(del);
  }
}


//устанавливаем сигнализацию///////////////////////////////////////////////////////////////
void alarm_setup() {
  float alarmTemp;
  delay(del);
  button_read();
  lcd.setCursor(4, 0);
  lcd.print("ALARM SETUP");
  delay(1000);
  lcd.clear();
  int x = 0;
  while (1) {
    x++;
    if (x > interval) break;
    button_read();
    EEPROM_read(5, alarmTemp);
    if (button_enter) {
      delay(del);
      lcd.clear(); //очищаем экран
      break;
    }
    if (button_plus) {
      x = 0;
      if (alarmTemp >= 10.0)      //проверяем, если больше или равно 10,
        EEPROM_write(5, 10.0);  //пишем в память 10
      else EEPROM_write(5, alarmTemp + 0.1);
    }
    if (button_minus) {
      x = 0;
      if (alarmTemp <= 1.0)     //проверяем, если ниже 1,
        EEPROM_write(5, 1.0);  //пишем в память 1
      else EEPROM_write(5, alarmTemp - 0.1);
    }
    lcd.setCursor(1, 0);
    lcd.print("T.Alarm +-");
    lcd.print(alarmTemp, 1);
    lcd.print((char)223);
    lcd.print("C  ");
    lcd.setCursor(1, 1);
    lcd.print("minus NEXT plus");
    delay(del);
  }
}


//устанавливаем вентиляцию///////////////////////////////////////////////////////////
void vent_setup() {
  boolean fanEnable;
  delay(del);
  button_read();
  lcd.setCursor(3, 0);
  lcd.print("A.FAN SETUP");
  delay(1000);
  lcd.clear();
  int x = 0;
  while (1) {
    x++;
    if (x > interval) break;
    button_read();
    EEPROM_read(9, fanEnable);
    if (fanEnable > 1) fanEnable = 1;
    if (button_enter) {
      delay(del);
      lcd.clear(); //очищаем экран
      break;
    }
    if (button_minus) {
      x = 0;
      EEPROM_write(9, 0);  //пишем в память 0, не включаем принудительную вентиляцию при превышении температуры
    }
    if (button_plus) {
      x = 0;
      EEPROM_write(9, 1);  //пишем в память 1, включаем принудительную вентиляцию при превышении температуры
    }
    lcd.setCursor(2, 0);
    lcd.print("Ext.Fan ");
    if (fanEnable == 0) lcd.print("disable");
    else lcd.print("enable ");
    lcd.setCursor(2, 1);
    lcd.print("OFF  NEXT  ON");
    delay(del);
  }
}


///опрашиваем датчики //////////////////////////////////////////////////////////////////////////
void getSensors() {
  unsigned long curMillis = millis();          // Получаем текущее время работы
  if (curMillis - trhMillis >= TRHSTEP) {    // время для нового измерения?
    Wire.beginTransmission(0x40);
    byte error = Wire.endTransmission();
    if (error != 0) {
      Serial.println(F("Couldn't find sensor!"));
      lcd.clear();
      lcd.setCursor(3, 0);
      lcd.print(F("ATTENTION!"));
      lcd.setCursor(4, 1);
      lcd.print(F("ALARM!"));
      delay(1000);
      lcd.clear();
      lcd.setCursor(2, 0);
      lcd.print(F("sensor SHT21"));
      lcd.setCursor(3, 1);
      lcd.print(F("not found"));
      delay(1000);
      lcd.clear();
      temp1Ink = 85.5;
      humidity = 85.6;
      beeper(10);
    }
    else {
      temp1Ink = (htu.readTemperature());     // Конвертируем сырые данные с сенсора
      humidity = (htu.readHumidity()); // конвертируем данные с сенсора
    }
  }
}


//используем терморегулятор ////////////////////////////////////////////
void thermostat(float tempPoint, float set_humidity) {
  DateTime now = RTC.now();
  unsigned long now1 = millis();
  float alarmTemp;
  EEPROM_read(5, alarmTemp);
  if (digitalRead(door_pin)) { //дверь закрыта *для концевика закрыто - разомкнуто
    myPID.SetMode(AUTOMATIC);
    heater_off = false;
  }
  else { //дверь открыта
    heater_off = true;
    alarmDelay = millis();
    myPID.SetMode(MANUAL);
    Output = 300;
  }
  Setpoint = tempPoint;
  myPID.Compute();
  if (now1 - windowStartTime > WindowSize) { //время для перещелкивания периода окна
    windowStartTime = windowStartTime + WindowSize;
    //voltmeter();                        //запускаем функцию измерения напряжения
    Input = temp1Ink;
    lcd.setCursor(0, 0);                 // устанавливаем курсор в 0-ом столбце, 0 строка (начинается с 0)
    lcd.print("T1=");
    lcd.print(temp1Ink, 1);              // печать температуры на дисплей
    lcd.print((char)223);
    lcd.setCursor(9, 0);
    lcd.print("H=");
    lcd.print(humidity, 1);           // печать влажности на дисплей
    //lcd.print("%");
    lcd.print(" ");
    lcd.print("D");
    if (currentDay > 100) lcd.print("99");
    else lcd.print(currentDay);      // текущий день инкубации
    lcd.setCursor(0, 1);
    lcd.print("t");
    lcd.print(Setpoint, 1);
    lcd.setCursor(6, 1);
    lcd.print("h");
    lcd.print(set_humidity, 1);
    lcd.setCursor(13, 1);
    lcd.print("[");
    if (RTC.isrunning()) {
      if (now.hour() < 10) lcd.print(" ");
      lcd.print(now.hour(), DEC);
      lcd.print(":");
      if (now.minute() < 10)lcd.print(0);
      lcd.print(now.minute(), DEC);
    }
    lcd.setCursor(19, 1);
    lcd.print("]");
    lcd.setCursor(0, 2);
    lcd.print("T2=");
    lcd.print(temp2Ink, 1);            // печать температуры на дисплей
    lcd.print((char)223);
    lcd.setCursor(9, 2);
    lcd.print("*t");
    lcd.print(temp1Ink - temp2Ink, 1);
    lcd.setCursor(16, 2);
    lcd.print("W");
    if (Output > 990) lcd.print("99");
    else lcd.print(Output / 10, 0);
    lcd.print("%");
    lcd.setCursor(0, 3);
    lcd.print(birdPrint);
    lcd.setCursor(7, 3);
    lcd.print("Al+-");
    lcd.print(alarmTemp, 1);

  }
  if (Output > (now1 - windowStartTime) && temp1Ink < 39.9 && heater_off == false) digitalWrite(heater_pin, HIGH);
  else digitalWrite(heater_pin, LOW);
}


//управляем влажностью///////////////////////////////////////////////////////////////
void humidifer(float set_humidity) {
  //float humidity;
  unsigned long humMillis = 0;
  unsigned long curMillis = millis();
  //  if (curMillis - humMillis >= humStep) {
  //    humMillis = curMillis;
  //    //humidity = sht1x.readHumidity();
  //  }
  if (set_humidity > humidity) digitalWrite(humidifer_pin, HIGH); //сравниваем измеренную влажность с заданной
  if (set_humidity < humidity + h_histeresis) digitalWrite(humidifer_pin, LOW);
}


//управляем поворотом///////////////////////////////////////////////////////////////////
void turn(boolean needTurn) {
  int turnPeriod;                //период поворота лотков в часах
  int turnCommand;
  EEPROM_read(11, turnPeriod);
  //lcd.setCursor(10, 3);
  //lcd.print("P");
  //lcd.print(turnPeriod);
  lcd.setCursor(15, 3);
  lcd.print("R");
  if (turnPeriod == 0)
  { lcd.print(" OFF ");
    return;           //если нулевой период поворота, то не поворачиваем яйца.
  }
  if (turnPeriod < 13) turnCommand = turnPeriod;
  else if (turnPeriod > 12 && turnFlag == 0) { //если произошел поворот (сброшен флаг) и значение в памяти 13, то
    turnCommand = random(1, 6);        //берем случайное значение часов 1-6
    turnFlag = 1;                     //защелкиваем флаг вычисления случайных значений до следующего поворота
  }
  currentTime = millis() / 1000;


  lcd.print((loopTime - currentTime + turnCommand * 3600UL) / 60UL);
  lcd.print("m");

  if (needTurn == true) {
    if (currentTime > (loopTime + turnCommand * 3600UL)) {  // 3600000 сравниваем текущий таймер с переменной loopTime + период поворота в часах.
      digitalWrite(turn_pin, !digitalRead(turn_pin));       // включаем/выключаем реле поворота
      loopTime = currentTime;    // в loopTime записываем новое значение
      turnFlag = 0;    //сбрасываем флаг поворота
    }
    //lcd.print((loopTime - currentTime + turnCommand * 3600UL) / 60UL);
    //lcd.print(" ");
  }
}


//управляем авариями///////////////////////////////////////////////////////////////
void alarm(float needTemp) {
  float tempInk = sensors.getTempCByIndex(0);
  float alarmTemp;
  boolean fanState;
  EEPROM_read(5, alarmTemp);
  EEPROM_read(9, fanState);
  //lcd.setCursor(0, 3);
  //lcd.print("A");
  //lcd.print(needTemp + alarmTemp, 1);
  if ((millis() - alarmDelay) > 1800000) {
    if (tempInk > (needTemp + alarmTemp) || tempInk < (needTemp - alarmTemp)) {
      beeper(10);
      digitalWrite(alarm_pin, LOW); //если измеренная температура выше заданной на величину аварии
    }
    else digitalWrite(alarm_pin, HIGH); //то включаем аварийный сигнал.
  }
  if (tempInk > (needTemp + alarmTemp) && fanState == 1) needFan = 1;
  if (tempInk < (needTemp + alarmTemp - 2)) needFan = 0;
}


//пищалка////////////////////////////////////////////////////////////////////////
void beeper(int duration) {
  tone(beeper_pin, 2000, duration);
}


//управляем вентиляторами///////////////////////////////////////////////////////
void fan(int fanTime) {
  //float tempInk = sht1x.readTemperatureC();
  DateTime now = RTC.now();
  if ((now.hour() == 7 && now.minute() < fanTime) || (now.hour() == 19 && now.minute() < fanTime) || needFan == 1) {
    digitalWrite(fan_pin, LOW);
    //если наступило время проветривания или измеренная температура выше заданной на величину аварии, то включаем продувку.
    digitalWrite(extend_heater_pin, HIGH);  // при этом отключаем обогрев
    digitalWrite(heater_pin, LOW);
    heater_off = true;
  }
  else {
    digitalWrite(fan_pin, HIGH); //иначе выключаем.
    heater_off = false;
  }
}

// вольтметр//////////////////////////////////////////////////////////////////////////////
//void voltmeter() {
//  float outputValue = 0;
//  outputValue = float(analogRead(voltmeter_pin)) / 63, 9;
//  //if(outputValue < 4.5) beeper(50);
//  //Serial.print("Voltage = " );
//  //Serial.println(outputValue);
//  lcd.setCursor(14, 3);
//  lcd.print("V");
//  lcd.print(outputValue, 1);
//}
//
//// Печать мощности нагрвателя
//void outpuPower() {
//  lcd.setCursor(14, 3);
//  lcd.print("W");
//  lcd.print(Output, 0);
//  lcd.print(" ");
//}


// дополнительный нагреватель /////////////////////////////////////////////////////////////
void ext_heater(float needTemp) { // управление дополнительным нагревателем на 8 ножке через блок реле.
  float tempInk = sensors.getTempCByIndex(0);
  if (tempInk < (needTemp - 3) && heater_off == false) digitalWrite(extend_heater_pin, LOW);
  else digitalWrite(extend_heater_pin, HIGH);
}


/********************************************
   ПИД и отсылка данных в порт
 ********************************************/

union {                // This Data structure lets
  byte asBytes[24];    // us take the byte array
  float asFloat[6];    // sent from processing and
}                      // easily convert it to a
foo;                   // float array
void SerialReceive()
{
  // read the bytes sent from Processing
  int index = 0;
  byte Auto_Man = -1;
  byte Direct_Reverse = -1;
  while (Serial.available() && index < 26)  {
    if (index == 0) Auto_Man = Serial.read();
    else if (index == 1) Direct_Reverse = Serial.read();
    else foo.asBytes[index - 2] = Serial.read();
    index++;
  }
  // if the information we got was in the correct format,
  // read it into the system
  if (index == 26  && (Auto_Man == 0 || Auto_Man == 1) && (Direct_Reverse == 0 || Direct_Reverse == 1))
  {
    Setpoint = double(foo.asFloat[0]);
    //Input=double(foo.asFloat[1]);       // * the user has the ability to send the
    //   value of "Input"  in most cases (as
    //   in this one) this is not needed.
    if (Auto_Man == 0)                    // * only change the output if we are in
    { //   manual mode.  otherwise we'll get an
      Output = double(foo.asFloat[2]);    //   output blip, then the controller will
    }                                     //   overwrite.
    double p, i, d;                       // * read in and set the controller tunings
    p = double(foo.asFloat[3]);           //
    i = double(foo.asFloat[4]);           //
    d = double(foo.asFloat[5]);           //
    myPID.SetTunings(p, i, d);            //
    if (Auto_Man == 0) myPID.SetMode(MANUAL); // * set the controller mode
    else myPID.SetMode(AUTOMATIC);             //
    if (Direct_Reverse == 0) myPID.SetControllerDirection(DIRECT); // * set the controller Direction
    else myPID.SetControllerDirection(REVERSE);          //
  }
  Serial.flush();                         // * clear any random data from the serial buffer
}


/// шлем данные в порт //////////////////////////////////////////////
void SerialSend() {
  //Serial.print(millis() / 1000);
  //  Serial.print("PID ");
  //  Serial.print(Setpoint);
  //  Serial.print(" ");
  //  Serial.print(Input);
  //  Serial.print(" ");
  //  Serial.print(Output);
  //  Serial.print(" ");
  //  Serial.print(myPID.GetKp());
  //  Serial.print(" ");
  //  Serial.print(myPID.GetKi());
  //  Serial.print(" ");
  //  Serial.print(myPID.GetKd());
  //  Serial.print(" ");
  //  if (myPID.GetMode() == AUTOMATIC) Serial.print("Automatic");
  //  else Serial.print("Manual");
  //  Serial.print(" ");
  //  if (myPID.GetDirection() == DIRECT) Serial.println("Direct");
  //  else Serial.println("Reverse");

  delay(5);
  Serial.print("~Mink/set ");
  Serial.print(Setpoint);
  Serial.print("^~Mink/outpwr ");
  Serial.print(Output / 10);
  Serial.print("^~Mink/t1 ");
  Serial.print(temp1Ink);
  Serial.print("^~Mink/t2 ");
  Serial.print(temp2Ink);
  Serial.print("^~Mink/hum ");

  Serial.println(humidity);

  //Serial.print("^~Mink/alarm ");
  //Serial.print(digitalRead(alarm_pin));
  //Serial.print("^~Mink/extheat ");

  //Serial.print(digitalRead(extend_heater_pin));
  //Serial.print("^~Mink/fan ");
  //Serial.print(digitalRead(fan_pin));

  //Serial.print("^~Mink/door ");
  //Serial.println(!digitalRead(door_pin));
}

 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Вавена 

 

Код по правилам! Правила прилеплены в песочнице. Такую простыню под кат!

 

Вавена, молодца! Вот только почему у меня стойкое ощущение, что этот код с этой же простыней ошибок компиляции я сегодня уже видел в другой теме? 

Вавена
Offline
Зарегистрирован: 07.05.2019

сообщение компилятора:

Arduino: 1.6.4 (Windows 7), Плата"Arduino Uno"

Изменена опция сборки, пересобираем все

inkubator.ino: In function 'void loop()':
inkubator:191: error: 'EEPROM_read' was not declared in this scope
inkubator.ino: In function 'void startInk()':
inkubator:275: error: 'EEPROM_read' was not declared in this scope
inkubator:287: error: 'EEPROM_write' was not declared in this scope
inkubator:291: error: 'EEPROM_write' was not declared in this scope
inkubator.ino: In function 'void bird_setup()':
inkubator:322: error: 'EEPROM_read' was not declared in this scope
inkubator:331: error: 'EEPROM_write' was not declared in this scope
inkubator:332: error: 'EEPROM_write' was not declared in this scope
inkubator:338: error: 'EEPROM_write' was not declared in this scope
inkubator:339: error: 'EEPROM_write' was not declared in this scope
inkubator.ino: In function 'void birdSelect()':
inkubator:354: error: 'EEPROM_read' was not declared in this scope
inkubator.ino: In function 'void turn_setup()':
inkubator:402: error: 'EEPROM_read' was not declared in this scope
inkubator:410: error: 'EEPROM_write' was not declared in this scope
inkubator:418: error: 'EEPROM_write' was not declared in this scope
inkubator.ino: In function 'void alarm_setup()':
inkubator:451: error: 'EEPROM_read' was not declared in this scope
inkubator:460: error: 'EEPROM_write' was not declared in this scope
inkubator:461: error: 'EEPROM_write' was not declared in this scope
inkubator:466: error: 'EEPROM_write' was not declared in this scope
inkubator:467: error: 'EEPROM_write' was not declared in this scope
inkubator.ino: In function 'void vent_setup()':
inkubator:495: error: 'EEPROM_read' was not declared in this scope
inkubator:504: error: 'EEPROM_write' was not declared in this scope
inkubator:508: error: 'EEPROM_write' was not declared in this scope
inkubator.ino: In function 'void thermostat(float, float)':
inkubator:559: error: 'EEPROM_read' was not declared in this scope
inkubator:596: error: 'class RTC_DS3231' has no member named 'isrunning'
inkubator.ino: In function 'void turn(boolean)':
inkubator:647: error: 'EEPROM_read' was not declared in this scope
inkubator.ino: In function 'void alarm(float)':
inkubator:685: error: 'EEPROM_read' was not declared in this scope
'EEPROM_read' was not declared in this scope

  Это сообщение будет содержать больше информации чем
  "Отображать вывод во время компиляции"
  включено в Файл > Настройки

 

Moro_500
Offline
Зарегистрирован: 08.03.2021

Rumata пишет:
найти ячейку с содержимым !=0

Значит следующий адрес пишем, предыдущий обнуляем? Итого, можно уменьшить износ на 1024/4/2= 128 раз?

Вавена
Offline
Зарегистрирован: 07.05.2019

То все мое. Выполняю действия с скейтчем как на смайлике, что мог перепробывал. Уроки всякие смотрел ( от Гувера и др). Может кто то пантокрина в ветвистые добавит.

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Moro_500 пишет:

Rumata пишет:
найти ячейку с содержимым !=0

Значит следующий адрес пишем, предыдущий обнуляем? Итого, можно уменьшить износ на 1024/4/2= 128 раз?

Ну да. Если нужно всего 1 переменную хранить и не хочется заморачиваться подключением "вечной" i2c fram

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Вавена, не стоит во все темы одно и то-же писать.

По вашему вопросу я бы может и подсказал чего полезного, но я не имел дела с библиотекой EEPROM2.h и х/з чем она отличается от нормальной EEPROM.h. Или вы по ошибке двойку впендюрили?

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Rumata пишет:

Moro_500 пишет:

Rumata пишет:
найти ячейку с содержимым !=0

Значит следующий адрес пишем, предыдущий обнуляем? Итого, можно уменьшить износ на 1024/4/2= 128 раз?

Ну да. Если нужно всего 1 переменную хранить и не хочется заморачиваться подключением "вечной" i2c fram

Двойной износ - сначала записать, потом стереть. Лучше уж, как предлагал один скандалист, найти ячейку с максимальным значением. Но кольцевая запись оставляет открытым вопрос контроля количества записей в ячейку

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

v258 пишет:

Двойной износ - сначала записаать, потом стереть. Лучше уж, как предлагал один скандалист, найти ячейку с максимальным значением. Но кольцевая запись оставляет открытым вопрос контроля количества записей в ячейку

Как вариант. Я знал, что умные люди подскажут боле изящное решение. При условии, что прееменная без вариантов инкрементируется. А контроль количества записей, как я уже говорил, радикально решается только заменой AT24 на FM24.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Rumata пишет:

 А контроль количества записей, как я уже говорил, радикально решается только заменой AT24 на FM24.

А при такой замене заморачиваться с кольцевой записью вообще не имеет смысла ))

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

v258 пишет:

А при такой замене заморачиваться с кольцевой записью вообще не имеет смысла ))

Таки, а я за шо? ))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

Что в этом удивительного? Когда компьютер выключаете/включаете - он тоже всё с начала начинает.

не всегда, у меня обычный системник на 7-ке засыпает как ноут )))

Вавена
Offline
Зарегистрирован: 07.05.2019

На самом интересном электрики сеть ремонтировать начали, поэтому пишу с опозданием.

Разницы нет, EEPROM.h с двойкой или без двойки, компилятор матерится одинаково.

SLKH
Offline
Зарегистрирован: 17.08.2015

Вавена пишет:

На самом интересном электрики сеть ремонтировать начали, поэтому пишу с опозданием.

Разницы нет, EEPROM.h с двойкой или без двойки, компилятор матерится одинаково.

у тя гвоздь (скетч) не от той стенки (библиотеки).

genia1991
Offline
Зарегистрирован: 25.12.2019

Вавена пишет:

На самом интересном электрики сеть ремонтировать начали, поэтому пишу с опозданием.

Разницы нет, EEPROM.h с двойкой или без двойки, компилятор матерится одинаково.

привет. научи меня писать такой сложный код :)

Вавена
Offline
Зарегистрирован: 07.05.2019

Не смейся, тут до соплей обидно. Структуру программы еще как то может смогу начертать. а в программировании я полный чайник пока, в свои 67 на базе информатики 80-х не очень прыткий в освоении.

genia1991
Offline
Зарегистрирован: 25.12.2019

Вавена пишет:

Не смейся, тут до соплей обидно. Структуру программы еще как то может смогу начертать. а в программировании я полный чайник пока, в свои 67 на базе информатики 80-х не очень прыткий в освоении.

ну может лучше самому написать код. я на него тоже смотрю и ничего не понимаю )

В таком попробуй еще разобраться. Наверное что то с библиотеками не то

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Вавена

Не знаю, что там за библиотеки, но лучше пойти простым путем и переписать все под стандартную EEPROM.h , которая поставляется в комплекте IDE. Её подробное описание есть в интернетах. Или попробуйте написать правильно: 

#include <avr/eeprom.h>

В любом случае, курите исходник библиотеки, которую пытаетесь подключить

Вавена
Offline
Зарегистрирован: 07.05.2019

Спасибо Всем за отклик на проблему!.

b707
Offline
Зарегистрирован: 26.05.2017

Вавена пишет:

Разницы нет, EEPROM.h с двойкой или без двойки, компилятор матерится одинаково.

так тут дело не только в том, что библиотека не та и операторы не определены.  Тут и код работы с ЕЕПРОМ написан в принципе неверно, так что какую библиотеку не поставь - скетч правильно не заработает.

У вас в коде вы оператором EEPROM_write() пишете все подряд - и байт, и инт, и флоат. Совершенно не думая о том, что для байта нужна одна ячейка, для инта - две, а для флоат - 4.

 

Вавена
Offline
Зарегистрирован: 07.05.2019

Rumata, b707 спасибо за помощь, с "шашкой наголо" не удалось. Сяду за буквари, попробую переписать под <avr/eeprom.h>, Гувер на уроках то же пишет, что она хорошо работает.

Даст Бог управит меня в этом нелегком труде, отпишусь о результатах.

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Вавена пишет:

Rumata, b707 спасибо за помощь, с "шашкой наголо" не удалось. Сяду за буквари, попробую переписать под 

Для первого приближения вы бы лучше со стандартной библой  EEPROM.h освоились. Она очень простая - грубо говоря, всего три метода на запись и два на чтение. И главное, она достаточно неплохо документирована для начинающих и IDE из коробки содержит 8 вменяемых примеров на все случаи жизни (Файл -> Примеры -> EEPROM)

b707
Offline
Зарегистрирован: 26.05.2017

Rumata пишет:

Для первого приближения вы бы лучше со стандартной библой  EEPROM.h освоились.

Поддерживаю.

 

И категорически не советую изучать EEPROM.h по урокам гайвера. Вообще он обычно для новичков обьясняет неплохо, но вот как раз о ЕЕПРОМ у него наворочено такое, что опытный запутается. Он зачем-то смешивает библиотеки из комплекта ардуино, авр-студии и еще какую-то свою, в лучших традициях "самую удобную и эффективную", а на деле кривую и с кучей глюков.

Вавена
Offline
Зарегистрирован: 07.05.2019

Спасибо ребята за подсказки, что указали тропинку к знаниям и подняли дух, а то руки опускаются и я "танцы с бубном в лесу" выполнял бы.  

Вавена
Offline
Зарегистрирован: 07.05.2019

Как с помощью "char" на ЛСД экране показать знак градуса в коде ASCII : 

  469    lcd.setCursor(1, 0);
    470    lcd.print("T.Alarm +-");
   471     lcd.print(alarmTemp, 1);
   472    lcd.print(char 247);        
    473    lcd.print("C");
    474    lcd.setCursor(1, 1);
    475    lcd.print("minus NEXT plus");
    476    delay(del);                             

макет выдает ошибку:   Arduino: 1.6.4 (Windows 7), Плата"Arduino Uno"

Изменена опция сборки, пересобираем все
 
ikubator.ino: In function 'void alarm_setup()':
ikubator:472: error: expected primary-expression before 'char'
expected primary-expression before 'char'
 
  Гугл перевел: ikubator.ino: В функции void alarm_setup ():

ikubator: 472: ошибка: ожидалось первичное выражение перед 'char'

ожидаемое первичное выражение перед 'char'.        Че туда вставить надо?!   Плиз.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020
lcd.write(247);

Оно?

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Вавена пишет:

Как с помощью "char" на ЛСД экране показать знак градуса в коде ASCII : 

  

 lcd.print((char) 247);

Вавена
Offline
Зарегистрирован: 07.05.2019

Наверное оно, так теперь вылезло другое: 

    463       if (button_minus) {

      464    x = 0;
      465    if (alarmTemp <= 1.0)     //проверяем, если ниже 1
     466     EEPROM.write(5, 1.0);  //пишем в память 1
     467      else   EEPROM.write(5,(alarmTemp - 0.1));                        
    468        }
    469        lcd.setCursor(1, 0);

Пишет:  C:\Users\merga\Documents\Arduino\libraries\RTClib\RTClib.cpp: In member function 'char*   

               DateTime::toString(char*)':

C:\Users\merga\Documents\Arduino\libraries\RTClib\RTClib.cpp:467:32: error: 'nullptr' was not

    declared in this scope

       (strstr(buffer, "ap") != nullptr) || (strstr(buffer, "AP") != nullptr);

                                ^

Гугл пепревел:  C: \ Users \ merga \ Documents \ Arduino \ libraries \ RTClib \ RTClib.cpp: в функции-члене 'char * DateTime :: toString (char *)':

C: \ Users \ merga \ Documents \ Arduino \ libraries \ RTClib \ RTClib.cpp: 467: 32: ошибка: 'nullptr' не был объявлен в этой области

       (strstr (buffer, "ap")! = nullptr) || (strstr (буфер, "AP")! = nullptr);

                            ^

Ошибка компиляции.             Не пойму причем здесь библиотека часов?

 

 

b707
Offline
Зарегистрирован: 26.05.2017

Эти ошибки не имеют отношения к выводу символа.

Если хотите помощи - выкладывайте код целиком и вставляйте его в сообщение правильно.

Коллеги, предлагаю дальше без кода не отвечать.

Вавена
Offline
Зарегистрирован: 07.05.2019

Собрался проверить экран, заблудился в 3 соснах, при загрузке экран остается чистым, в лучшем случае может выдать начальные буквы. "Ткните носом", что не так?

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4); // Для экрана 20х4 (четырехстрочный)
//LiquidCrystal_I2C lcd(0x27, 16, 2); // Для экрана 16х2 (двухстрочный)

void setup()
{
lcd.begin();
lcd.backlight();                    // включить подсветку
lcd.setCursor(0, 0);                // 1 строка
lcd.print("LCD I2C Test - 20x4");
lcd.setCursor(0, 1);                // 2 строка
lcd.print("Privet nachinayuchim");
lcd.setCursor(0, 2);               // 3 строка
lcd.print("programistam!");
lcd.setCursor(0, 3);                // 4 строка
lcd.print("electronics"); 
}

void loop()
{

}

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Вавена пишет:

Собрался проверить экран, заблудился в 3 соснах, при загрузке экран остается чистым, в лучшем случае может выдать начальные буквы. "Ткните носом", что не так?

Всё так в программе. Скорее всего проблема с "железом". Где-то непропай. И еще - покрутите резистор на плате - бывает помогает. И проверьте адрес прибора (паранойя, конечно, но мало ли). И на всякий случай добавьте после begin()

lcd.clear();

 

Вавена
Offline
Зарегистрирован: 07.05.2019

Ответ на мои посты #22,25,34,37  - версию ИДЕ 1.6.4 сменил на 1.8.11 все ушло, скетч нормально компилируется и заливается.

Ответ на пост #39  - добавил -lcd.clear();  и  функцию - lcd.begin()  изменил - lcd.begin(20,4). Экран начал нормально работать.  Написал для таких чайников как я.