вторник, 7 июня 2016 г.

Ардуино подключаем ЧРВ и SD карту


Постепенно приближаемся к реализации нашего нового проекта. Но пока приходиться все делать по шагам. Сегодня мы сделаем еще один шаг вперед: научимся подключать к ардуино часы реального времени и SD карту. И более того будем записывать данные на карту памяти. А начнем с подключения отдельных блоков.

Первый блок это ЧРВ (часы реального времени). На этот раз мы подключим пины следующим образом:  GND-GND, VCC-+5V, RST-5, CLK-7, DAT-6. При этом указанные пины (5,6,7) в скетче можно всегда заменить на другие.  Итак, модуль ЧРВ мы подключили…

Теперь давайте подключим SD карту. Для этого проще всего воспользоваться схемой, и тогда точно не запутаетесь в куче проводов идущего от модуля SDкарты. На всякий случай на схеме отобразим подключения обоих модулей.  Итак схему собрали, но перед тем как переходить к скетчу давайте установим библиотеки:   <SPI.h>, <SD.h>, и  <RTC.h>. Все эти библиотеки можно загрузить с Яндекс диска (по отдельности) или сразу общимархивом.

Теперь что будет собственно делать скетч. В нашем проекте мы будем вести несколько логов (общий и отдельные логии для записи времени и случайных чисел) на карте памяти. Кстати не забудьте сразу же на компьютере отформатировать карту в FAT32 (FAT16). По сути дела мы будем (в следующем проекте подключать датчики) записывать на карту памяти время, и случайные числа (пока еще не подключили датчик атмосферного давления). Скетч можно так же загрузить с Яндекс диска жми сюда....

#include <SPI.h>
#include <SD.h>
#include <RTC.h>
RTC    time;
//Set by default for the SD card library
//MOSI = Pin 11
//MISO = Pin 12
//SCLK = PIN 13
//We always need to set the CS Pin
const int CS_PIN  =10;
long datet;
//We set this high to provide power
const int POW_PIN =8;

void setup()
{
   time.begin(RTC_DS1302,5,7,6);
  Serial.begin(9600);
  Serial.println("Initializing Card");
  //CS pin is an output
  pinMode(CS_PIN, OUTPUT);

  //Card will draw power from pin 8, so set it high
  pinMode(POW_PIN, OUTPUT);
  digitalWrite(POW_PIN, HIGH);

  if (!SD.begin(CS_PIN))
  {
    Serial.println("Card Failure");
    return;
  }
  Serial.println("Card Ready");
}

void loop()
{
    int dataString = random (1000);
    // datet
  // time.gettime("d-m-Y, H:i:s, D");
    //Open a file and write to it.
  File dataFile = SD.open("log.csv", FILE_WRITE);
  if (dataFile)
  {
    dataFile.print(time.gettime("H:i"));
    dataFile.print(",");
    dataFile.println(dataString);
    dataFile.close();
  }
       
 // отделный лог для случ чисел

 dataFile = SD.open("ran.csv", FILE_WRITE);
  if (dataFile)
  {
        dataFile.println(dataString);
    
   dataFile.close();
 
  }

 // отдельный лог для времени
 dataFile =SD.open("tame.csv", FILE_WRITE);
  if (dataFile)
  {
        dataFile.println(time.gettime("H:i"));
    
   // dataFile.flush();
    
  }
       dataFile.close();
  delay(5000);
}


воскресенье, 5 июня 2016 г.

Начинаем работать с часами реального времени


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

Начнем пожалуй с подключения ЧРВ (часы реального времени) к ардуино. Это как раз несложно. У меня оказался модуль DS1302 и вот как нужно будет подключить выводы:  GND-GND, VCC-+5V, RST-10, CLK-13, DAT-12. При этом указанные пины (10,12,13) в скетче можно всегда заменить на другие.  Итак, модуль ЧРВ мы подключили…

