1

(0 ответов, оставленных в Технические вопросы)

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

Если направить датчики друг на друга и разнести их в пространстве сантиметров на 30 вполне можно мерить скорость потока воздуха, проходящего по оси вдоль которой расположены датчики. То есть можно не только измерить давление воздуха, но и скорость ветра. Добавьте сюда датчик температуры и метеостанция готова )) (датчик температуры нужен для коррекции значений давления воздуха. Так как всё таки плотность воздуха и его давление есть немного разные вещи)

2

(4 ответов, оставленных в Технические вопросы)

Вот еще



//Небольшой легкий пример использования LCD Keypad Shield в качестве простых часов с управлением подсветкой ЖК.
//В качестве, собственно, часов используется микросхема DS1307 подключенная по схеме с arduino.org

/*
  LiquidCrystal_MCP23x17 Library - Hello World
  see http://freeduino.ru for details

  sample is based on original Arduino LiquidCrystal sample
  with only difference, that we use MCP23x17-based shield
  for interfacing with LCD display
*/
//include base class code
#include <MCP23x17.h>

////For SPI version of shield we include SPI.h and MCP23S17.h:
//#include <SPI.h>
//#include <MCP23S17.h>

//For I2C version of shield we include Wire.h and MCP23017.h:
#include <Wire.h>
#include <MCP23017.h>
#include <DS1307.h>

//include the library code
#include <LiquidCrystal_MCP23x17.h>

//menu
char *MenuItems_Backlight[] = {
  "Backlight OFF",
  "Backlight ON"
};

////For SPI version of shield we create CMCP23S17 object:
//CMCP23S17 MCP;

//For I2C version of shield we create CMCP20S17 object:
CMCP23017 MCP;

//LCD object
LiquidCrystal_MCP23x17 lcd;

//Menu objects
LCDMenu Menu_Backlight;

void setup() {
//  //For SPI version of shield we configure SPI bus, and MCP object with CS line (10) and address (0)
//  SPI.begin();
//  MCP.init(10, 0);

  //For I2C version of shield we configure I2C bus, and MCP object with address (0)
  Wire.begin();      //TWBR = 12;  // <- uncomment this for 400kHz I2C
  MCP.init(0);

  //here we configure LCD object to work through specified MCP object
  lcd.init(MCP);
  //...and turn off backlight
  lcd.Backlight(0);

  //...all the following code will be the same for original LiquidCrystal library and MCP23x17-based

  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  //lcd.print("hello, world!");
  Menu_Backlight.init(lcd, MenuItems_Backlight, 2);

  //clock для первого запуска часов раскомментируйте, установите время, затем закомментируйте обратно, иначе часы будут установлены в эти значения каждый раз
//   RTC.stop();
//  RTC.set(DS1307_SEC,1);        //set the seconds
//  RTC.set(DS1307_MIN,51);     //set the minutes
//  RTC.set(DS1307_HR,15);       //set the hours
//  RTC.set(DS1307_DOW,1);       //set the day of the week
//  RTC.set(DS1307_DATE,14);       //set the date
//  RTC.set(DS1307_MTH,5);        //set the month
//  RTC.set(DS1307_YR,12);         //set the year
//  RTC.start();

}
void clock(){
   // вывод даты в верхнюю строку.
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 0);
  lcd.print(RTC.get(DS1307_DATE,false))+lcd.print(".")+lcd.print(RTC.get(DS1307_MTH,false))+lcd.print(".")+lcd.print(RTC.get(DS1307_YR,true));

  lcd.setCursor(0, 1);
  //Добавляем ноль перед цифрой минут, секунд, что бы было удобнее смотреть
  lcd.print(RTC.get(DS1307_HR,true))+lcd.print(":");
  if (RTC.get(DS1307_MIN,false)<10)
  {lcd.print("0")+lcd.print(RTC.get(DS1307_MIN,true))+lcd.print(":");} else {lcd.print(RTC.get(DS1307_MIN,true))+lcd.print(":");}
  if (RTC.get(DS1307_SEC,false)<10)
    {lcd.print("0")+lcd.print(RTC.get(DS1307_SEC,false));}
    else { lcd.print(RTC.get(DS1307_SEC,false));}
}

