Помогите новичку

Levi
Offline
Зарегистрирован: 09.10.2012

 Осваиваю азы. HC-SR04 как переключатель светодиода.

// work 1 Включает диод и пишет состояние при приближении
#include "Ultrasonic.h"

// sensor connected to:
// Trig - 12, Echo - 13
Ultrasonic ultrasonic(12, 13);
int led = 11;
//int val;
int state = LOW;   // 0 = LED off while 1 = LED on
int dist1 = 0;
int dist2 = 0;

void setup()
{
  Serial.begin(9600); 		// start the serial port
  pinMode(led, OUTPUT);
  state = LOW; // темнота
  digitalWrite(led, state);
  }

void loop()
{ dist1 = ultrasonic.Ranging(CM);
if ((dist2-dist1)>10); // на датчике движение
  {
    if (state = HIGH) state = LOW;
    else state = HIGH;
  }
  
  Serial.println(dist1-dist2); // проверка на мониторе
  Serial.println(state);
  dist2 = dist1;
  digitalWrite(led, state);
  delay(100); 								
}							
}

монитор показывает, что расстояние от сенсора до руки меняется, но state постоянно 0. Что неправильно?

 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Я что-то логику не понял. По какому условию должен переключиться светодиод? Или загораться? Или тухнуть? Напишите алгоритм и приведите содержимое монитора. 

И прочитайте правила, называйте тему нормально, а не "спасите-помогите"!

maksim
Offline
Зарегистрирован: 12.02.2012

Уберите из 23 строки ; (точку с запятой).

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

maksim пишет:

Уберите из 23 строки ; (точку с запятой).

БЛИН! А я ее не заметил, котя текст прочитал.

 

maksim
Offline
Зарегистрирован: 12.02.2012

 И в 25 строке нужно не присваивать = , а сравнивать ==

if (state == HIGH) state = LOW;

 

Levi
Offline
Зарегистрирован: 09.10.2012

 Логика: при движении около датчика переключается светодиод.

Содержимое монитора в момент "движения"

1
0
-200
0
199
0
0
0
т.е. присвоение dist1 и dist2 происходит, а state не меняет своего состояния.. 

Levi
Offline
Зарегистрирован: 09.10.2012

 == супер. спасибо

maksim
Offline
Зарегистрирован: 12.02.2012

 Быстрая же у вас рука, если вы можете переместить ее на 10 см за 100 мс. ) сделайте delay(500); или даже delay(1000);.
А если у вас dist1 будет больше dist2, то условие не выполнится, поэтому разница должна быть по модулю

if (abs(dist2-dist1)>10)

 

Levi
Offline
Зарегистрирован: 09.10.2012

 попробовал с abs(). светодиод не гаснет при движении руки над датчиком. при увеличении задержки вообще не срабатывает. в случае баз abs() срабатывание идет только при удалении объекта от датчика. т.е. задача переключения выполняется..

 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

На счет "переключится". После переключения просится пауза, иначе при продолжении движения он так и будет переключаться туда-сюда. 

Levi
Offline
Зарегистрирован: 09.10.2012

 Добавил в цикл паузу. Переключение стало более отчетливым. Спасибо за советы.

maksim
Offline
Зарегистрирован: 12.02.2012

Levi пишет:

 попробовал с abs(). светодиод не гаснет при движении руки над датчиком.

Что-то не так делаете условие должно выполнять при изменении дистанции на 10 см в любую сторону.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Лучше все же, чтобы срабатывало при движении в одну сторону, а то вместо простого взмаха придется выполнять "сложный" - быстро вперед, медленно назад :) 

maksim
Offline
Зарегистрирован: 12.02.2012

Это зависит от того для каких целей и где установлен датчик.

Levi
Offline
Зарегистрирован: 09.10.2012

На данном этапе все работает как и было задумано. (цель выполнена). Спасибо. 

Придумываю следующую задачу и буду с Вашей помошью ее героически решать.