Теперь шаг второй – это скетч. Скетч простой, и первым делом нужно будет в нем вручную изменить (поставить или снять //) в зависимости от модуля чипа. Выбирайте тот модуль который у вас и закомментируйте строчку с ненужным модулем, и раскоментируйте с вашим. Для информации: я использую модуль DS1302.

А вот теперь нам нужно установить точное время. Для начала обратим внимание (это важно!) на следующие две строки в программном коде:
  time.settime(35,10,20);// 35 сек, 10 мин, 20 час, дату оставить без изменений
  time.settime(-1,-1,-1,31,12,15);    // 31, декабря, 2015 года, время и день недели оставить без изменений}

Вот здесь и нужно сначала установить точную дату и время. Причем сделать это нужно заранее перед самой компиляцией. Так же обратите что компиляция и запись скетча в МК тоже займет некоторое время что тоже желательно учесть. Скажем у меня это занимает порядка 20 секунд. Все что мне нужно сделать : синхронизировать время на компьютере, установить время и за 20 секунд  начать компиляцию. После компиляции обязательно (не забудьте это важно!) закомментируйте эти две строчки. Вот и все. Можете пользоваться. Да и еще чуть не забыл: библиотеку RTC.h можно загрузить с Яндекс диска. 

#include <RTC.h>
RTC    time;
void setup() {
    delay(300);
    Serial.begin(9600);
//    инициализация модуля RTC
    // time.begin(RTC_DS3231);// на базе чипа DS3231модуль подключается к аппаратным выводам I2C
  //  time.begin(RTC_DS1307);// на базе чипа DS1307модуль подключается к аппаратным выводам I2C
    time.begin(RTC_DS1302,10,13,12);    // на базе чипа DS1302, вывод RST, вывод CLK, вывод DATдоступны любые выводы
//    запись даты и времени
// time.settime(0,51,21,27,10,15,2);    // 0  сек, 17 мин, 15 час, 1, октября, 2015 года, четверг
  time.settime(35,10,20);// 35 сек, 10 мин, 20 час, дату оставить без изменений
  time.settime(-1,-1,-1,31,12,15);    // 31, декабря, 2015 года, время и день недели оставить без изменений
}
void loop(){
    if(millis()%1000==0){ // если прошла 1 секунда
      Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время
      delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс
    }

суббота, 28 мая 2016 г.

Метеостанция на 4 строчном ЖК дисплее…

Вот наконец получил и держу в руках четырех строчный LCD дисплей с I2C модулем. Дисплей выглядит впечатляющее: довольно больших размеров, и при этом на нем в каждой из четырех строк может поместиться 20 символов. Как раз более чем достаточно для нашего нового проекта. В новом проекте будем собирать многоцелевое устройство, которое может измерять атмосферное давление, температуру и влажность. Все это будет выводится на экран.

Первым делом просто подключаю дисплей к плате с нашего прошлого проекта «метео-1». Даже скетч не стал переписывать, для первого тестирования дисплея сойдет и старый. Вот подключаю четыре провода от I2C модуля, и можно приступать к тесту. Подключаю к ардуино повербанк и на экране появилась информация о температуре, давлении и влажности…

Теперь самое время заняться улучшениями. Первое что нужно сделать, так это давление выводить отдельной строкой. Добавляю в скетч пару строчек кода, тестирую… Работает! Следующим шагом нужно настроить правильный вывод размерности величин: после цифры дальше должно идти или проценты, или значок С, или мм РТ ст…


Снова работаем с программой. Скетч пришлось пару раз переделывать, так как пришлось «выловить» и исправить пару ошибок, и один недочет. Зато теперь все получилось как у настоящей метеостанции. Как говориться для начала хватит! Главное что все работает теперь как и планировалось. 
Скетч:

#include <Wire.h>
#include <Adafruit_BMP085.h>
float t;
float p;

Adafruit_BMP085 bmp;
#include <Wire.h> // Добавляем необходимые библиотеки
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#define DHTPIN A0 // к какому пину будет подключен сигнальный

//выход датчика
//выбор используемого датчика
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
//инициализация датчика
DHT dht(DHTPIN, DHTTYPE);
byte degree[8] = // кодируем символ градуса
{
   B00111,
   B00101,
   B00111,
   B00000,
   B00000,
   B00000,
   B00000,
};
LiquidCrystal_I2C lcd(0x27,16,2); // Задаем адрес и размерность


void setup()
{
lcd.init(); // Инициализация lcd
lcd.backlight(); // Включаем подсветку
lcd.createChar(1, degree); // Создаем символ под номером 1
Serial.begin(9600);
dht.begin();
Serial.begin(9600);
  if (!bmp.begin()) {
  Serial.println("Could not find a valid BMP085 sensor, check wiring!");
  while (1) {}
  }
}
void loop() {
// Добавляем паузы в несколько секунд между измерениями
delay(2000);
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
t=bmp.readTemperature();
p=bmp.readPressure();
p=p/133.33;
p=p+8.8; // поправка
// Выводим показания влажности и температуры
lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки
lcd.print("Hum = "); // Выводим текст
lcd.setCursor(7, 0); // Устанавливаем курсор на 7 символ
lcd.print(h, 0); // Выводим на экран значение влажности
lcd.setCursor(12,0);
lcd.print("%");

lcd.setCursor(0, 1); // Устанавливаем курсор в начало 2 строки
lcd.print("Tem =  "); // Выводим текст, \1 - значок градуса
lcd.setCursor(7, 1); // Устанавливаем курсор на 7 символ
lcd.print(t,1); // Выводим значение температуры
lcd.setCursor(12,1);
lcd.print("C");
//delay(2500);
lcd.setCursor(0, 2); // Устанавливаем курсор в начало 1 строки
lcd.print("P = "); // Выводим текст
lcd.setCursor(4, 2); // Устанавливаем курсор на 7 символ
lcd.print(p, 1); // Выводим на экран значение давления
lcd.setCursor(10,2);
lcd.print("mm Hg ");


}

пятница, 20 мая 2016 г.

Телеграфный ключ – радиомаяк

Всем читателям привет! По-прежнему пишу в блоге, как только выпадает свободное время. А тут как говориться середина мая, дел должно быть невпроворот, но погода как всегда внесла свои коррективы. Одним словом благодаря тому, что у нас зарядили частые дожди, на даче дел не так много. Вот и время появилось. Ну и конечно же приступил к работе с ардуино.  В эфире просто пока не рискую работать: погода меняется так, что в течении дня то пасмурно, то дожди, то грозы. Но вот с ардуино можно и поработать…

Решил продолжить работу над  новым проектом:  автоматический телеграфный ключ – радиомаяк. Как раз для такого расширенного проекта не жаль будет использовать микроконтроллер ардуино. А то как то два МК  один для ключа, другой для нового маяка использовать – это будет нерационально. А вот два проекта в одном – это самое то! Так что с задачами определился и приступил к работе. Первым делом нужно  начертить схему. В проекте будут задействованы: два переменных резистора, несколько кнопок (которые работают как тумблеры), LCD дисплей. Так что первым делом разрабатываю схему. За основу взял прошлые схемы, и объединил их в одну. Так же не забыл добавить кнопку переключения режимов…

Со схемой все просто. Следующий шаг это написать скетч. Здесь конечно ушло гораздо больше времени. Хотя дело несложное: объединить коды из двух предыдущих проектов. Но не все так просто оказалось. Сначала пришлось искать ошибки компиляции. Но с этим справился. И в первой тестовой версии  решил пока что остановиться на отладке электронного ключа. То есть провести полное тестирование, и если нужно будет настройку параметров самого ключа. Вот наконец все сделал, объединенный код  (от двух прошлых проектов: ключ и маяк) скомпилировался без ошибок…Скетч можно загрузить с Яндекс диска по ссылке...

Собираю  схему на большой макетной плате. На средней было бы сложно и даже очень разместить большое количество проводов. А так благодаря начерченной в программе «Эсплан» схеме процесс сборки прототипа идет быстро и без ошибок. Да не зря тратим время на чертеж схемы. Собираю и проверяю на всякий случай правильность установленных компонентов: кнопки управления, кнопок имитирующих работу манипулятора, переменный резистор и ЖК дисплей.  На дисплей  решил пока выводить  режимы работы: «CW KEY MODE» или  «Радиомаяк».  Но сейчас важно проверить как работает первый режим:  электронный телеграфный ключ.

Все схема готова! Подключаю ардуино к ноутбуку, и записываю скетч в МК (микроконтроллер).  Все готово. ЖК экран приветливо написал соответствующий режим работы : «CW KEY MODE». Пробую переключить режим кнопкой выбора режима. Все работает: дисплей послушно отображает надписи каждого режима. В режиме маяка пока только тестовый писк. Зато ключ работает. Но пришлось немного поиграться с настройкой «отбивания» скорости и в итоге добился изменения скорости от минимума к максимуму.


На этом настройку первого режима работы  «CW KEY MODE» можно считать завершенной. Далее остается немного изменить скетч, добавив в него блок радиомаяка.  Опять выловить ошибки компиляции и можно будет сделать первую оценку всей большой работы. И если все будет работать как планировалось, то можно приступать к разработке шилда для этого проекта. Шилд  поможет правильно подключить  (благодаря шлефам) все нужные компоненты:  кнопки, ЖКИ, переменные резисторы. А еще параллельно буду решать еще задачу: поиском подходящего корпуса.

воскресенье, 15 мая 2016 г.

Управление кнопкой…

Всем читателям привет! Снова я с вами, рад очередной встрече в моем блоге. С одной стороны начать придется немного издалека. Все знают, что я уже сделал проект радиомаяк. Во второй версии радиомаяка уже можно управлять скоростью передачи и длительностью пауз после завершения цикла передачи. Так же попробовал реализовать и электронный телеграфный ключ. В общем, кто следит за блогом – тот в курсе. Наступило время, когда можно будет объединить эти проекты в один (тогда уже и ардуино плату не жалко под такое отдать на постоянную основу)…

Как это будет выглядеть? Давайте пофантазируем.  Представим коробочку с ЖК экраном, двумя регуляторами (ручки переменных резисторов), тремя кнопками (включение,  переключение режимов работы и включение-отключения звукового контроля передачи), а так же разъемами к которому можно будет подключить джек 3.5 мм (один выход на трансивер, другой вход для телеграфного манипулятора). При этом на ЖК экране в верхней строчке будет отображаться режим работы: «Beacon Mode» или «CW KEY Mode». В нижней строчке будет отображаться скорость передачи, обратный отчет времени паузы… Да идея хорошая, но теперь пожалуй пора приступить к ее реализации…

А начинать будем с банальной простой задачи: управлением кнопкой. То есть нам мало подключить кнопку к ардуино, нужно еще научить понимать МК в каком состоянии находиться кнопка (или тумблер). Таких состояний только два: включено (логическая единица) или выключено (логический ноль). А для определений этих состояний идеально подойдут цифровые входы. Они работают таким образом, что если на входе напряжение меньше 2,5 В то считается что вход имеет состояния 0 (отключено), соответственно если больше 2,5В то состояние 1 (включено).

Итак, начнем. Сначала соберем схему. Здесь все как раз просто. Обратите внимание на один важный момент: мы подключили выключатель (тумблер) не просто к пину и к земле, а через нагрузочный резистор сопротивлением 10 кОм. Это нужно чтобы избежать наводок на пине, когда он отключен от земли. Только с нагрузочным резистором у нас будет только два состояния: ноль или единица. А теперь давайте познакомимся с скетчем…
int ledPin=9;
int inputPin=5;
void setup() {
 pinMode (inputPin, INPUT); // задаем пин как вход
 pinMode (ledPin, OUTPUT); // задаем пин как выход
}

void loop() {
  int reading=digitalRead(inputPin); // считываем состояние выключателя

if (reading==0)
{
  analogWrite(9, random(255)); // если 0 то запускаем режим1 мерцания
  delay (random(100));
}
else
{
digitalWrite(9, 1);// если 1 то запускаем режим2 свечения
}
}

Вот и все. Мы добились того, что при помощи одной кнопки мы можем задавать два разных режима работы. В будущем это будет режим радиомаяка, и режим телеграфного ключа. Первый шаг к решению задачи сделан. Осталось поработать с ЖК индикатором, но этим займемся уже в следующий раз. А пока всем передаю 73!

понедельник, 9 мая 2016 г.

Тестируем все датчики походной метеостанции…

Да уже май наступил, и даже не вериться! Вот буквально отметили 1 мая, а уже 9! Так что пользуясь случаем всех поздравляю с Днем Победы. Но даже в праздник нашел немного времени, чтобы провести очень интересный тест. Да как вы уже поняли из названия будем тестировать датчики нашей метеостанции построенной на базе Ардуино...

Вообще пока что в моем проекте работают два датчика: DHT-11 (который в моем случае мерит только влажность), а так же модуль датчик атмосферного давления GY-68 (который кроме атмосферного давления еще и температуру измеряет). Настал момент, когда мы попробуем проверить точность наших датчиков.

Проверка датчика давления. Здесь просто в течении нескольких дней наблюдал и сравнивал показания барометра-анероида, и нашей цифровой метеостанции. И оказалось, что показания очень хорошо сходиться. Далее первое значение это показания анероида, второе разность показаний обеих приборов: 760-0, 763-0,5, 765-1, 767-0,4. Как говориться точностью я остался очень доволен. Так же параллельно сравнивал и температуру – точность тоже оказалась на высоте… Итак, вывод датчик GY-68 выдержал тест, и по точности можно ему поставить пять баллов.

А вот теперь пора заняться и датчиком DHT-11. Его показания будем сравнивать с расчетными значениями влажности (по психометрическим таблицам, и специальной расчётной программы) взятыми с аспирационного психрометра. Понятно что это очень точный прибор (который еще раз подтвердил что температура полученная с датчика GY-68 поразительно сходиться с показаниями ртутного термометра), поэтому я очень доверяю его показаниям.  А вот разница составила в два раза!  Значит что-то не так, это уже даже не погрешность, а ошибка.
Гипотеза ошибки наводит на два соображения, каждое из которых нужно опять таки проверять (ну что поделать наука и научный метод требуют этого). А так вполне возможно, что проблема как раз состоит в…

1.       Первая гипотеза – неисправен, бракованный сам датчик DHT-11. К счастью это можно легко проверить: у меня есть еще один такой точно датчик. Заменил его, показания абсолютно точно такие же! Значит датчик похоже исправен. Первая гипотеза похоже неверна.
2.       Вторая гипотеза – возможно библиотека датчика писалась главным образом для другого датчика (хоть и родственник нашему но все же отличаются они): DHT-22. Однако проверить такую гипотезу пока не представляется возможным, из-за отсутствия такового датчика DHT-22. Как появиться – заменим и посмотрим….
3.       Третья гипотеза – возможно сама библиотека содержит ошибку в расчетах. В этом случае ставь хоть 11 хоть 22 датчик, показания будут их не сильно отличаться. Тогда это дело можно будет исправить в скетче: просто подкорректировать значения с учетом поправки. А чтоб понять какую поправку вводить, то нужно еще понаблюдать за влажностью и каждый раз отмечать на сколько раз все отличается…

В общем как видите в результате нашего теста, появился новый фронт для исследований. Будем снова измерять, проверять данные. А еще будем ждать DHT-22, как говориться нужно отработать все гипотезы. А пока что всем удачи, и до встречи в моем блоге…


среда, 4 мая 2016 г.

Походная станция на базе ардуино…

Процесс постижения микроконтроллера Arduino идет у нас полным ходом. Как говориться когда есть новые модули и датчики, то хочется их протестировать и тут же найти им применение в новом очередном проекте. Вот и на этот раз… Нет, конечно проект далеко не новый таких проектов оказывается много, и в интернете все найти можно. Но настолько полно там «воды» что разбираться начинающим просто невероятно. Но может быть единицы разобрались и сделали…

Ладно ближе к делу. В прошлый раз мы научились выводить на LCD экран информацию с датчика DHT-11. Провели тестирование датчика в общем получилось неплохо. Но с другой стороны если делать, так делать то что действительно будет нужно. А нужна мне небольшая метеостанция, которую можно было бы взять с собой в экологическую экспедицию. К тому же модуль датчик атмосферного давления GY-68 уже так и ждет когда я его подключу к МК. Так что за дело. С чего нужно начать? Правильно с исследования датчика: как его правильно подключить, и найти нужную библиотеку. Вот здесь поджидал первый сюрприз: датчик оказывается тоже нужно подключить к пинам А4 и А5, но они вроде как уже «заняты» LCD. Попробовал найти даже готовый проект где бы данный датчик подключался через I2C к LCD экрану. Искал долго, но не нашел. Но нашел зато полезную информацию: оказывается к I2C можно подключить одновременно несколько самых разных устройств. Это уже радует. Но опять таки в интернете только одна теория: что такое I2C, как это работает. А вот практики вроде того как же подключить GY-68 через I2C включая LCD экран к Arduino нет ни слова. Даже схемы и то нет. Ладно будем действовать старым проверенным способом: метод проб и ошибок.

Но сначала нужно было еще спаять кое что. В моем случае к датчику GY-68 нужно было припаять штырьковый разъем, а если еще точнее четыре «ножки». В общем это дело простое, и любой с этим справиться. А вот дальше нужно найти библиотеку для датчика. В интернете есть много источников, но почти все эти библиотеки оказались нерабочими. Как только дело доходит до компиляции примера скетча (в самой библиотеке) так тут же всплывает и ошибки. Но все же удалось в конце концов найти и работающую библиотеку. Эта библиотека называется Adafruit_BMP085. Так же не забудьте поставить (если вы еще не установили) библиотеки: LiquidCrystal_I2C1602V1 а так же DHT-sensor-library-master. И последнее очень важно компиляцию и запись скетча в МК осуществляйте старой версией arduino-1.6.4-windows.

Первый тест был связан с проверкой и ответом на вопрос: а вообще работает ли датчик? И случайно я его при пайке не перегрел? В общем в стандартной библиотеке нашелся пример, где можно будет проверить датчик и информацию вывести в монитор порта. Все получилось! Первый шаг сделан – ура. Теперь остается самое главное: переработать (дополнить) скетч который мы с успехом применили в первом проекте. Пришлось добавить библиотеку для датчика GY-68, и написать перерасчет давления из Паскалей в наши родные миллиметры ртутного столба. Еще немного изменить скетч пришлось и в месте, где информация выводиться на экран дисплея. Скетч новый проверил на ошибки, «выловил» две ошибки, и в итоге все. Но это только скетч (загружаем его по ссылке здесь), а еще нужно правильно подключить датчик давления…

Даже не просто подключить датчик давления, но и при этом еще начертить схему. Ведь в итоге на макетной плате появиться еще один модуль и еще четыре провода нужно будет подключить. Благодаря программе sPlan, черчение заняло всего то пару минут. Теперь нужно собрать и саму схему. Присоединяю датчик к макетке, тут же подключаю провода. Да не запутаться бы. Но все пару раз проверил – все точно. А теперь будем пробовать: подключаю ардуино к компьютеру, записываю скетч в МК. Проходит загрузка, экран засветился приветливо и. Ура! Все работает! Получилось точно так, как и планировалось.

Потом разумеется еще немного поработаем над самим скетчем, чтобы выводить информацию на экран более рационально. Тем более что это возможно. В моем случае в верхней строчке через каждые две секунды выводиться показания влажности, потом давления. А нужно сделать чтобы все величины выводились одновременно на экран. Этот недочет исправлю, но уже в другой раз.

А теперь подведем важнейшие итоги:
·         Перед компиляцией скетча не забудьте подключить три библиотеки: Adafruit_BMP085 (датчик давления), LiquidCrystal_I2C1602V1 (работа с LCD дисплеем с I2C модулем), DHT-sensor-library-master (сенсор с которого мы будем получать только влажность, температуру мы будем получать с датчика GY-68).
·         К I2C можно одновременно подключить несколько разных устройств. В моем случая я даже не заморачивался которое из них будет «мастер», а которое «слейв». Все работает и без этих указаний. Подключите все устройства согласно схеме и все обязательно получиться.
·         Для компиляции и записи скетча (скетч метеостанции здесь) в МК используйте старую версию ардуино: arduino-1.6.4-windows. Так как в новой возникает проблема с выводом информации на дисплей: будет выводиться только один символ. Со старой версией такой проблемы нет.

Алексей Тепцов

(RN6LLV)

вторник, 3 мая 2016 г.

Простой термо-гигрометр на ардуино…

 Всем читателям привет! Рад очередной встрече на страницах блога. Сегодня мы попробуем сделать простейший прибор для измерения температуры и влажности, на базе Arduino с выводом информации на LCD экран. А начнем с того что перечислим что нам нужно будет для осуществления этого проекта: датчик влажности или температуры DHT11, LCD дисплей с I2C модулем, резистор на 10 кОм.

Как и что подключать вы без труда поймете из принципиальной схемы. Выводы датчика подключаем S на А0, питание на +5В (к плате ардуино), и минус к GND. Обратите внимание что на датчике 4 вывода, но использоваться будут только 3. Дисплей LCD подключается как и в прошлом проекте: VCC на +5, GND на GND, SDA на А4, SLC на А5.

Итак, все подключили (еще раз сверьтесь со схемой) пора заняться программированием МК. Скетч я нашел готовый в интернете, который неплохо будет работать. Сам скетч беремс яндекс диска жми сюда. Как видите все просто, можно даже и не уметь программировать на Си+, но тем не менее практически работать с МК.

Еще одно важное замечание. Перед тем как начать компиляцию, обязательно установите библиотеки (на этот раз две): DHT и LiquidCrystal_I2C. Так же эти библиотеки можно загрузить с Яндекс диска: библиотека DHT здесь, а LiquidCrystal_I2Cздесь. Вот теперь устанавливаем отсутвующие библиотеки (в стандартный набор библиотек они не входят). Если какой-то из этих библиотек вы не установили то при попытке скомпилировать будет ошибка.
Надеемся, что все у вас получилось. И в случае успеха на экране появиться температура и влажность. Убедимся, что датчик работает: можно на него подышать, и тем самым нагнать и температуру и влажность.

Скетч нашего проекта:

#include <Wire.h> // Добавляем необходимые библиотеки
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#define DHTPIN A0 // к какому пину будет подключен сигнальный выход датчика
//выбор используемого датчика
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
//инициализация датчика
DHT dht(DHTPIN, DHTTYPE);
byte degree[8] = // кодируем символ градуса
{
   B00111,
   B00101,
   B00111,
   B00000,
   B00000,
   B00000,
   B00000,
};
LiquidCrystal_I2C lcd(0x27,16,2); // Задаем адрес и размерность дисплея
void setup()
{
lcd.init(); // Инициализация lcd
lcd.backlight(); // Включаем подсветку
lcd.createChar(1, degree); // Создаем символ под номером 1
Serial.begin(9600);
dht.begin();
}
void loop() {
// Добавляем паузы в несколько секунд между измерениями
delay(2000);
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
// Read temperature as Celsius
float t = dht.readTemperature();
// Read temperature as Fahrenheit
float f = dht.readTemperature(true);
// Выводим показания влажности и температуры
lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки
lcd.print("Hum = % "); // Выводим текст
lcd.setCursor(7, 0); // Устанавливаем курсор на 7 символ
lcd.print(h, 1); // Выводим на экран значение влажности
lcd.setCursor(0, 1); // Устанавливаем курсор в начало 2 строки
lcd.print("Temp = \1C "); // Выводим текст, \1 - значок градуса
lcd.setCursor(7, 1); // Устанавливаем курсор на 7 символ
lcd.print(t,1); // Выводим значение температуры
}


воскресенье, 1 мая 2016 г.

Работаем с LCD дисплеем 1602


Всем читателям привет! Рад нашей новой встрече на страницах блога. Спасибо вам что посещаете мои странички. Сегодня мы научимся работать с жидкокристаллическим дисплеем (далее LCD). Так же разберемся с некоторыми проблемами, с которыми вы можете столкнуться. А пока начнём с самого начала.


Несколько важных замечаний:
1.       Дисплеи могут отличаться количеством символов и строк. Например 1602 означает что у нас двухстрочный дисплей с длиной строки в 16 символов. 1604 означает что у нас четерехстрочный дисплей, с длиной строки в 16 символов.
2.       Мы будем работать с дисплеем с I2C модулем, благодаря чему управление LCD дисплеем будет осуществляться двумя проводами (подключенные к А4 и А5), конечно же дисплей нужно будет еще запитать двумя проводами, которые мы подключим к пинам «земля» и «+5В». Благодаря I2C модулю мы избавимся от кучи проводов!
3.       Для записи скетча в плату ардуино, мы будем пользоваться программами старых версий (1.6.4 для «Виндовс 7 или 8» и 1.6.0. для «ХР»). При использовании новой версии 1.6.7 возникает проблема – не все символы (или только один) будут выводиться на экран дисплея. Возможно что в новых версиях эту проблему исправят)… Я предлагаю использовать архив с уже готовой к работе программы (то есть не требует установки на компьютер, это важно если у вас на компостере уже установлена новая версия).
4.       У дисплея может быть другой IIC адрес, вместо 0x27 может оказаться 0x3F. Чтобы точно определить адрес можете воспользоваться «сканером». Просто запишите скетч «сканер» подключите дисплей и включите ардуино. Откройте окно «порта» и посмотрите какой адрес у вашего устройства.
5.       Для работы дисплея мы будем использовать библиотеку LiquidCrystal_I2C. Если вы используете программу из архива, то установка библиотеки не потребуется (она уже имеется в архиве).

// i2c_scanner
#include <Wire.h>
  
void setup()
{
  Wire.begin();
   Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}

 void loop()
{
  byte error, address;
  int nDevices;
   Serial.println("Scanning...");
   nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
        Wire.beginTransmission(address);
    error = Wire.endTransmission();
     if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
       nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknow error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }   
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
   delay(5000);           // wait 5 seconds for next scan
}


