Тема: Счётчики. Вариант 2

Уважаемый администратор, genaonyx. здравствуйте!
Большая благодарность Вам, за опубликованную на сайте статью «Счётчики. Вариант 2»
После загрузки скетчей в Arduino Uno, появились вопросы. Ответьте, пожалуйста, начинающему "чайнику":

В - void setup()

pinMode(ledPin, OUTPUT);   // Настраиваем порт светодиода.
  digitalWrite(ledPin, LOW); // Выключаем светодиод.

1). Здесь означает, что при первом запуске ledPin 13 не должен гореть, а он светит. В то же время, когда он должен включаться после 5 запусков, то наоборот гаснет. Почему?

2). Так и не поняв, каким образом подаются команды на включение, имитировал их нажатием на кнопку "Reset".
Можно ли, эту команду подавать из исполняемой в этом же скетче программы, от пина, управляющего циклически срабатывающим реле. Соответственно, что бы потом блокировалась работа именно этой программы, желательно с предварительным предупреждением, после некоторого числа срабатываний реле.
Буду благодарен за любую помощь.

2

Re: Счётчики. Вариант 2

1). Здесь означает, что при первом запуске ledPin 13 не должен гореть, а он светит. В то же время, когда он должен включаться после 5 запусков, то наоборот гаснет. Почему?

Нет, вы неверно поняли, все наоборот. При запуске светодиод выключается. Если программе разрешено работать (не закончился лимит включений) то он включается. Если же лимит закончился, то программа останавливается до включения светодиода. Т.е. светодиод показывает что включилась защита и программа больше не работает.

2). Так и не поняв, каким образом подаются команды на включение, имитировал их нажатием на кнопку "Reset".
Можно ли, эту команду подавать из исполняемой в этом же скетче программы, от пина, управляющего циклически срабатывающим реле. Соответственно, что бы потом блокировалась работа именно этой программы, желательно с предварительным предупреждением, после некоторого числа срабатываний реле.
Буду благодарен за любую помощь.

Нажатие кнопки Reset это и есть выключение - включение. т.е. каждый раз когда включается или перезагружается ардуино счетчик увеличивается на единицу. Не совсем понял о чем вы.

3

Re: Счётчики. Вариант 2

Геннадий, благодарю Вас за ответ!

Нет, вы неверно поняли, все наоборот. При запуске светодиод выключается

Да, видимо не так понял. Значит, при достижении лимита светодиод должен погаснуть.

Нажатие кнопки Reset это и есть выключение - включение. т.е. каждый раз когда включается или перезагружается ардуино счетчик увеличивается на единицу. Не совсем понял о чем вы.

Мне нужно, что бы Ваш счётчик увеличивался на единицу, при срабатывании реле в моём скетче. Вот и пытаюсь приспособить для этого Вашу программу.
Посоветуйте пожалуйста, каким образом можно это реализовать.

4

Re: Счётчики. Вариант 2

#define scAddress1 7 // Адрес, где хранятся показания счетчика.
#define scAddress2 9 // Адрес, где хранятся статус счетчика (вкл/выкл).
#define scCount 5    // Количество разрешенных запусков.
#define ledPin 13    // Порт Ардуино со светодиодом.
#define sigPin 11    // Порт по сигналу которого будем увеличивать счетчик.

char scPassword[] = "www.arduino.on.kg"; // Пароль.
String scInput = ""; // Содержит пароль, полученный от пользователя.

uint16_t scValue = 0; // Переменная с показаниями счетчика.
uint8_t scEnable = 0; // Переменная со статусом счетчика.

unsigned char sig_curr, sig_prev;

void setup()
{
  scValue = eeprom_read_word((uint16_t*)scAddress1); // Чтение данных счетчика из EEPROM.
  scEnable = eeprom_read_byte((uint8_t*)scAddress2); // Чтение статуса счетчика из EEPROM.
  if (scValue == 65535) scValue = 0;   // Сбрасываем счетчик в 0.
  if (scEnable == 65535) scEnable = 1; // Сбрасываем статус на включён.
  Serial.begin(9600);        // Настраиваем COM-порт.
  pinMode(ledPin, OUTPUT);   // Настраиваем порт светодиода.
  digitalWrite(ledPin, LOW); // Выключаем светодиод.
}

void loop()
{
  // Если количество запусков превысило необходимое нам количество раз, то ждем ввода пароля.
  if (scValue > scCount && scEnable)
  {
    delay(1000);                   // Ждем секунду, чтобы получить весь пароль целиком.
    scInput = Serial.readString(); // Считываем пароль.
    if (scInput != "")             // Если что то прочли.
     if (scInput == scPassword)    // Сравниваем пароли.
     {
       scEnable = 0; // Сбрасываем запрет. 
       eeprom_write_byte((uint8_t*)scAddress2, scEnable); // Записываем в память EEPROM ноль чтобы выключить счетчик.
       Serial.println("Password successfully.");   // Сообщаем что пароль подошел.
     } else Serial.println("Password incorrect."); // Сообщаем что пароль не подошел.
    return;  // Запрещаем выполнение скетча далее.
  }
  // Увеличиваем счетчик по сигналу из порта.
  sig_curr = digitalRead(sigPin);
  if(!sig_curr && sig_prev)
  {
    if (scValue <= scCount && scEnable)
    {
      scValue++; // Увеличиваем счетчик на единицу.
      eeprom_write_word((uint16_t*)scAddress1, scValue); // Записываем данные счетчика обратно в EEPROM.
    }
  }
  sig_prev = sig_curr;
  // Иначе выполняем скетч дальше.
  digitalWrite(ledPin, HIGH); // Включаем светодиод.
}

5

Re: Счётчики. Вариант 2

Геннадий!
Большая благодарность за труды.
Как испробую, отпишусь в личку.
И ещё, если можно, дайте пожалуйста ссылку на используемые при написании Вашего скетча пособия. Ибо, на основании того, что нашёл в сети для начинающих, такого не напишешь. А может, для этого нужно специальное образование программиста?

6

Re: Счётчики. Вариант 2

Написал в ЛС.