микроконтроллеры — Клёвый код https://coolcode.ru Скриптописание и кодинг Tue, 21 Mar 2017 04:08:07 +0000 ru-RU hourly 1 https://wordpress.org/?v=5.8.13 https://coolcode.ru/wp-content/uploads/2015/10/YO1-150x150.png микроконтроллеры — Клёвый код https://coolcode.ru 32 32 Arduino. Детектор Линии (Tracker Sensor) https://coolcode.ru/arduino-detektor-linii-tracker-sensor/ https://coolcode.ru/arduino-detektor-linii-tracker-sensor/#respond Thu, 20 Oct 2016 06:07:37 +0000 http://coolcode.ru/?p=10128
  1. Плата Arduino. x1
    arduino uno
  2. Компьютер(для написания и загрузке кода, а так же мы будем брать с него электричество и общаться с ним). x1
  3. Провод для соединения компьютера и платы. x1
    USBwire
  4. Датчик детектор линии.
    linetracker
  5. Провода. x3
    wire
  6. Есть схемы с внешним источником питания, но можно взять питание и с платы.

Схема:

 

arduinolinetracker1_bb arduinolinetracker1_shemaarduinolinetrackerfoto

arduinolinetracker2_bb arduinolinetracker2_shema

Скетч:

Для первого знакомства, нам подойдёт стандартный скетч Blink:

const int buttonPin = 7;
const int ledPin = 13;

int buttonState = 0;

void setup() {
 pinMode(ledPin, OUTPUT);
 pinMode(buttonPin, INPUT);
}

void loop() {

 buttonState = digitalRead(buttonPin);

 if (buttonState == HIGH) {
 digitalWrite(ledPin, HIGH);
 } else {
 digitalWrite(ledPin, LOW);
 }
}

Описывать данный скетч не буду … он детально описан в статье про тактовую кнопку http://coolcode.ru/arduino-podklyuchenie-taktovoy-knopki/

Видео процесса:

Другие статьи по программированию плат Arduino можно посмотреть здесь.

]]>
https://coolcode.ru/arduino-detektor-linii-tracker-sensor/feed/ 0
Arduino. Датчик для измерения напряжения в сети постоянного тока меньше 25V. (Voltage Sensor) https://coolcode.ru/arduino-datchik-dlya-izmereniya-napryazheniya-v-seti-postoyannogo-toka-menshe-25v-voltage-sensor/ https://coolcode.ru/arduino-datchik-dlya-izmereniya-napryazheniya-v-seti-postoyannogo-toka-menshe-25v-voltage-sensor/#comments Wed, 19 Oct 2016 07:53:30 +0000 http://coolcode.ru/?p=10147
  1. Плата Arduino. x1
    arduino uno
  2. Компьютер(для написания и загрузке кода, а так же мы будем брать с него электричество и общаться с ним). x1
  3. Провод для соединения компьютера и платы. x1
    USBwire
  4. Датчик для измерения напряжения в сети постоянного тока меньше 25V
    voltagesensor
  5. Собственно источник питания, который будем тестировать.
  6. Провода. x5
    wire

Схема:

arduinovoltagesensor_bb arduinovoltagesensor_shemaarduinovoltagesensor

arduinovoltagesensor2_bb arduinovoltagesensor2_shema

Скетч:

Для того, что бы измерить вольтаж можно воспользоваться следюущим скетчем:

float temp;

void setup() 
{   
 Serial.begin(9600);   
} 

void loop() 
{       
 temp=analogRead(A0)/40.92;        
 Serial.print(temp);
 Serial.println("V"); 
 
 delay(1000); 
}

Здесь мы берём значение с порта A0, к которому подключен датчик и делим его на константу 40.92

дальше выводим на экран.

Есть примеры, где это значение округляют до целого, но этот датчик способен на большее.

Видео процесса:

В видео используется следующая схема подключения:

arduinovoltagesensorvideo2_bb

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

Блок питания примерно в 5V оказывается выдаёт далеко не стабильные напряжение, хотя мультиметр это не показывает.

При подключения блока питания на 12V завис arduino… после перезагрузки всё стало хорошо.  Не стал вырезать этот момент… вдруг это нормально для данного процесса.

Другие статьи по программированию плат Arduino можно посмотреть здесь.

]]>
https://coolcode.ru/arduino-datchik-dlya-izmereniya-napryazheniya-v-seti-postoyannogo-toka-menshe-25v-voltage-sensor/feed/ 1
Arduino. 5V лазерный модуль. KY-008 https://coolcode.ru/arduino-5v-lazernyiy-modul-ky-008/ https://coolcode.ru/arduino-5v-lazernyiy-modul-ky-008/#respond Wed, 19 Oct 2016 03:26:07 +0000 http://coolcode.ru/?p=10141
  1. Плата Arduino. x1
    arduino uno
  2. Компьютер(для написания и загрузке кода, а так же мы будем брать с него электричество и общаться с ним). x1
  3. Провод для соединения компьютера и платы. x1
    USBwire
  4. Лазерный модуль KY-008.
    key-008
  5. Провода. x2
    wire