Теперь приступим к сборке схемы. Все очень просто: нам нужно подключить 4 вывода от I2C модуля к плате ардуино. При этом подключаем выводы так: GND — GND, VCC — 5V, SDA — A4, SCL — A5. На картинках и фотографиях все предельно понятно (поэтому в этот раз мы обойдемся без схемы). Благодаря I2C плате мы можем управлять LCD двумя проводами. А вот какбы выглядела наша схема без этой "волшебной" платы:

А теперь самое время записать скетч в плату ардуино. Скетч выведет на экран «R6LCA RadioScout» а в нижней начнет отчет времени в секундах слева, а справа будет «LCD 1602». Сам скетч:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей
void setup()
{
  lcd.init();                    
  lcd.backlight();// Включаем подсветку дисплея
  lcd.print("R6LCA RadioScout");
  lcd.setCursor(8, 1);
  lcd.print("LCD 1602");
}
void loop()
{
  // Устанавливаем курсор на вторую строку и нулевой символ.
  lcd.setCursor(0, 1);
  // Выводим на экран количество секунд с момента запуска ардуины
  lcd.print(millis()/1000);

}
Как видите все действительно просто. По крайней мере изучив материал блога, у вас точно все должно получиться. Но не будем останавливаться на таком простом примере. Ведь у нас есть датчик температуры и влажности, и даже датчик атмосферного давления. Вы наверно уже догадались над чем нам предстоит еще поработать. Так что до новых встреч! 

