Симферопольский Форум: Нужна помощь по скетчу - Симферопольский Форум

Перейти к содержимому

Внимание! Для всех новых пользователей введена премодерация сообщений и тем.
  • (5 Страниц)
  • +
  • 1
  • 2
  • 3
  • Последняя »
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

Нужна помощь по скетчу arduino

#1 Пользователь офлайн   MedicusAmicus 

  • Добрый Э-эх
  • Перейти к галерее
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Команда форума
  • Сообщений: 2 336
  • Регистрация: 14 сентября 10
  • Страна:  

Отправлено 16 августа 2016 - 12:26

ТЗ: ночное освещение коридора.
Ардуинка измеряет освещенность и, ультразвуковым дальномером HC-SR04, - расстояние до препятствия.

Если темно и расстояние уменьшилось - зажечь свет.
Все бы работало неплохо, кроме: периодически дальномер выдает ошибку в расстоянии - 1-2 измерения, что приводит к ложным срабатываниям.
Попробовал усреднение из отсюда - не помогло.
Люди добрые! Помогите, кто чем может!

Костыли под катом
Скрытый текст

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

Нравственность придумали сытые, могущественные и очень неглупые люди, чтобы все остальные посвящали свой досуг поискам правых и виноватых…
и не мешали им спокойно кушать! (магистр Нуффлин Мони Мах)

#2 Пользователь офлайн   Rumlin 

  • Добрый волшебник
  • PipPipPipPipPip
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Старая гвардия
  • Сообщений: 42 159
  • Регистрация: 16 сентября 10
  • ГородHavana
  • Страна:  

Отправлено 16 августа 2016 - 13:49

Не понял смысла фильтра.
имхо надо секунды две считывать с ультразвукового датчика значения, затем посчитать среднее.

П.С. а детектором движения обойтись нельзя? Есть с встроенным фотореле.


Я детей вообще то боюсь, милостивый мой государь, - шумливы, жестоки и себялюбивы, а коли дети правят державой? ©Юлиан Семёнов
Ничего не делается к лучшему © Борис Раушенбах
Люди, люди — это самое главное. Люди дороже даже денег. © Ф.М. Достоевский

#3 Пользователь офлайн   MedicusAmicus 

  • Добрый Э-эх
  • Перейти к галерее
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Команда форума
  • Сообщений: 2 336
  • Регистрация: 14 сентября 10
  • Страна:  

Отправлено 16 августа 2016 - 14:13

Просмотр сообщенияRumlin сказал:

надо секунды две считывать с ультразвукового датчика значения, затем посчитать среднее


Пример для чайника?


Просмотр сообщенияRumlin сказал:

а детектором движения обойтись нельзя? Есть с встроенным фотореле
нельзя, ибо железо уже распаяно, надо отладить.

И на эту дуину еще функций навешано будет, свет - для разминки-ознакомления.

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

Нравственность придумали сытые, могущественные и очень неглупые люди, чтобы все остальные посвящали свой досуг поискам правых и виноватых…
и не мешали им спокойно кушать! (магистр Нуффлин Мони Мах)

#4 Пользователь офлайн   Rumlin 

  • Добрый волшебник
  • PipPipPipPipPip
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Старая гвардия
  • Сообщений: 42 159
  • Регистрация: 16 сентября 10
  • ГородHavana
  • Страна:  

Отправлено 16 августа 2016 - 14:39

С телефлна ничего не напишу.
Смысл — цикл N раз. Внутри чтение, суммирование в общую сумму, пауза если датчик этого требует. По окончании циклов общую сумму делим на N — это будет среднее.


Я детей вообще то боюсь, милостивый мой государь, - шумливы, жестоки и себялюбивы, а коли дети правят державой? ©Юлиан Семёнов
Ничего не делается к лучшему © Борис Раушенбах
Люди, люди — это самое главное. Люди дороже даже денег. © Ф.М. Достоевский

#5 Пользователь офлайн   Пэтро 

  • Рублю
  • PipPipPipPipPip
  • Перейти к галерее
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Старая гвардия
  • Сообщений: 9 958
  • Регистрация: 15 сентября 10
  • ГородЛуговое
  • Страна:  

Отправлено 16 августа 2016 - 14:52

MedicusAmicus,


А можно лог срабатывания дальномера? Правильного и ложного.



  impulseTime=pulseIn(S_ECHO, HIGH); // Замеряем длину импульса 
  //Добавить
  Serial.print(impulseTime);

Подключаем Оптический гигабитный интернет в Симферополе и районе.
+79787647406
http://lugovoe.su