Схема:

arduinoky-008_bbarduinoky-008_shemaarduinoky-008

Скетч:

Для первого знакомства, нам подойдёт стандартный скетч Blink:

void setup() {
 pinMode(13, OUTPUT);
}


void loop() {
 digitalWrite(13, HIGH);
 delay(1000);
 digitalWrite(13, LOW);
 delay(1000);
}

Описывать данный скетч не буду … он детально описан в статье про светодиод http://coolcode.ru/arduino-podklyuchenie-svetodioda/.

Видео процесса:

Другие статьи по программированию плат Arduino можно посмотреть здесь.

]]>
https://coolcode.ru/arduino-5v-lazernyiy-modul-ky-008/feed/ 0
Arduino. Ультразвуковой датчик HC-SR04 https://coolcode.ru/arduino-ultrazvukovoy-datchik-hc-sr04/ https://coolcode.ru/arduino-ultrazvukovoy-datchik-hc-sr04/#comments Sun, 12 Jun 2016 06:45:06 +0000 http://coolcode.ru/?p=8689
  1. Плата Arduino. x1
    arduino uno
  2. Компьютер(для написания и загрузке кода, а так же мы будем брать с него электричество и общаться с ним). x1
  3. Провод для соединения компьютера и платы. x1
    USBwire
  4. Ультразвуковой датчик HC-SR04
    ArduinoHC-SR04
  5. Провода. x4
    wire
  6. Есть схемы с внешним источником питания, но можно взять питание и с платы.

Схема:

ArduinoHC-SR04_1_bb ArduinoHC-SR04_1_схемаArduinoHC-SR04Sensor1_foto

ArduinoHC-SR04_2_bb ArduinoHC-SR04_2_схема

 

Скетч:

const int pinEcho = 7; 
const int pinTrig = 8; 
float v=331.5+0.6*20;
  
void setup() {
  Serial.begin(9600);
  pinMode(pinEcho, INPUT);
  pinMode(pinTrig, OUTPUT);
}

float distanceSM(){
  digitalWrite(pinTrig, LOW);
  delayMicroseconds(3);
  digitalWrite(pinTrig, HIGH);
  delayMicroseconds(5);
  digitalWrite(pinTrig, LOW);

  float t = pulseIn(pinEcho, HIGH);//mks
  t = t/1000.0/1000.0/2; //s
  return t*v*100; //cm
}

void loop()
{
  Serial.print(distanceSM());
  Serial.print("cm");
  Serial.println();
  
  delay(1000);
}

 

В начале задаём константы с номерами штырьков,  к которым подключён наш HC-SR04 сенсор:

const int pinEcho = 7; 
const int pinTrig = 8;

Контакт Echo нашего сенсора подключен к 7 штырьку, котакт Trig подключён к 8 штырьку.

Дальше определяем переменную v в которой будет храниться скорость звука

float v=331.5+0.6*20;

Скорость звука можно определить по формуле Лапаласа:

$$C=\sqrt{\frac{c_p}{c_v} * \frac{p}{\rho}}$$

где, $$p$$ давление; $$\rho$$ — плотность воздуха; $$c_ν$$ теплоемкость воздуха при постоянном давлении; $$c_p$$ теплоемкость воздуха при постоянном объеме.

Но так как у нас слишком мало данных… то сделаем так:

При нормальном давлении и температуре 0 градусов скорость звука равна 331 м/с.
А во влажном воздухе скорость звука увеличивается на 0,61 м/c при увеличении температуры на 1 градус.
и получится следующая формула:
$$c = 331+0,6*t+0,07*e$$
где $$t$$-это температура, $$e$$ — влажность.
В диапазоне температур ($$t$$) от —20° до +30° эта формула дает ошибку в скорости звука не более ± 0,5 м/сек. (Так как мы отбросили давление воздуха.)
Теперь посмотрим на форумулу которую использую я:

float v=331.5+0.6*20;

видно, что температура у меня задана примерно 20 градусов, а влажность вообще отброшена… точность данных измерений на лицо… но для показа принцира работы данного устройства должно хватить. Для повышения точности данного прибора нужно будет установить датчик влажности-температуры, например DTH11.

 

Дальше в функции setup определяем скорость передачи данных по USB, а так же назначаем штырьку к которому подключен контакт сенсора Echo состояние INPUT, а Trig соответственно OUTPUT.

