Сохранение позиции Servo в EEPROM
- Войдите на сайт для отправки комментариев
Ср, 04/01/2017 - 10:07
Не получается сделать сохранение и чтение позиции Серво в 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(); // ...тогда включаем Автоповороты серво
} // бла бла бла...
}
Вы пытаетесь двухбайтовую переменную сохранять в одном байте. используйте не read/write, а get/put и всё будет.
Чёт не получается. Не пойму как с данным классом правильно сделать, что бы работало.
Вместо 44 строки.
EEPROM Get
/*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(); } } }Отлично, Всем спасибо за помощь! :)