void loop() {
  uint8_t i_2;
  clock();// подпрограмма вывода времени,
  if (lcd.KeyPressed()==KEY_ENTER) //при нажатии кнопки enter вызываем меню управления подсветкой
  {
    while (lcd.KeyPressed()!=0);
    i_2=Menu_Backlight.Choice();
    lcd.Backlight(i_2);
    lcd.clear();
  }
}

3

(4 ответов, оставленных в Технические вопросы)

Вот кусочек скетча, где видно, как можно перехватить и обработать нажатие кнопки

void loop() {
  uint8_t i_1, i_2;
  clock();
  if (lcd.KeyPressed()==KEY_ENTER)
  {
    while (lcd.KeyPressed()!=0);
    i_2=Menu_Backlight.Choice();
    lcd.Backlight(i_2);
    lcd.clear();
  }
}

от встроенного стабилизатора

Можно ))
irkrexx@mail.ru

Да, со штырьками. Моторчик здесь же есть... У которого с редуктором 2048 шагов на оборот. Можно для моторчиков использовать внешнее питание. Напрямую от аккумулятора, а не через ардуину, тогда выдержит нормально.

Мотор Шилд заодно закажите, тогда всё проще будет делать, чем на родных микросхемах от принтера

Nano5 и Motor Shield v3 с крепежом под Nano. Дешево и сердито получится.

Понятненько ))) Так как у меня есть только Motor Shield и нет таких микросхем и моторов, то получился "сферический конь в вакууме" ))

// Надо подцепить подтягивающие резисторы внешние между gnd и 14 и 15 пинами (это 0 и 1 analog in)
// кнопки включаем между 5+ и 14 и 15 пинами, кнопки нормально разомкнуты
// this code is public domain, enjoy!

#include <AFMotor.h>

// Connect a stepper motor with 48 steps per revolution (7.5 degree)
// to motor port #2 (M3 and M4)
AF_Stepper motor2(48, 1);
AF_Stepper motor3(48, 2);
int kon2 = 14; // на какой пин концевик горизонтали (это 0 аналоговый пин)
int kon3 = 15; // на какой пин концевик вертикали (1 аналоговый пин)
int b_power = 16; //пин сигнал включения фотоаппарата (2 аналоговый пин)
int b_start = 17; // пин сигнал съемки (3 аналоговый пин)
int state2 = 0; //начальное положение
int state3 = 0; // то же самое

void setup() {
  pinMode(kon2, INPUT); //концевик горизонтали
  pinMode(kon3, INPUT); // концевик вертикали
  pinMode(b_power, OUTPUT); // говорим ардуине, что этим пином включаем фотик
  pinMode(b_start, OUTPUT); // этим пином будем фотографировать
  digitalWrite(b_power, LOW); //на выходе для включения фотика 0
  digitalWrite(b_start, LOW); //на выходе для кнопки спуска 0

  motor2.setSpeed(10);  // 10 rpm   скорость вращения ротора задаем
  motor3.setSpeed(10);
}