void setup() {
  Serial.begin(9600);
  pinMode(pinEcho, INPUT);
  pinMode(pinTrig, OUTPUT);
}

Дальше объявим функцию distanceSM() в ней будет происходить всё волшебство. Разберём её по подробнее.

float distanceSM(){
  digitalWrite(pinTrig, LOW);
  delayMicroseconds(3);
  digitalWrite(pinTrig, HIGH);
  delayMicroseconds(5);
  digitalWrite(pinTrig, LOW);

  float t = pulseIn(pinEcho, HIGH);//mks
  t = t/1000.0/1000.0/2; //s
  return t*v*100; //cm
}

Сначала мы отсылаем сигнал продолжительностью 5 микросекунд

digitalWrite(pinTrig, LOW);
  delayMicroseconds(3);
  digitalWrite(pinTrig, HIGH);
  delayMicroseconds(5);
  digitalWrite(pinTrig, LOW);

Для этого мы сначала убеждаемся, что наш контакт Trig находится в состоянии LOW и соответственно сигнал не идёт. для этого на 3 микросекунды переводим его в состояние LOW

digitalWrite(pinTrig, LOW);
  delayMicroseconds(3);

Дальше формируем сигнал в 5 микросекунд, для этого мы подадим напряжение на ножку Trig в течении 5 микросекунд, а потом уберём напряжение.

digitalWrite(pinTrig, HIGH);
  delayMicroseconds(5);
  digitalWrite(pinTrig, LOW);

осталось посчитать продолжительность времени импульса

float t = pulseIn(pinEcho, HIGH);//mks

То есть он будет ждать пока на ножку Echo не придёт сигнал, или пока данная функция не завершиться по таймауту. По умолчанию данная функция ждёт сигнал 1 секунду, что превышает 45 метров и это явно за грань чувствительности сенсора. У этой функции есть ещё и нижняя граница 10 микросекунд, что для нашего сенсора будет примерно 17 миллиметров тоже за гранью чувствительности так что pulseIn полностью нам подходит.

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

t = t/1000.0/1000.0/2; //s
return t*v*100; //cm

Осталась функция loop которая в бесконечном цикле будет с помощью функции distanceSM() получать расстояние до препятствия в сантиметрах. и выводить эти значения на USB порт:

void loop()
{
  Serial.print(distanceSM());
  Serial.print("cm");
  Serial.println();
  
  delay(1000);
}

Ещё установлена задержка в 1 секунду, чтоб не мельтешило.

Всё скетч кончился смотрим на результат работы скетча:

Не правильное опрделение расстояния до пушистых объектов:

Не правильное определение расстояния до поверхностей, находящихся под углом:

Другие статьи по программированию плат Arduino можно посмотреть здесь.

]]>
https://coolcode.ru/arduino-ultrazvukovoy-datchik-hc-sr04/feed/ 6
Arduino. Датчик вибраций SW-420. MH-Series https://coolcode.ru/arduino-datchik-vibratsiy-sw-420-mh-series/ https://coolcode.ru/arduino-datchik-vibratsiy-sw-420-mh-series/#comments Mon, 23 May 2016 15:13:28 +0000 http://coolcode.ru/?p=8446
  1. Плата Arduino. x1
    arduino uno
  2. Компьютер(для написания и загрузке кода, а так же мы будем брать с него электричество и общаться с ним). x1
  3. Провод для соединения компьютера и платы. x1
    USBwire
  4. Датчик вибраций SW-420.
    SW-420
  5. Провода. x3
    wire
  6. Есть схемы с внешним источником питания, но можно взять питание и с платы.

Схема:

ArduinoSW-420_1_bb ArduinoSW-420_1_схемаArduinoSW-420_1_Foto

ArduinoSW_420-2_bb ArduinoSW_420-2_схема

Скетч:

C сенсором вибраций SW-420 не всё так однозначно, как предыдущими сенсорами, так как он показывает не наличие самой вибрации.. а непосредственно наличие одного толчка. То есть во время вибрации он будет постоянно менять своё значение с LOW  на HIGH и обратно. При этом при отсутствии вибрации он с большой долей вероятности будет находиться в состоянии LOW, но так же может и спокойно встать в состояние HIGH.

Рассмотрим что будет если загрузить в наш Arduino стандартный скетч для кнопки:

Файл -> Примеры ->02.Digital->Button;

/*
  Button

 Turns on and off a light emitting diode(LED) connected to digital
 pin 13, when pressing a pushbutton attached to pin 2.


 The circuit:
 * LED attached from pin 13 to ground
 * pushbutton attached to pin 2 from +5V
 * 10K resistor attached to pin 2 from ground

 * Note: on most Arduinos there is already an LED on the board
 attached to pin 13.


 created 2005
 by DojoDave <http://www.0j0.org>
 modified 30 Aug 2011
 by Tom Igoe

 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/Button
 */