#6 Пользователь офлайн   SlavaD 

  • Живу здесь
  • PipPipPipPipPip
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Технический администратор
  • Сообщений: 1 372
  • Регистрация: 16 сентября 10
  • Страна:  

Отправлено 16 августа 2016 - 15:06

Просмотр сообщенияRumlin сказал:

Смысл — цикл N раз. Внутри чтение, суммирование в общую сумму, пауза если датчик этого требует. По окончании циклов общую сумму делим на N — это будет среднее.

Зачем вообще среднее, идея с циклом да, но берем например цикл 3 раза и выбираем минимальное значение, дальше с ним и работаем. За 3 цикла объект надеюсь мимо датчика пробежать не успеет ?


#7 Пользователь офлайн   MedicusAmicus 

  • Добрый Э-эх
  • Перейти к галерее
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Команда форума
  • Сообщений: 2 336
  • Регистрация: 14 сентября 10
  • Страна:  

Отправлено 16 августа 2016 - 15:19

Пэтро,

Просмотр сообщенияSlavaD сказал:

берем например цикл 3 раза и выбираем минимальное значение


181
153 !!!!!
184
180
Итог - ложняк

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

Нравственность придумали сытые, могущественные и очень неглупые люди, чтобы все остальные посвящали свой досуг поискам правых и виноватых…
и не мешали им спокойно кушать! (магистр Нуффлин Мони Мах)

#8 Пользователь офлайн   SlavaD 

  • Живу здесь
  • PipPipPipPipPip
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Технический администратор
  • Сообщений: 1 372
  • Регистрация: 16 сентября 10
  • Страна:  

Отправлено 16 августа 2016 - 15:31

Просмотр сообщенияMedicusAmicus сказал:

181
153 !!!!!
184
180
Итог - ложняк

Ошибся, не минимальное, а максимальное.
184 !!!
итог - все верно


#9 Пользователь офлайн   Rumlin 

  • Добрый волшебник
  • PipPipPipPipPip
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Старая гвардия
  • Сообщений: 42 159
  • Регистрация: 16 сентября 10
  • ГородHavana
  • Страна:  

Отправлено 16 августа 2016 - 15:57

Просмотр сообщенияSlavaD (16 августа 2016 - 15:31) писал:

Ошибся, не минимальное, а максимальное.
184 !!!
итог - все верно

Если врет в обе стороны от среднего, то мин и макс это ложно


Я детей вообще то боюсь, милостивый мой государь, - шумливы, жестоки и себялюбивы, а коли дети правят державой? ©Юлиан Семёнов
Ничего не делается к лучшему © Борис Раушенбах
Люди, люди — это самое главное. Люди дороже даже денег. © Ф.М. Достоевский

#10 Пользователь офлайн   MedicusAmicus 

  • Добрый Э-эх
  • Перейти к галерее
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Команда форума
  • Сообщений: 2 336
  • Регистрация: 14 сентября 10
  • Страна:  

Отправлено 16 августа 2016 - 16:01

Врет в минус.
Попробую цикл на 3 измерения

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

Нравственность придумали сытые, могущественные и очень неглупые люди, чтобы все остальные посвящали свой досуг поискам правых и виноватых…
и не мешали им спокойно кушать! (магистр Нуффлин Мони Мах)

#11 Пользователь офлайн   MedicusAmicus 

  • Добрый Э-эх
  • Перейти к галерее
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Команда форума
  • Сообщений: 2 336
  • Регистрация: 14 сентября 10
  • Страна:  

Отправлено 16 августа 2016 - 19:03

Таким образом пойдет?

const int numReadings = 3;    //количество измерений
int impulseTimeArray [numReadings]; 	// данные, считанные с дальномера
int index = 0;                              // индекс для значения, которое считывается в данный момент
int maximum_ImpulseTime = 0;                // максимальное значение из массива