void loop() {
 
  start();
  digitalWrite(b_power, HIGH); //включаем фотик. Считаем, что + должен быть всегда, пока фотик включен
  //delay(300); //если нужен только импульс, то расскоментируем строки. Задержка в миллисекундах
  // digitalWrite(b_power, LOW); //и эту тоже
  foto(); // делаем снимок
  // поворачиваем и фотаем 12 раз по 30 градусов
  overshtag();
  vozvrat();// возвращаем по горизонту в начальное положение
  motor3.step(6, FORWARD, SINGLE); //задираем фотик на 45 градусов или на 6 шагов
  foto();
  overshtag();
  vozvrat();
  motor3.step(6, FORWARD, SINGLE); //задираем фотик на 45 градусов или на 6 шагов
  foto();
  overshtag();
  vozvrat();
  motor3.step(6, FORWARD, SINGLE); //задираем фотик на 45 градусов или на 6 шагов
  foto();
  start(); //возврат в исходное положение
 
}
void start() {
  // считываем положения концевиков, сначала горизонт
  state2 = digitalRead(kon2);
  while(state2 == LOW) {
    //концевик не нажат, крутим мотор против часовой стрелки
    motor2.step(1, BACKWARD, SINGLE); 
    state2 = digitalRead(kon2);
  }
  //теперь вертикаль
  state3 = digitalRead(kon3);
  while(state3 == LOW) {
    motor3.step(1, BACKWARD, SINGLE);
    state3 = digitalRead(kon3);
  }
 
}
void foto() {
digitalWrite(b_start, HIGH); // делаем импульс 300 миллисекунд, имитируем нажатие кнопки
  delay(300);
  digitalWrite(b_start, LOW);
  delay(3000); // три секунды фотику на настройку резкости и собственно снимок
}
void overshtag(){
  // крутим по горизонтали на 4 шага и делаем фото(48 шагов на оборот делим на 4), если есть редуктор, корректируем
  for (int i=0; i <= 11; i++){
  motor2.step(4, FORWARD, SINGLE); // подпрограмма поворота по горизонтали на 30 градусов
  digitalWrite(b_start, HIGH); // делаем импульс 300 миллисекунд, имитируем нажатие кнопки
  delay(300);
  digitalWrite(b_start, LOW);
  delay(3000); // три секунды фотику на настройку резкости и собственно снимок
  }
}
void vozvrat(){
  state2 = digitalRead(kon2);
  while(state2 == LOW) {
    //концевик не нажат, крутим мотор против часовой стрелки
    motor2.step(1, BACKWARD, SINGLE); 
    state2 = digitalRead(kon2);
  }
}

Нужны будут микрики на горизонталь и на вертикаль.
Для включения фотоаппарата какой длительности надо импульс 5 вольт?
Для эмуляции нажатия кнопки съемки какая должна быть длительность импульса?

Ок, сейчас посмотрю... Почему то уведомление не пришло об ответе...

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

По алгоритму вопрос: Правильно я понял принцип работы? Включаем фотик и крутим его на 360 градусов через каждые 30 градусов делая снимок. Затем приподнимаем и повторяем цикл?

Сложности вижу только в наличии прямых рук, что бы всё собрать из груды железа ))
И еще, чем на кнопку нажимать?
Проще, наверное, на рулевых машинках сделать... Там известны начало, конец и середина. Наклон фотика сделать точно на рулевой машинке.
Горизонтальный поворот - на шаговом моторе. Нажатие кнопки для съемки - тоже рулевой машинкой или соленоидом.
Итого имеем необходимость управления четырьмя моторами. Это всё можно решить с помощью стандартной платы расширения.

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

12

(2 ответов, оставленных в Технические вопросы)

Еще есть необходимость? Какие еще шилды будут использоваться? Кнопки, индикация..
Тип термопары

Vano_2010 пишет:

Помогите подружить  датчик  влажности и температуры SHT11 с Adruino
Аналогично скетчу для для датчика DHT11
Договоримся

Помощь нужна еще или уже всё?

14

(1 ответов, оставленных в Технические вопросы)

Всем спасибо, разобрался. Зашел на arduino.cc и там всё нашел

15

(1 ответов, оставленных в Технические вопросы)

Где можно найти распиновку платы? Инструкцию потерял, на платке потерлись надписи. Поделитесь ссылочкой пожалуйста.

16

(1 ответов, оставленных в Технические вопросы)

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

Ну как, получилось с программой?

18

(5 ответов, оставленных в Технические вопросы)

А документации наверное нет никакой.
То что я написал - частично выдержка из ответного письма разработчиков. Но если нужно, можете и мне вопрос задать, я более-менее разобрался с кнопками

//Небольшой легкий пример использования LCD Keypad Shield в качестве простых часов с управлением подсветкой ЖК.
//В качестве, собственно, часов используется микросхема DS1307 подключенная по схеме с arduino.org

/*
  LiquidCrystal_MCP23x17 Library - Hello World
  see http://freeduino.ru for details
 
  sample is based on original Arduino LiquidCrystal sample
  with only difference, that we use MCP23x17-based shield
  for interfacing with LCD display
*/
//include base class code
#include <MCP23x17.h>

////For SPI version of shield we include SPI.h and MCP23S17.h:
//#include <SPI.h>
//#include <MCP23S17.h>

