Код (C++): #include <EEPROM.h> #include <SoftwareSerial.h> int val; int val2; int Pin = 13; void setup(){ Serial.begin(9600); pinMode(Pin, OUTPUT); // устанавливает режим работы - выход } void loop(){ if (Serial.available() > 0) { //если число передали то значение больше 0 val = Serial.read();//прочитали число val = val - 48;//получили то число которое ввели, при вводе 0 получаем 48 и мы избавились от этого EEPROM.write(0, val);//записали в первую ячейку (0) val2 = EEPROM.read(0);//прочитали из нее записанное и можем делать что угодно digitalWrite(Pin, HIGH); // включаем delay(val2); // ждет число микросекунд из еепром digitalWrite(Pin, LOW); // выключаем } } Блин, а почему, когда я ввожу другое число, он все равно включается на то же время?
Простите за вмешательство. Но 48 это 0x30 в шестнадцатеричном виде и соответствует коду символа '0' или коду клавиши '0' при вводе. Вы же работаете с текстом. Так что 0x31 это код клавиши '1'... ну и та далее до 9. Так, что какое нибудь число ну допустим 123 следует принимать (преобразовывать функцией типа "atoi" для целых чисел. И ещё раз простите!
Теперь вообще туплю( умножил val2 на 1000, дабы нагляднее было. когда через терминал отправляю цифру, светодиод включается на заданное время, но при сбросе он не включается, а почему?
Вот, переделал по указанию @Igor68 Код (C++): #include <EEPROM.h> #include <SoftwareSerial.h> char input[256]; int val; int val2; void setup(){ Serial.begin(9600); } void loop(){ if (Serial.available() > 0) { //если число передали то значение больше 0 input = Serial.read();//прочитали число val = atoi(input);//получили то число которое ввели, при вводе 0 получаем 48 и мы избавились от этого EEPROM.write(0, val);//записали в первую ячейку (0) val2 = EEPROM.read(0);//прочитали из нее записанное и можем делать что угодно } }
Код (C++): #include <EEPROM.h> #include <SoftwareSerial.h> int val; int val2; int Pin = 13; int PinIn = 8; void setup(){ Serial.begin(9600); pinMode(Pin, OUTPUT); // устанавливает режим работы - выход pinMode(PinIn,INPUT); } void loop(){ if (Serial.available() > 0) { //если число передали то значение больше 0 val = Serial.read();//прочитали число val = val - 48;//получили то число которое ввели, при вводе 0 получаем 48 и мы избавились от этого EEPROM.write(0, val);//записали в первую ячейку (0) val2 = EEPROM.read(0);//прочитали из нее записанное и можем делать что угодно // считываем значения с входа кнопки PinIn = digitalRead(PinIn); // проверяем нажата ли кнопка if (PinIn == HIGH) { // включаем светодиод digitalWrite(Pin, HIGH); // включаем delay(val2 * 1000); } else { // выключаем светодиод digitalWrite(Pin, LOW); } } } Теперь хочу немного усложнить... 8 пин, это кнопка, хочу чтоб она включали диод на заданное в 0 ячейке время в секундах. Скетч из кусков, сейчас пытаюсь понять направление. Но блин не включается... Где накосячил?
Только не забудьте, что число имеет размерность в байтах, что Вы сами упоминали Код (C++): .... int value; //число u_int8_t dbyte; //байт int cnt = 0; //счётчик байт int addr = 10; //адрес размещения int sz = sizeof(value); //размер в байтах while(cnt < sz) { dbyte = (*(u_int8_t*)(&value + cnt)); //получили байт с номером cnt из числа типа int EEPROM.write(addr, dbyte);//записали байт по адресу addr addr++; //увеличили адрес (ведь он не равен счётчику а начинается с 10) cnt++; //увеличили счётчик } Ну и читать так же... ведь мы же знаем размерность записанной переменной
Люди опасаются, что вдруг при включении ошибочно будет выставлен указанный пин на вывод и будет установлен уровень "0", а кнопка нажата и... порт выйдет из строя. Только 1 К будет достаточно.
Понял спасибо, но всё равно буду рисковать) нет сопротивлений дома) А по скетчу ниже, почему не реагирует на кнопку? Код (C++): #include <EEPROM.h> #include <SoftwareSerial.h> int val; int val2; int PinLed = 13; int PinIn = 8; void setup(){ Serial.begin(9600); pinMode(PinLed, OUTPUT); // устанавливает режим работы - выход pinMode(PinIn,INPUT); //Устанавливает режим работы - вход } void loop(){ if (Serial.available() > 0) { //если число передали то значение больше 0 val = Serial.read();//прочитали число val = val - 48;//получили то число которое ввели, при вводе 0 получаем 48 и мы избавились от этого EEPROM.write(0, val);//записали в первую ячейку (0) val2 = EEPROM.read(0);//прочитали из нее записанное и можем делать что угодно digitalRead(PinIn); // считываем значения с входа кнопки if (PinIn == HIGH) { // включаем светодиод digitalWrite(PinLed, HIGH); // включаем delay(val2 * 1000); } else { // выключаем светодиод digitalWrite(PinLed, LOW); } } } По выше написанному следующим этапом переделаю, сейчас хочу понять этот кусок)
Код (C++): bool = digitalRead(PinIn); // считываем значения с входа кнопки if (bool == HIGH) { // включаем светодиод digitalWrite(PinLed, HIGH); // включаем delay(val2 * 1000); }