// constants won't change. They're used here to
// set pin numbers:
const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
}

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    // turn LED on:
    digitalWrite(ledPin, HIGH);
  } else {
    // turn LED off:
    digitalWrite(ledPin, LOW);
  }
}

Этот скетч мы подробно рассмотрели в статье Arduino. Подключение тактовой кнопки. Посмотрим видео процесса:

На следующем видео видно, что когда колебаний нет, то сенсор не меняет своего значения либо с LOW либо с HIGH:

Немного не тот результат я ожидал. Мне хотелось бы, что бы светодиод горел во время наличия вибрации. И гас, когда вибрации нет.

Для этого напишим-поправим скетч:

const int keyPin = 2;
const int ledPin =  13;
const int maxcount = 500;


int keyState = 0;
int count = 0;
int oldstat = 0;

void setup() {
  pinMode(ledPin, OUTPUT);      
  pinMode(keyPin, INPUT);     
}

void loop(){
  keyState = digitalRead(keyPin);

  if (keyState != oldstat) {     
    count=0;
    oldstat = keyState;
  }
  
  if (count < maxcount){
    digitalWrite(ledPin, HIGH);
  }
  else {
    digitalWrite(ledPin, LOW); 
  }
  if (count<=maxcount+1) {
    ++count;
  }
  delay(1);
}

Сэнсор у нас поп режнему на 2 порту, а LED на 13.

const int keyPin = 2;
const int ledPin =  13;

Дальше я задаю константу, сколько циклов должно пройти не изменив состояние, прежде чем светодиод погаснет:

const int maxcount = 500;

выставил 500 циклов, при каждой задержки я делаю паузу в 1 милисекунду. И того получается, что прежде, чем светодиод потухнет не должно менятся состояния сенсора в течении примерно пол секунды.

 

Дальше задаём переменные:

int keyState = 0;
int count = 0;
int oldstat = 0;

keyState — текущее состояние сенсора.

oldstat — предыдущее состояние сенсор.

count — в этой переменной будет хранится кол-во циклов без изменения состояния.

Далее устанавливаем состояния штырька с LED на выход, для штырька с сеносором на получение входящих данных.

void setup() {
  pinMode(ledPin, OUTPUT);      
  pinMode(keyPin, INPUT);     
}

Основной цикл:

void loop(){
  keyState = digitalRead(keyPin);

  if (keyState != oldstat) {     
    count=0;
    oldstat = keyState;
  }
  
  if (count < maxcount){
    digitalWrite(ledPin, HIGH);
  }
  else {
    digitalWrite(ledPin, LOW); 
  }
  if (count<=maxcount+1) {
    ++count;
  }
  delay(1);
}

Сначала берём значение с сенсора:

keyState = digitalRead(keyPin);

Далее сравниваем его с предыдущим состоянием сенсора:

if (keyState != oldstat) {

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

count=0;

сбрасываем состояние счётчика, и устанавливаем новое значение:

oldstat = keyState;

Далее устанавливаем состояние лампочки:

if (count < maxcount){
    digitalWrite(ledPin, HIGH);
  }
  else {
    digitalWrite(ledPin, LOW); 
  }

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

Далее счётчик, здесь условие, что бы небыло переполнения переменной я ограничил максимальное число count, до maxcount+1 так как всё равно лампочку надо выключить, и мне не интересно сколько уже небыло толчка. А если просто поставить ++count, то переменная очень быстро переполнится и «сбросится» и того у нас получится мигающая лампочка.

if (count<=maxcount+1) {
    ++count;
  }

и осталось сделать задержку в 1 милисикунду и всё:

elay(1);

Можно смотреть, что получилось:

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

Другие статьи по программированию плат Arduino можно посмотреть здесь.

]]>
https://coolcode.ru/arduino-datchik-vibratsiy-sw-420-mh-series/feed/ 9
Arduino. Геркон магнитный Датчик. MH-Series https://coolcode.ru/arduino-gekon-magnitnyiy-datchik-mh-series/ https://coolcode.ru/arduino-gekon-magnitnyiy-datchik-mh-series/#respond Sat, 21 May 2016 18:46:59 +0000 http://coolcode.ru/?p=8464
  1. Плата Arduino. x1
    arduino uno
  2. Компьютер(для написания и загрузке кода, а так же мы будем брать с него электричество и общаться с ним). x1
  3. Провод для соединения компьютера и платы. x1
    USBwire
  4. Магнитный датчик.
    ArduinoReed
  5. Провода. x3
    wire
  6. Есть схемы с внешним источником питания, но можно взять питание и с платы.

Схема:

ArduinoReedSensor1_bb ArduinoReedSensor1_схемаArduinoReedSensor1_foto

ArduinoReedSensor2_bb ArduinoReedSensor2_схема

Скетч:

Здесь вполне подойдёт стандартный скетч для подключения кнопки.

Файл -> Примеры ->02.Digital->Button;

/*
  Button

 Turns on and off a light emitting diode(LED) connected to digital
 pin 13, when pressing a pushbutton attached to pin 2.


 The circuit:
 * LED attached from pin 13 to ground
 * pushbutton attached to pin 2 from +5V
 * 10K resistor attached to pin 2 from ground

 * Note: on most Arduinos there is already an LED on the board
 attached to pin 13.


 created 2005
 by DojoDave <http://www.0j0.org>
 modified 30 Aug 2011
 by Tom Igoe

 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/Button
 */

// constants won't change. They're used here to
// set pin numbers:
const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
}

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    // turn LED on:
    digitalWrite(ledPin, HIGH);
  } else {
    // turn LED off:
    digitalWrite(ledPin, LOW);
  }
}

Этот скетч мы подробно рассмотрели в статье Arduino. Подключение тактовой кнопки. Так что можно просто посмотреть результат работы данного сенсора:

Другие статьи по программированию плат Arduino можно посмотреть здесь.

]]>
https://coolcode.ru/arduino-gekon-magnitnyiy-datchik-mh-series/feed/ 0
Arduino. Датчик Света. MH-Series https://coolcode.ru/arduino-datchik-sveta-mh-series/ https://coolcode.ru/arduino-datchik-sveta-mh-series/#respond Wed, 18 May 2016 05:40:39 +0000 http://coolcode.ru/?p=8457
  1. Плата Arduino. x1
    arduino uno
  2. Компьютер(для написания и загрузке кода, а так же мы будем брать с него электричество и общаться с ним). x1
  3. Провод для соединения компьютера и платы. x1
    USBwire
  4. Датчик света.
    ArduinoLight
  5. Провода. x3
    wire
  6. Есть схемы с внешним источником питания, но можно взять питание и с платы.

Схема:

ArduinoLightSensor1_bb ArduinoLightSensor1_схемаArduinoLightSensor1_foto

ArduinoLightSensor2_bb ArduinoLightSensor2_схема

Скетч:

Здесь вполне подойдёт стандартный скетч для подключения кнопки.

Файл -> Примеры ->02.Digital->Button;

/*
  Button

 Turns on and off a light emitting diode(LED) connected to digital
 pin 13, when pressing a pushbutton attached to pin 2.


 The circuit:
 * LED attached from pin 13 to ground
 * pushbutton attached to pin 2 from +5V
 * 10K resistor attached to pin 2 from ground

 * Note: on most Arduinos there is already an LED on the board
 attached to pin 13.


 created 2005
 by DojoDave <http://www.0j0.org>
 modified 30 Aug 2011
 by Tom Igoe

 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/Button
 */

// constants won't change. They're used here to
// set pin numbers:
const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
}

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    // turn LED on:
    digitalWrite(ledPin, HIGH);
  } else {
    // turn LED off:
    digitalWrite(ledPin, LOW);
  }
}

Этот скетч мы подробно рассмотрели в статье Arduino. Подключение тактовой кнопки. Так что можно просто посмотреть результат работы данного сенсора:

Другие статьи по программированию плат Arduino можно посмотреть здесь.

]]>
https://coolcode.ru/arduino-datchik-sveta-mh-series/feed/ 0
Arduino. Инфракрасный датчик обнаружения препятствий. MH-Series https://coolcode.ru/arduino-infrakrasnyiy-datchik-obnaruzheniya-prepyatstviy-mh-series/ https://coolcode.ru/arduino-infrakrasnyiy-datchik-obnaruzheniya-prepyatstviy-mh-series/#comments Tue, 17 May 2016 05:24:54 +0000 http://coolcode.ru/?p=8369
  1. Плата Arduino. x1
    arduino uno
  2. Компьютер(для написания и загрузке кода, а так же мы будем брать с него электричество и общаться с ним). x1
  3. Провод для соединения компьютера и платы. x1
    USBwire
  4. Инфракрасный датчик обнаружения препятствий.
    ArduinoIRSensor
  5. Провода. x3
    wire
  6. Есть схемы с внешним источником питания, но можно взять питание и с платы.

Схема:

ArduinoIRSensor1_bb ArduinoIRSensor1_схемаArduinoIRSensor1_foto

ArduinoIRSensor2_bb ArduinoIRSensor2_схема

Скетч:

Здесь вполне подойдёт стандартный скетч для подключения кнопки.

Файл -> Примеры ->02.Digital->Button;

/*
  Button

 Turns on and off a light emitting diode(LED) connected to digital
 pin 13, when pressing a pushbutton attached to pin 2.


 The circuit:
 * LED attached from pin 13 to ground
 * pushbutton attached to pin 2 from +5V
 * 10K resistor attached to pin 2 from ground

 * Note: on most Arduinos there is already an LED on the board
 attached to pin 13.


 created 2005
 by DojoDave <http://www.0j0.org>
 modified 30 Aug 2011
 by Tom Igoe

 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/Button
 */

// constants won't change. They're used here to
// set pin numbers:
const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
}

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    // turn LED on:
    digitalWrite(ledPin, HIGH);
  } else {
    // turn LED off:
    digitalWrite(ledPin, LOW);
  }
}

Этот скетч мы подробно рассмотрели в статье Arduino. Подключение тактовой кнопки. Так что можно просто посмотреть результат работы данного сенсора:

В видео используется две камеры:

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

Вторая часть с камерой изображение которой больше схоже с восприятием глаза человека и свечения лампочки уже не видно.

Другие статьи по программированию плат Arduino можно посмотреть здесь.

]]>
https://coolcode.ru/arduino-infrakrasnyiy-datchik-obnaruzheniya-prepyatstviy-mh-series/feed/ 15
Arduino https://coolcode.ru/arduino_list/ https://coolcode.ru/arduino_list/#comments Tue, 10 May 2016 09:04:39 +0000 http://coolcode.ru/?p=8160

Arduino_Logo.svg_ genuinobrand

Цикл статей посвящённый первым шагам по программированию плат Arduino.

Arduino. Подключение светодиода.

В данной статье описывается работа с цифровой ножкой в режиме OUTPUT.

 

Arduino. Подключение тактовой кнопки.

В данной статье описывается работа с цифровой ножкой в режиме INPUT.

 

Arduino. Управление сервоприводом, на примере SG90.

Используем стандартную библиотеку Servo.h

 

Arduino. Взаимодействие с компьютером через USB порт.

Здесь описывается взаимодействие с платой Arduino  через окно «Мониторинг порта»

 

Arduino. Подключение аналогового датчика уровня воды.

Получаем аналоговую информацию с помощью аналоговой ножки.

 

Arduino. Управление сервоприводом без библиотеки Servo.h

Общаемся с сервоприводом, посредством передачи сформированных «в ручную» цифровых сигналов.

 

Arduino. Датчик влажности и температуры DTH11, подключаем через библиотеку DHT.h

Используем стороннюю библиотеку загруженную с github.

 

Arduino. Датчик влажности и температуры DTH11, общаемся на прямую.

Передаём и получаем цифровые сигналы с датчика на прямую.

 

Arduino. Датчик Света. MH-Series

Arduino. Геркон магнитный Датчик. MH-Series

Arduino. Датчик вибраций SW-420. MH-Series

Ряд примеров использования датчиков MH-серии

 

Arduino. Ультразвуковой датчик HC-SR04

Подключение ультразвукового датчика расстояния к arduino без сторонних библиотек.

]]>
https://coolcode.ru/arduino_list/feed/ 3
Arduino. Датчик влажности и температуры DTH11, общаемся на прямую. https://coolcode.ru/arduino-datchik-vlazhnosti-i-temperaturyi-dth11-obshhaemsya-na-pryamuyu/ https://coolcode.ru/arduino-datchik-vlazhnosti-i-temperaturyi-dth11-obshhaemsya-na-pryamuyu/#respond Mon, 02 May 2016 10:02:17 +0000 http://coolcode.ru/?p=8309
  1. Плата Arduino. x1
    arduino uno
  2. Компьютер(для написания и загрузке кода, а так же мы будем брать с него электричество и общаться с ним). x1
  3. Провод для соединения компьютера и платы. x1
    USBwire
  4. Датчик температуры и влажности DTH11.
    DTH11
  5. Провода. x3
    wire
  6. Есть схемы с внешним источником питания, но можно взять питание и с платы.

Схема:

ArduinoDTH11_1_bbArduinoDTH11_1_схемаDTH11_3

ArduinoDTH11_2_bbArduinoDTH11_2_схема

Рассмотрим скетч, в котором мы будем управлять датчиком DTH11 на прямую, через передачу и приём сигнала(а так же его обработку) используя только стандартные функции.

const int dataPin = 2;
int temperature = -1;
int humidity = -1;

void setup(){
  Serial.begin(9600);
}
int readDTH11(){
  uint8_t recvBuffer[5];
  uint8_t cnt = 7;
  uint8_t idx = 0;
  for (int i = 0; i<5; i++) recvBuffer[i] = 0;
  
  pinMode(dataPin, OUTPUT);
  digitalWrite(dataPin, LOW);
  delay(18);
  digitalWrite(dataPin, HIGH);
  delayMicroseconds (40);
  pinMode (dataPin, INPUT);
  pulseIn (dataPin, HIGH);
  
  unsigned int timeout = 10000;
  for (int i=0; i<40; i++)
  {
    timeout =10000;
    while (digitalRead(dataPin) == LOW){
      if (timeout==0) return -1;
      timeout--;
    }
    
    unsigned long t = micros();
    timeout =10000;
    while (digitalRead(dataPin) == HIGH){
      if (timeout==0) return -1;
      timeout--;
    }
    if ((micros()-t)>40) recvBuffer[idx] |= (1 <<cnt);
    if (cnt == 0)
    {
      cnt = 7;
      idx++;
    }
    else cnt--;
  }
  humidity = recvBuffer[0];
  temperature = recvBuffer[2];
  uint8_t sum = recvBuffer[0]+recvBuffer[2];
  if (recvBuffer[4] != sum) return -2;
  return 0;
}

void loop(){
    int ret = readDTH11();
    if(ret !=0) Serial.println(ret);
    Serial.print("Humidity: ");Serial.print(humidity);Serial.println(" %");
    Serial.print("Temperature: ");Serial.print(temperature);Serial.println(" C");
    delay(2000);
}

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

int temperature = -1;
int humidity = -1;

В переменной dataPin мы будем хранить значение номера штырька. Объявляется dataPin как константа (const) и подразумевается, что значение переменной не будет менятся.

const int dataPin = 2;

Так же у нас будет использоваться две переменные со значением температуры и влажности (переменные целого типа):

int temperature = -1;
int humidity = -1;

В блоке Setup устанавливаем скорость взаимодействия компьютера и Arduino.

Serial.begin(115200);

В нашем случае в значение 115200 бод

дальше мы объявляем функцию readDTH11() которая будет отдавать 0 когда удалось получить значение, -1 когда датчик не отвечает, и -2 когда не совпала контрольная сумма. Перед тем как вернуть 0 данная функция назначит глобальным переменным humidity и temperature значения влажности и температуры соответственно.

Рассмотрим её по подробнее:

uint8_t recvBuffer[5];
uint8_t cnt = 7;
uint8_t idx = 0;
for (int i = 0; i<5; i++) recvBuffer[i] = 0;
  
pinMode(dataPin, OUTPUT);
digitalWrite(dataPin, LOW);
delay(18);
digitalWrite(dataPin, HIGH);
delayMicroseconds (40);
pinMode (dataPin, INPUT);
pulseIn (dataPin, HIGH);
  
unsigned int timeout = 10000;
for (int i=0; i<40; i++)
{
  timeout =10000;
  while (digitalRead(dataPin) == LOW){
    if (timeout==0) return -1;
    timeout--;
  }
    
  unsigned long t = micros();
  timeout =10000;
  while (digitalRead(dataPin) == HIGH){
    if (timeout==0) return -1;
    timeout--;
  }
  if ((micros()-t)>40) recvBuffer[idx] |= (1 <<cnt);
  if (cnt == 0)
  {
    cnt = 7;
    idx++;
  }
  else cnt--;
}
humidity = recvBuffer[0];
temperature = recvBuffer[2];
uint8_t sum = recvBuffer[0]+recvBuffer[2];
if (recvBuffer[4] != sum) return -2;
return 0;

Задаём переменные которые будут использоваться в фунции:

uint8_t recvBuffer[5];
uint8_t cnt = 7;
uint8_t idx = 0;

Задаём массив recvBuffer целых 8 битных без знаковых чисел, с точной шириной. Длинной 5

uint8_t recvBuffer[5];

в которыё мы будем вносить данные со щётчика.

а так же переменные cnt = 7 в ней будет хранится номер текущего передаваемого бита.

и idx = 0 в котором будет хранится номер байта идущего со счётчика( или индекс массива)

Здесь же зануляем массив:

for (int i = 0; i<5; i++) recvBuffer[i] = 0;

теперь мы готовы начать обмен данными…

pinMode(dataPin, OUTPUT);

устанавливаем значение штырька в режим вывода.

digitalWrite(dataPin, LOW);

устанавливаем значение LOW

delay(18);

ждём 18 милисекунд

digitalWrite(dataPin, HIGH);

включаем напряжение (устанавливаем режим HIGH)

delayMicroseconds (40);

на 40 микросекунд

тем самым мы послали сигнал на сенсор, который говори, что мы готовы начать принимать данные.

pinMode (dataPin, INPUT);

устанавливаем штырёк в режим приёма данных

pulseIn (dataPin, HIGH);

Пропускаем первый сигнал. (LOW-HIGH);

unsigned int timeout = 10000;

опередляем переменную timeout в которой будет хранится кол-во итераций циклов, что бы не попасть в бесконечную петлю.