пятница, 29 апреля 2016 г.

Тест сервомотора….

Прошло уже четыре месяца как начал осваивать ардуино с нуля (начало изучения как раз приходиться на начало января 2016 года). Как говориться уже успел разобраться со многим: и с программированием, и с датчиками. Вот наконец подошло время и для сервомотора. Модуль у меня самый что ни на есть простейший и самый наверно недорогой - TowerPro SG90. Для начала давайте познакомимся с его техническими данными:


Технические характеристики
- рабочее напряжение: 3,5-6В
- диапазон вращения: 180°
- скорость вращения без нагрузки при 4,8В: 60° за 0,12с
- скорость вращения без нагрузки при 6В: 60° за 0,10с
- максимальный крутящий момент: 1,6 кг·см
- габаритные размеры ДхШхВ: 23х12х29мм
- вес: 9г

Механизм сервопривода выполнен из пластика. В комплекте с сервоприводом идёт комплект крепежа и пластиковых качелек. Для подключения сервопривода не требуется силового драйвера. То есть наш сервомотор можно подключить напрямую к плате ардуино. Но еще нужно разобраться какие провода сервомотора куда подключать.


В моем случае сервомотор имеет три разноцветных провода, которые нужно подключить к источнику питания (+5 В), земле (GND) и к управляющему пину ардуино. Соответственно серый провод подключается к земле, желтый к 9 пину ардуино, оранжевый к +5 В. Схема подключения сервомотора к ардуино несложная, но на всякий случай нарисую ее. Самое главное это не только подключить сервомотор, но так же еще научиться управлять им. Для начала используем переменный резистор, поворачивая его мы будем изменять его сопротивление и при этом сервомотор будет поворачиваться на заданный угол.
Конечно же управлять сервомотором дело сложное. Но за нас уже подумали и написали библиотеку: «Servo.h», искать ее не нужно: так как она уже входит в стандартную библиотеку. Так что смело подключаем ее в скетче. Да и сам скетч привожу ниже:


#include <Servo.h> // подключаем библиотеку сервы
#define POT_MAX_ANGLE 200.0 // макс. Угол поворота ручки потенциометра в градусах
Servo myServo;

void setup() {
myServo.attach(9); // подключаем серву к 9 пину
}

void loop() {
int val = analogRead (A0); // считываем данные с потенциометра
int angle = int (val/1024.0*POT_MAX_ANGLE); // рассчитываем угол поворота серва
angle = constrain(angle,0,180); // ограничиваем угол поворота от 0 до 180
myServo.write(angle); // даем команду серве задать угол поворота
}

 Вот и все! Загружаем скетч в микроконтроллер, и начинаем тестирование. Действительно с помощью поворота ручки переменного резистора мы управляем углом поворота сервомотора в пределах от 0 до 180 градусов. Все получилось удачно и отлично все работает, чего желаю и всем читателям.


суббота, 23 апреля 2016 г.

Телеграфный ключ на базе ардуино...


Привет всем читателям! Продолжаю рассказывать об интересных проектах. Сегодня не просто проект ардуино, а ардуино для радиолюбителей. Возможно в этом посте кто-то найдет для себя что-то полезное. И если это так то будем считать, что все не зря. А теперь начнем, но начнем с небольшой предыстории…
Начал изучать ардуино не просто так. А с целью сделать множество проектов, в том числе и радиолюбительских. Один проект уже завершен (то есть уже есть рабочая конструкция) это уже наверняка знакомый моим читателям «Радиомаяк-1». Так же будем совершенствовать и далее ардуино-маяк, и со временем расскажем о проекте «Радиомаяк-2». Но сегодня проект для любителей телеграфа: мы будем делать телеграфный ключ, причем автоматический. Для тех кто не знает, что это такое вкратце поясню: есть ручной (или вертикальный) где нужно самому отстукивать точки и тире, и есть автоматический. В автоматическом есть рычажок, у которого два положения: в одном положении генерируются точки, в другом тире. Это значительно упрощает работу, да и руки не так устают…

В общем дело нужное и можно начать разрабатывать алгоритм. Но тут решил еще немного поискать в интернете не делал ли кто-то уже нечто подобное? И оказалось, что да делали. Так что решил на этот раз мне изобретать велосипед, а просто взять уже готовый скетч и попробовать как все будет работать. Во основе простой CW ключ от UA1CBM. Сразу скажу скетч от UA1CBM заслуживает самых высоких похвал: эффективный и очень грамотный алгоритм работы. Единственное это нельзя управлять скоростью передачи…

А управлять скоростью как раз не так и сложно. Тем более что в проекте «Радиомаяк-2» это задача решена. Правда там используется другой алгоритм формирования точек и тире, но это не такая уж и проблема. Здесь управлять скоростью оказалось делом простым, так что дополнил скетч буквально несколькими строчками и все готово…
Теперь наступает самое интересное. Нужно собрать прототип схемы, а так же добавить еще переменный резистор. Прототип собираю на макетной плате (или как еще иначе ее называют «бредборд»). И хотя схема несложная, но прототип ее на макетке выглядит сложно. Поэтому обязательно привожу схему (кстати схему чертил в программе rusplan, в которой самостоятельно начертил и плату ардуино). Вот наконец схема собрана, и пора приступать к тестам…

Подключаю ардуино через USB к компьютеру, приступаю к программированию микроконтроллера. Вот скетч компилируется (без ошибок – ура!) и начинается загрузка. Все прошло без проблем. Приступаю к тесту. Пока самого манипулятора у меня нет (нужно будет обязательно сделать), то вместо него я использовал две кнопки. Конечно они работают, но н так хорошо, как манипулятор. Но тем не менее первые тесты прошли: работает в принципе не плохо. Вот только скорость еще велика, немного меняю данные в скетче (опытным путем) и после двух приближений получаю вполне отличный результат. Теперь скорость меняется и все прекрасно работает.