void loop() {
.......
impulseTime=pulseIn(S_ECHO, HIGH); // Замеряем длину импульса 
      // собираем массив из 3 измерений
    impulseTimeArray [index] = impulseTime; 
   	// продвигаемся к следующему значению в массиве:  
    index = index + 1;   
   	// если мы в конце массива...
  if (index >= numReadings)              
   	// ...возвращаемся к началу: 
    index = 0;
   	// ищем в массиве максимум  
for(int i = 0; i < numReadings; i++) maximum_ImpulseTime = max(impulseTimeArray[i], maximum_ImpulseTime);



АПД: не пойдет.
данные "замораживаются" на последнем значении массива

Сообщение отредактировал MedicusAmicus: 16 августа 2016 - 19:26

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

Нравственность придумали сытые, могущественные и очень неглупые люди, чтобы все остальные посвящали свой досуг поискам правых и виноватых…
и не мешали им спокойно кушать! (магистр Нуффлин Мони Мах)

#12 Пользователь офлайн   SlavaD 

  • Живу здесь
  • PipPipPipPipPip
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Технический администратор
  • Сообщений: 1 372
  • Регистрация: 16 сентября 10
  • Страна:  

Отправлено 16 августа 2016 - 19:42

Круто, только зачем массив.


int oldimpulseTime = 0;
for(int i = 0; i < numReadings; i++)
{
   digitalWrite(S_TRIG, HIGH);   /* Подаем импульс на вход trig дальномера */
   delayMicroseconds(10); // равный 10 микросекундам 
   digitalWrite(S_TRIG, LOW); // Отключаем 

   impulseTime=pulseIn(S_ECHO, HIGH);
   if (impulseTime > oldimpulseTime)
   {
       oldimpulseTime = impulseTime;
   }
}
impulseTime = oldimpulseTime;


Поблагодарили: 1

#13 Пользователь офлайн   MedicusAmicus 

  • Добрый Э-эх
  • Перейти к галерее
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Команда форума
  • Сообщений: 2 336
  • Регистрация: 14 сентября 10
  • Страна:  

Отправлено 16 августа 2016 - 20:13

Ошибок стало в три раза больше Изображение
Скрытый текст

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

Нравственность придумали сытые, могущественные и очень неглупые люди, чтобы все остальные посвящали свой досуг поискам правых и виноватых…
и не мешали им спокойно кушать! (магистр Нуффлин Мони Мах)

#14 Пользователь офлайн   SlavaD 

  • Живу здесь
  • PipPipPipPipPip
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Технический администратор
  • Сообщений: 1 372
  • Регистрация: 16 сентября 10
  • Страна:  

Отправлено 16 августа 2016 - 20:30

Просмотр сообщенияMedicusAmicus сказал:

Ошибок стало в три раза больше


Мне не на чем отлаживать, я пока ардуинку только в теории видел, код как идея был. Так, визуально, не вижу проблемы.


#15 Пользователь офлайн   MedicusAmicus 

  • Добрый Э-эх
  • Перейти к галерее
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Команда форума
  • Сообщений: 2 336
  • Регистрация: 14 сентября 10
  • Страна:  

Отправлено 16 августа 2016 - 20:31

Просмотр сообщенияSlavaD сказал:

Так, визуально, не вижу проблемы.


Так отож...

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

Нравственность придумали сытые, могущественные и очень неглупые люди, чтобы все остальные посвящали свой досуг поискам правых и виноватых…
и не мешали им спокойно кушать! (магистр Нуффлин Мони Мах)

#16 Пользователь офлайн   Пэтро 

  • Рублю
  • PipPipPipPipPip
  • Перейти к галерее
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Старая гвардия
  • Сообщений: 9 958
  • Регистрация: 15 сентября 10
  • ГородЛуговое
  • Страна:  

Отправлено 16 августа 2016 - 23:46

Складываем 4 значения делим на 4. т.е. усредняем по 4м значениям..

(181 + 153 + 184 + 180 )/4 = 174.5

опрашиваем еще раз
(например)

(140 + 143 + 131 + 157 )/4 = 142.75



#define LDR_PIN A1 //пин фоторезистора
#define RELAY_PIN A0 //пин реле

#define S_TRIG 3 //триггер звука
#define S_ECHO 4 //ловим эхо

const int numReadings = 3;    //количество измерений
  int distance=0; 
  int impulseTime=0;
  int RANGE = 150; //предел дистанции обнаружения
  int tres = 400;  //порог освещенности

unsigned long previousMillis1 = 0;      //храним время последнего Включения света
unsigned long interval = 10000;                 //интервал работы (10 секунд)

void setup() {
  // put your setup code here, to run once:
  pinMode (RELAY_PIN, OUTPUT);
  pinMode (S_TRIG, OUTPUT);
 
}
  
  
void loop() {
  
   Serial.begin(9600); 
  int light = analogRead(LDR_PIN); //читаем освещенность
    bool dark = (light < tres); //сравниваем освещенность с порогом
      Serial.println("light \t tres \t dark \t distance \t needLight");
      Serial.print(light);      Serial.print("\t");
      Serial.print(tres);        Serial.print("\t");
      Serial.print(dark);        Serial.print("\t");
        
int impulseTime = 0; //сбрасываем счетчик
for(int i = 0; i < numReadings; i++)
{
   digitalWrite(S_TRIG, HIGH);   /* Подаем импульс на вход trig дальномера */
   delayMicroseconds(10); // равный 10 микросекундам 
   digitalWrite(S_TRIG, LOW); // Отключаем 

///////////////////////////////////////////////////////////////////////////////////////
   impulseTime = impulsetime + pulseIn(S_ECHO, HIGH); // складываем серию импульсов[/b]
///////////////////////////////////////////////////////////////////////////////////////
}
  ///////////////////////////////////////////////////////////////////////
   impulseTime = impulseTime / numReadings; // вычисляем среднее
  //////////////////////////////////////////////////////////////////////
 
  distance=impulseTime/58; // Пересчитываем в сантиметры 
        
  Serial.print(distance); // Выводим на порт 
  Serial.print("\t \t ");
 bool needLight = (distance<RANGE && dark);
  
  if (needLight == 1) // Если расстояние менее предела 
    {
    analogWrite (RELAY_PIN, 255); // горит 
    previousMillis1 = millis(); // отсчёт отсрочки начинается сначала...
  }
  // Прошло время выключаем свет
        if (previousMillis1 && (millis()-previousMillis1 >= interval)) 
  {
    analogWrite (RELAY_PIN, 0); // не горит 
    previousMillis1 = 0;
  }
   Serial.println (needLight);
    
    delay (1000);}

Подключаем Оптический гигабитный интернет в Симферополе и районе.
+79787647406
http://lugovoe.su

Поблагодарили: 1

#17 Пользователь офлайн   MedicusAmicus 

  • Добрый Э-эх
  • Перейти к галерее
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Команда форума
  • Сообщений: 2 336
  • Регистрация: 14 сентября 10
  • Страна:  

Отправлено 17 августа 2016 - 08:32

Пэтро, спасибо за попытку, но теперь абсолютно все значения неверны. Из предыдущих 180 получилось 130-140-150.
Попробую зайти с другой стороны - 3 вложенных цикла с проверкой distance<RANGE

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

Нравственность придумали сытые, могущественные и очень неглупые люди, чтобы все остальные посвящали свой досуг поискам правых и виноватых…
и не мешали им спокойно кушать! (магистр Нуффлин Мони Мах)

#18 Пользователь офлайн   Rumlin 

  • Добрый волшебник
  • PipPipPipPipPip
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Старая гвардия
  • Сообщений: 42 159
  • Регистрация: 16 сентября 10
  • ГородHavana
  • Страна:  

Отправлено 17 августа 2016 - 08:39

мало циклов — одна ошибка дает большое отклонение. Если датчик позволяет часто опрашивать без критического роста ошибки, то циклов надо 20-30.


Я детей вообще то боюсь, милостивый мой государь, - шумливы, жестоки и себялюбивы, а коли дети правят державой? ©Юлиан Семёнов
Ничего не делается к лучшему © Борис Раушенбах
Люди, люди — это самое главное. Люди дороже даже денег. © Ф.М. Достоевский

#19 Пользователь офлайн   Пэтро 

  • Рублю
  • PipPipPipPipPip
  • Перейти к галерее
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Старая гвардия
  • Сообщений: 9 958
  • Регистрация: 15 сентября 10
  • ГородЛуговое
  • Страна:  

Отправлено 17 августа 2016 - 09:31

Вы так и не скинули сравнение логов, где нужно сработать и не нужно.

Надо больше дебаг информации, я лично не понимаю почему оно может не сработать.

Подключаем Оптический гигабитный интернет в Симферополе и районе.
+79787647406
http://lugovoe.su

#20 Пользователь офлайн   MedicusAmicus 

  • Добрый Э-эх
  • Перейти к галерее
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Команда форума
  • Сообщений: 2 336
  • Регистрация: 14 сентября 10
  • Страна:  

Отправлено 17 августа 2016 - 09:39

Пэтро,

Просмотр сообщенияMedicusAmicus (16 августа 2016 - 15:19) писал:

181
153 !!!!!
184
180
Итог - ложняк


Такого лога недостаточно? На фоне потока верных данных - единичные провалы.
Пока выкрутился так:
Скрытый текст


Поставил на проверку.

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

Нравственность придумали сытые, могущественные и очень неглупые люди, чтобы все остальные посвящали свой досуг поискам правых и виноватых…
и не мешали им спокойно кушать! (магистр Нуффлин Мони Мах)

Поделиться темой:


  • (5 Страниц)
  • +
  • 1
  • 2
  • 3
  • Последняя »
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей