EEPROM и Serial

Тема в разделе "Arduino & Shields", создана пользователем Slav4ik.ru, 9 дек 2017.

Метки:
  1. Slav4ik.ru

    Slav4ik.ru Нерд

    Я тебя не достал ещё с глупыми вопросами?)
     
  2. Да нет, ещё пол года назад сам такой был :) да и щас не особо
     
  3. Slav4ik.ru

    Slav4ik.ru Нерд

    Код (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);    // выключаем
         }
    }
    Блин, а почему, когда я ввожу другое число, он все равно включается на то же время?
     
  4. Ну делишь 1000 на число из еепром и получаешь delay() на сколько включить и насколько выключить
     
  5. Какое число ввел?
     
  6. Igor68

    Igor68 Гуру

    Простите за вмешательство. Но 48 это 0x30 в шестнадцатеричном виде и соответствует коду символа '0' или коду клавиши '0' при вводе. Вы же работаете с текстом. Так что 0x31 это код клавиши '1'... ну и та далее до 9. Так, что какое нибудь число ну допустим 123 следует принимать (преобразовывать функцией типа "atoi" для целых чисел.
    И ещё раз простите!
     
    БАРМАТОГРАФ нравится это.
  7. Slav4ik.ru

    Slav4ik.ru Нерд

    Спасибо большое! Попробую вникнуть)
     
  8. Slav4ik.ru

    Slav4ik.ru Нерд

    Теперь вообще туплю( умножил val2 на 1000, дабы нагляднее было. когда через терминал отправляю цифру, светодиод включается на заданное время, но при сбросе он не включается, а почему?
     
  9. Вот, переделал по указанию @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);//прочитали из нее записанное и можем делать что угодно
      }
    }
     
    Igor68 нравится это.
  10. Slav4ik.ru

    Slav4ik.ru Нерд

    Спасибо!
     
    БАРМАТОГРАФ нравится это.
  11. Slav4ik.ru

    Slav4ik.ru Нерд

    Код (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 ячейке время в секундах. Скетч из кусков, сейчас пытаюсь понять направление. Но блин не включается... Где накосячил?
     
  12. Кнопку через 10кОм резистор подключил?
     
  13. Igor68

    Igor68 Гуру

    Только не забудьте, что число имеет размерность в байтах, что Вы сами упоминали
    Код (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++; //увеличили счётчик
    }
     
    Ну и читать так же... ведь мы же знаем размерность записанной переменной
     
    Последнее редактирование: 9 дек 2017
  14. Slav4ik.ru

    Slav4ik.ru Нерд

    нет, на прямую с 5в
     
  15. Igor68

    Igor68 Гуру

    Люди опасаются, что вдруг при включении ошибочно будет выставлен указанный пин на вывод и будет установлен уровень "0", а кнопка нажата и... порт выйдет из строя. Только 1 К будет достаточно.
     
  16. Slav4ik.ru

    Slav4ik.ru Нерд

    Понял спасибо, но всё равно буду рисковать) нет сопротивлений дома) А по скетчу ниже, почему не реагирует на кнопку?

    Код (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);
         }
    }
    }
    По выше написанному следующим этапом переделаю, сейчас хочу понять этот кусок)
     
  17. Читать значение нужно ведь в переменную?
    А потом проверять, 0 или 1
     
  18. Slav4ik.ru

    Slav4ik.ru Нерд

    PinIn это же и есть переменная, или я чего то не понимаю?
     
  19. Ты делаешь чтение с пина PinIn
    Но ты не помещаешь это значение в переменную
     
  20. Код (C++):
    bool = digitalRead(PinIn);      // считываем значения с входа кнопки
       if (bool == HIGH) {
        // включаем светодиод
        digitalWrite(PinLed, HIGH);   // включаем
        delay(val2 * 1000);
      }