Для тех кто желает повторить проект, скетч приведу ниже. Если скорость покажется вам «не очень» то ее можно подрегулировать изменив данные в скетче. Обратите внимание на сточку cw_delay= map(val, 0, 1024, 60, 130). Теперь смотрите: изменять нужно только два последних числа (в моем примере: 60 и 130). Далее чем числа больше – тем будет меньше скорость. В моем первоначальном скетче было 40 и 140: скорость очень большая в одном из крайних положений переменного резистора, и очень маленькая в другом. Так что подобрал экспериментально 60 и 130. Но там сами смотрите… А теперь обещенный скетч:



/*
Simple CW key by UA1CBM
Speed control CW by RN6LLV
*/

const int dashPin = 3; // тире
const int ditPin = 2; // точки
const int ledPin = 13; // the number of the LED pin
const int pot=0; // потенциометр на порт А0
int val;
int cw_delay;

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

void loop(){
val=analogRead(pot); // чтение данных с потенциометра
cw_delay= map(val, 0, 1024, 60, 130);
//cw_delay= (val/7);

if (digitalRead(dashPin) == HIGH) //Тире
{
// turn LED on:
digitalWrite(ledPin, HIGH);
delay(3*cw_delay);
// turn LED off:
digitalWrite(ledPin, LOW);
delay(cw_delay);
}

if (digitalRead(ditPin) == HIGH) //Тире
{
// turn LED on:
digitalWrite(ledPin, HIGH);
delay(cw_delay);
// turn LED off:
digitalWrite(ledPin, LOW);
delay(cw_delay);
}
}