Выставляем максимальное кол-во циклов, ожидания перехода из состояния штырька из  LOW  в HIGH.

while (digitalRead(dataPin) == LOW){
    if (timeout==0) return -1;
    timeout--;
  }

Непосредственно само ожидание, пока значение штырька равно LOW выполнять цикл, при этом каждый цикл значение timeout уменьшается на 1:

timeout--;

а если щётчик достиг 0, то прерываем работу функции со значением -1

if (timeout==0) return -1;

далее делаем замер времени:

unsigned long t = micros();

в переменной t — сохранится количество микросекунд пройденное с момента загрузки платы.

далее по принципу предыдущего цикла ждём, пока закончится идти сигнал HIGH

timeout =10000;
  while (digitalRead(dataPin) == HIGH){
    if (timeout==0) return -1;
    timeout--;
  }

Далее будет идти интересная строчка:

if ((micros()-t)>40) recvBuffer[idx] |= (1 <<cnt);

Разберём её по подробнее:

(micros()-t)>40 здесь мы опять смотрим сколько прошло времени с момента запуска платы (micros()) и вычитаем из неё ранее сохранённое значение времени. если это значение больше 40 микросекунд, будем считать, что это 1. На этом шаге есть нюанс, раз в примерно 70 минут это значение сбрасывается. И если мы попали именно в этот промежуток времени то вместо 1 может получится 0.

Вы ражением (1 <<cnt),  мы делаем побитовый сдвиг в лево иденицы на номер текущего бита. Например если cnt=7 (это первоначальное значение которое мы задали), то если у нас было &0000001(двоичная запись числа), то после операции 1<<7 у нас получится &1000000. Соответсвенно: (1<<6) = (&00000001<<6) = 0100000.

recvBuffer[idx] |= (1 <<cnt) можно записать, как  recvBuffer[idx] =recvBuffer[idx]|(1 <<cnt)

Знак | является по битовым или на всякий случай:

a b aVb
1 1 1
1 0 1
0 1 1
0 0 0

побитовое или будет сравнивать двоичные записи данных чисел по битам и выполнять над ними операцию или, так например для 12|10=(&1100 | &1010)=&1110=14

ну и соответственно recvBuffer[idx] будет являться текущим байтом данных.

Соответственно строчка:

if ((micros()-t)>40) recvBuffer[idx] |= (1 <<cnt);

делает следующую операцию, если время сигнала больше 40 микросекунд, то текущий бит буфера изменяется на 1 вместо 0. (не забываем, что в начале мы его обнулили).

Далее:

if (cnt == 0)
  {
    cnt = 7;
    idx++;
  }

Если мы закончили заполнять байт, переходим к следующему. Если же мы не дошли до конца:

else cnt--;

переходим к следующему биту(то есть предыдущему… 🙂

Здесь заканчивается основной цикл, тоесть мы получили 40 бит (for (int i=0; i<40; i++)).

После этого разбираем полученный буфер на значения, так:

humidity = recvBuffer[0];

В нулевом(первом) бите будет находится влажность мы передаём её в глобальную переменную humidity

temperature = recvBuffer[2];

Во втором (третьем) бите будет хранится значение температуры и мы её передаём в глобальную переменную temperature.

Далее проверяем контрольную сумму:

uint8_t sum = recvBuffer[0]+recvBuffer[2];
if (recvBuffer[4] != sum) return -2;

Если recvBuffer[4] = recvBuffer[0]+recvBuffer[2] то всё хорошо. А если нет, функция закончится и выведет значение -2.

return 0;

Если всё хорошо то выводим 0.

Ура! функция закончилась, осталось ей воспользоваться в главном цикле loop:

int ret = readDTH11();
    if(ret !=0) Serial.println(ret);
    Serial.print("Влажность: ");Serial.print(humidity);Serial.println(" %");
    Serial.print("Температура: ");Serial.print(temperature);Serial.println(" С");
    delay(2000);

int ret = readDTH11();

Здесь мы запускаем функцию readDTH11() и её вывод записываем в переменную ret.

if(ret !=0) Serial.println(ret);

Если мы не дошли до конца функции и вывалились по середине, то выводим код ошибки на компьютер.

Serial.print("Humidity: ");Serial.print(humidity);Serial.println(" %");
Serial.print("Temperature: ");Serial.print(temperature);Serial.println(" C");

а так же выводим текущие значения влажности и температуры

delay(2000);

Делаем задержку между замерами.. датчик не может делать замеры чаще чем раз в 2 секунды.

Скетч закончился.

Видео процесса:

Другие статьи по программированию плат Arduino можно посмотреть здесь.

]]>
https://coolcode.ru/arduino-datchik-vlazhnosti-i-temperaturyi-dth11-obshhaemsya-na-pryamuyu/feed/ 0