//For I2C version of shield we include Wire.h and MCP23017.h:
#include <Wire.h>
#include <MCP23017.h>
#include <DS1307.h>

//include the library code
#include <LiquidCrystal_MCP23x17.h>

//menu
char *MenuItems_Backlight[] = {
  "Backlight OFF",
  "Backlight ON"
};

////For SPI version of shield we create CMCP23S17 object:
//CMCP23S17 MCP;

//For I2C version of shield we create CMCP20S17 object:
CMCP23017 MCP;

//LCD object
LiquidCrystal_MCP23x17 lcd;

//Menu objects
LCDMenu Menu_Backlight;

void setup() {
//  //For SPI version of shield we configure SPI bus, and MCP object with CS line (10) and address (0)
//  SPI.begin();
//  MCP.init(10, 0);

  //For I2C version of shield we configure I2C bus, and MCP object with address (0)
  Wire.begin();      //TWBR = 12;  // <- uncomment this for 400kHz I2C
  MCP.init(0);
 
  //here we configure LCD object to work through specified MCP object
  lcd.init(MCP);
  //...and turn off backlight
  lcd.Backlight(0);

  //...all the following code will be the same for original LiquidCrystal library and MCP23x17-based
 
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  //lcd.print("hello, world!");
  Menu_Backlight.init(lcd, MenuItems_Backlight, 2);
 
  //clock для первого запуска часов раскомментируйте, установите время, затем закомментируйте обратно, иначе часы будут установлены в эти значения каждый раз
//   RTC.stop();
//  RTC.set(DS1307_SEC,1);        //set the seconds
//  RTC.set(DS1307_MIN,51);     //set the minutes
//  RTC.set(DS1307_HR,15);       //set the hours
//  RTC.set(DS1307_DOW,1);       //set the day of the week
//  RTC.set(DS1307_DATE,14);       //set the date
//  RTC.set(DS1307_MTH,5);        //set the month
//  RTC.set(DS1307_YR,12);         //set the year
//  RTC.start();
 
}
void clock(){
   // вывод даты в верхнюю строку.
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 0);
  lcd.print(RTC.get(DS1307_DATE,false))+lcd.print(".")+lcd.print(RTC.get(DS1307_MTH,false))+lcd.print(".")+lcd.print(RTC.get(DS1307_YR,true));
 
  lcd.setCursor(0, 1);
  //Добавляем ноль перед цифрой минут, секунд, что бы было удобнее смотреть
  lcd.print(RTC.get(DS1307_HR,true))+lcd.print(":");
  if (RTC.get(DS1307_MIN,false)<10)
  {lcd.print("0")+lcd.print(RTC.get(DS1307_MIN,true))+lcd.print(":");} else {lcd.print(RTC.get(DS1307_MIN,true))+lcd.print(":");}
  if (RTC.get(DS1307_SEC,false)<10)
    {lcd.print("0")+lcd.print(RTC.get(DS1307_SEC,false));}
    else { lcd.print(RTC.get(DS1307_SEC,false));}
}

void loop() {
  uint8_t i_2;
  clock();// подпрограмма вывода времени,
  if (lcd.KeyPressed()==KEY_ENTER) //при нажатии кнопки enter вызываем меню управления подсветкой
  {
    while (lcd.KeyPressed()!=0);
    i_2=Menu_Backlight.Choice();
    lcd.Backlight(i_2);
    lcd.clear();
  }
}

20

(5 ответов, оставленных в Технические вопросы)

Вот кусочек скетча, где видно, как можно перехватить и обработать нажатие кнопки

void loop() {
  uint8_t i_1, i_2;
  clock();
  if (lcd.KeyPressed()==KEY_ENTER)
  {
    while (lcd.KeyPressed()!=0);
    i_2=Menu_Backlight.Choice();
    lcd.Backlight(i_2);
    lcd.clear();
  }
}

21

(5 ответов, оставленных в Технические вопросы)

Например, показать на экране, какая кнопка была нажата последней.

22

(5 ответов, оставленных в Технические вопросы)

Как программно обработать нажатия кнопок в LCD Keypad Shield? Какой нибудь примерчик подкиньте пожалуйста.