Сохранение позиции Servo в EEPROM

Otto
Offline
Зарегистрирован: 26.06.2016

Не получается сделать сохранение и чтение позиции Серво в EEPROM.

Что бы при включении Автоповоротов Серво не уходил в позицию Ноль или 180 градусов.....

/*тут глобальные переменные */
int S;       // переменная для преобразования автоповоротов серво
nt E_1;   // переменная для экономии ресурсов ОЗУ EEPROM

/*Тут переменные из класса...(локальные)*/
Servo ServoPovoroti;   // сервопривод
int pos;                  // текущее положение сервы
int AutoIncrement;        // увеличиваем перемещение на каждом шаге для Автоповоротов
nt updateInterval;       // промежуток времени между обновлениями
unsigned long lastUpdate; // последнее обновление положения

    Sweeper (int interval) //часть кода из класса...
    {
      updateInterval = interval;
      AutoIncrement = 1; // шаг приращения положения сервы для Автоповоротов
}

// тут идёт другой  код...

void Update() //Функция отвечающая за Автоповороты серво
    {
//      if (Auto_Povorot ==  true) E_2 = 1;
//      if (Auto_Povorot == false && E_2 == 1)EEPROM.write(3, S / 118), E_2 = 0;
     
      if ((millis() - lastUpdate) > updateInterval)  // время обновлять
      {
        lastUpdate = millis();     // записываем в lastUpdate новое значение
        pos += AutoIncrement;      // AutoIncrement прибавляем +1 и присваиваем pos'у
        ServoPovoroti.write(pos);  // Поворачиваем положение Сервы в соответствии с pos.
        if ((pos >= 130) || (pos <= 0)) // конец вращения и обратно...
        {
          // обратное направление сервы
          AutoIncrement = -AutoIncrement;
        }
      }
    }


void setup() {
  ServoPovoroti.Attach(9);     // Servo подключён на цифровой вход (pin 9)
  /* После подключения питания или перезагрузки, читаем значение из ячейки №1 ОЗУ
    умножаем это значение на 118 и записываем его в переменную L
    делаем это в void setup то бишь только один раз в момент подключения питания*/
  S = EEPROM.read(3) * 118;
}


void loop() {
  if (Auto_Povorot == true) {   //Если Auto_Povorot истина...
    ServoPovoroti.Update();     // ...тогда включаем Автоповороты серво
  } // бла бла бла...
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы пытаетесь двухбайтовую переменную сохранять в одном байте. используйте не read/write, а get/put и всё будет.

Otto
Offline
Зарегистрирован: 26.06.2016

Чёт не получается. Не пойму как с данным классом правильно сделать, что бы работало. 

Nosferatu
Offline
Зарегистрирован: 04.11.2012

Вместо 44 строки.

  EEPROM.get(3, S);
  S *= 118;

EEPROM Get

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/*millis_eeprom_servo_2btn.ino
#1 eeprom
  после прошивки  eeprom[00]=255 / 0 флаг , что в eeprom записали
  eeprom[1] - угол сервы
#2 Серва  упр. выв -> 9    (servo_pin)
#3 кнопки
кнопка1 -> 2 (btn1_pin) 0 нажата /1 нет
кнопка2 -> 3 (btn1_pin) 0 нажата /1 нет
*/
//#1 eeprom
#include <EEPROM.h>
//#2 серва
#include <Servo.h>
Servo servo;
const int servo_pin = 9;// нога сервы
byte angle;// 0..180 угол сервы
const int angle_min = 0  ;// найменьший угол сервы
const int angle_max = 180;//найбольший угол сервы
const int angle_step = 5;// шаг поворота сервы
byte angle_from_EEPROM() { //
  if (EEPROM.read(0) == 0) // если EEPROM не пуста
    return EEPROM.read(1);
  else return 0;
}
void angle_to_EEPROM() { //
  EEPROM.write(0, 0);// записать флажек, что EEPROM не пуста
  EEPROM.write(1, angle);// записать текущий угол
}
void servo_right() { // поворот по часовой
  if (angle + angle_step <= angle_max)
    angle = angle + angle_step;
  angle_to_EEPROM();
  servo.write(angle);
}
void servo_left() { // поворот против часовой
  if (angle - angle_step >= angle_min)
    angle = angle - angle_step;
  angle_to_EEPROM();
  servo.write(angle);
}
//#3 кнопки
const int btn1_pin = 2; // вывод кнопки 1
bool btn1;
const int btn2_pin = 3; // вывод кнопки 2
bool btn2;

void setup() {
  //#1 eeprom
  //#2 серва
  servo.attach(servo_pin);
  angle = angle_from_EEPROM();
  servo.write(angle);
  //#3 кнопки
  pinMode(btn1_pin, INPUT_PULLUP); // подключить кнопку 1 с подтяжкой
  pinMode(btn2_pin, INPUT_PULLUP); // подключить кнопку 2 с подтяжкой
}

void loop() {
  //#1 eeprom
  //#2 серва
  //#3 кнопки
  static uint32_t past_3 = 0 ;
  if (millis() - past_3 >= 100) { // если прошло 100 миллисек
    past_3 = millis() ;
    btn1 = digitalRead(btn1_pin);
    btn2 = digitalRead(btn2_pin);
    if (! btn1 && btn2) { // если нажата кнопка 1 и ненаж кнопка 2
      servo_right();
    }
    if (btn1 && ! btn2) { // если нажата кнопка 2 и ненаж кнопка 1
      servo_left();
    }
  }
}

 

Otto
Offline
Зарегистрирован: 26.06.2016

Отлично, Всем спасибо за помощь! :)