#151 Re: Програмування Arduino » сдвиговый регистр и как с ним бороться? » 2016-04-06 14:06:20

Если вопрос в том как изменить отдельные биты, то легко сделать через логические операторы И и ИЛИ.

#153 Re: Програмування Arduino » ПОМОГИТЕ ПОСТАВИТЬ ТОЧКИ НАД И » 2016-03-15 21:15:35

Библиотека здесь https://github.com/winlinvip/SimpleDHT
Можете обновить иде до 1,6,7 - она сама умеет обновлять и инсталить билиотеки

#154 Re: Програмування Arduino » ПОМОГИТЕ ПОСТАВИТЬ ТОЧКИ НАД И » 2016-03-12 19:25:45

Проще всего использовать функцию millis() и по прошествии n-го числа миллисекунд дергать каким-то пином.

#155 Re: Апаратні питання » Вынос датчика температуры на улицу » 2016-03-12 18:46:47

Я сначала тоже думал, что DHT11 галимый датчик, промучился пару дней, потом посмотрел осциллографом, что он отдает - оказалось все в норме. Начал ковырять библиотеку SimpleDHT.h. Теперь работает корректно на любой длине провода. Пробуйте разные библиотеки сначала на коротких проводах.

#156 Re: Програмування Arduino » ПОМОГИТЕ ПОСТАВИТЬ ТОЧКИ НАД И » 2016-03-12 18:21:58

Ну если простой инкубатор, то вам вполне подойдет мой скетч. Делался на быструю руку для пластмассовой коробки объемом 125 л. Все работает - проверенно. Что непонятно спрашивайте.
heater_hi в 2 раза мощнее heater_low, итого получаем 4-х ступенчатую регулировку, в результате максимальное отклонение от заданной температуры у меня не превышало 0,125 С. Увлажнитель - вентилятор дующий на емкость с водой. Автоматического переворота нет, может быть допишу на досуге. Все настройки задаются в скетче.
З.Ы. Насчет watchdogа - я не знаю будет ли ваша плата корректно обрабатывать срабатывание watchdogа, это зависит от используемого проца и бутлоадера. Я не использую бутлоадер - делаю экспорт бинарного файла, затем заливаю программатором через ISP, старт без бутлоадера. Если будете использовать бутлоадер почитайте это, если не боитесь зависания - просто закоментируйте строки касающиеся watchdogа.

#include <avr/wdt.h>
#include <LiquidCrystal.h>
#include <OneWire.h>
#include <SimpleDHT.h>
//если много ошибок датчика DHT:
//SimpleDHT.h -> строка 98 -> delayMicroseconds(10); уменьшить значение до 9 или 8, результат delayMicroseconds(9);~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#define heater_pin_low    0   //пин нагревателя малой мощности
#define heater_pin_hi     1   //пин нагревателя большой мощности
#define DS18B20_Pin       2   //пин термометра
#define DHT11_pin         3   //пин влажности и температуры
#define beeper_pin       10   //пин подключения пищалки
#define humidity_pin     11   //пин подключения увлажнителя

#define opros          5000   //интервал опроса датчиков, 2*5=10 сек

#define set_temperature     37.53 //заданая температура в инкубаторе, C
#define set_humidity          60   //заданая влажность в инкубаторе, %
#define max_humidity        80
#define min_humidity         50
#define max_temperature   38.5
#define min_temterature    36.5
#define max_delta_temp      3  //максимальная разница между показаниями датчиков, C

float DS1820_temp;     //температурв измереная с датчика DS18B20, C
float DS1820_temp_old; //температура предыдущего измерения с датчика DS18B20, C
byte DHT11_temp;   //температура измеренная с датчика DHT11, C
byte DHT11_hum;    //влажность измеренная с датчика DHT11, %
byte DHT11_Error = 0;  //счетчик ошибок датчика DHT11
byte DS1820_Error = 0; //счетчик ошибок датчика DS1820
boolean Sensor_Error = false; //флаг ошибки датчиков
boolean StartFlag = true; //флаг начального запуска, сбрасывается когда контролируемые параметры достигнут нужных значений
byte Heater = 2; //индекс мощности нагревателя, 0-3

//для DS1820
byte addr[8];
byte data[12];

LiquidCrystal lcd(9, 8, 7, 6, 5, 4); //Создаём объект LCD-дисплея, указываем, к каким пинам Arduino подключены выводы дисплея: RS, E, DB4, DB5, DB6, DB7
OneWire ds(DS18B20_Pin);
SimpleDHT11 dht11;

void setup()
{
  wdt_disable();       //выключаем watchdog (на случай перезагрузки по watchdog)
  wdt_enable(WDTO_8S); //включаем на 8 секунд

  pinMode(heater_pin_low, OUTPUT);
  pinMode(heater_pin_hi, OUTPUT);
  pinMode(humidity_pin, OUTPUT);
  digitalWrite(heater_pin_low, LOW);
  digitalWrite(heater_pin_hi, LOW);
  digitalWrite(humidity_pin, LOW);
  if ( !ds.search(addr)) Sensor_Error = true; //датчик не найден
  if (OneWire::crc8(addr, 7) != addr[7]) Sensor_Error = true; //ошибка crc

  lcd.begin(24, 2);
  lcd.print("DS t=");
  lcd.setCursor(11, 0);
  lcd.print(">");
  lcd.print(set_temperature, 2);
  lcd.print("< H=");
  lcd.setCursor(0, 1);
  lcd.print("DHTt=");
  lcd.setCursor(8, 1);
  lcd.print("h=");
  lcd.setCursor(13, 1);
  lcd.print(">");
  lcd.print(set_humidity);
  lcd.print("< Err=");
}

void loop() //------------------------------------------------------------------------------------------
{
  wdt_reset();  //сбрасываем watchdog

  GetSensors(); //получаем значения с датчиков
  Thermostat(); //корректируем мощность нагревателя
  Alarm();      //проверка корректности параметров
  Display();    //отображение данных на дисплее

  delay(opros); //задержка 5 сек
  wdt_reset();  //сбрасываем watchdog
  if (StartFlag) tone(beeper_pin, 4000, 200); //звук раз в 10 сек пока контролируемые параметры не придут в норму
  delay(opros); //задержка 5 сек
  wdt_reset();  //сбрасываем watchdog

}

// Процедура считывания температуры и влажности с датчиков----------------------------------------------
void GetSensors()
{
  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1); //запуск конвертации
  delay(1000);       // maybe 750ms is enough, maybe not
  ds.reset();
  ds.select(addr);
  ds.write(0xBE);    // Read Scratchpad
  for ( byte i = 0; i < 9; i++) data[i] = ds.read();
  DS1820_temp_old = DS1820_temp;  //запоминаем предыдущую температуру
  DS1820_temp = ((data[1] << 8) | data[0]) / 16.0; //температура, С

  if (dht11.read(DHT11_pin, &DHT11_temp, &DHT11_hum, NULL))
  {
    DHT11_Error++;
    if (DHT11_Error > 5) Sensor_Error = true;
  }
  else DHT11_Error = 0;
}

//Процедура регулирования температуры и влажности-------------------------------------------------------
void Thermostat()
{
  //прогноз нужен потому что система обладает инерцией
  DS1820_temp_old = DS1820_temp + DS1820_temp - DS1820_temp_old; //вычисляем прогноз температуры для следующего измерения
  if (DS1820_temp_old > set_temperature)
  {
    if (Heater > 0)  Heater--;//если прогноз больше установленной температуры - уменьшаем мощность нагревателя
  }
  else
  {
    if (Heater < 3)  Heater++;
  }

  DS1820_temp_old = DS1820_temp - set_temperature;
  if (DS1820_temp_old > 0.14) Heater = 0; //1 шаг измерения = 0,0625: (2 шага=0,125 < 0,14 < 3 шага=0,1875), если температура больше заданной на 2 шага - выключаем нагреватель
  if (DS1820_temp_old < -0.14) Heater = 3; //1 шаг измерения = 0,0625: (2 шага=0,125 < 0,14 < 3 шага=0,1875), если температура меньше заданной на 2 шага - включаем нагреватель

  switch (Heater) {
    case 0:
      digitalWrite(heater_pin_low, LOW);
      digitalWrite(heater_pin_hi, LOW);
      break;
    case 1:
      digitalWrite(heater_pin_low, HIGH);
      digitalWrite(heater_pin_hi, LOW);
      break;
    case 2:
      digitalWrite(heater_pin_low, LOW);
      digitalWrite(heater_pin_hi, HIGH);
      break;
    case 3:
      digitalWrite(heater_pin_low, HIGH);
      digitalWrite(heater_pin_hi, HIGH);
      break;
  }

  if (DHT11_hum > set_humidity) digitalWrite(humidity_pin, LOW);
  else digitalWrite(humidity_pin, HIGH);
}

//управляем авариями------------------------------------------------------------------------------------
void Alarm()
{
  boolean alarm_flag = false; //флаг выхода контролируемых параметров за допустимые пределы
  word delta;

  noTone(beeper_pin); //выключаем сигнал об аварии
  delta = abs(DS1820_temp - DHT11_temp); //вычисляем разницу показаний температуры с датчиков
  if ( delta > max_delta_temp ) Sensor_Error = true; //проверяем разницу между показаниями температуры с датчиков
  if (DHT11_hum > max_humidity) alarm_flag = true;        //проверяем выход контролируемых параметров за допустимые пределы
  if (DHT11_hum < min_humidity) alarm_flag = true;
  if (DS1820_temp > max_temperature) alarm_flag = true;
  if (DS1820_temp < min_temterature) alarm_flag = true;
  if (alarm_flag && StartFlag)
  {
    alarm_flag = false; //если был старт и параметры еще не вошли в норму сбрасываем флаг выхода контролируемых параметров за допустимые пределы
    Sensor_Error = false;
  }
  else StartFlag = false;                         // иначе сбрасываем флаг старта
  if (alarm_flag || Sensor_Error) tone(beeper_pin, 4000);
}

//Процедура вывода информации на дисплей----------------------------------------------------------------
void Display()
{
  lcd.setCursor(5, 0);
  lcd.print(DS1820_temp, 2);
  lcd.setCursor(21, 0);
  lcd.print(Heater);
  lcd.setCursor(5, 1);
  lcd.print(DHT11_temp);
  lcd.setCursor(10, 1);
  lcd.print(DHT11_hum);
  lcd.setCursor(22, 1);
  lcd.print(DHT11_Error);
}

#157 Re: Апаратні питання » Вынос датчика температуры на улицу » 2016-03-12 12:51:41

Насколько я знаю не получится скорость уменьшить - у DTH11 свой протокол. Я для удлинения проводов немного изменял значения задержек к библиотеке.

#158 Re: Апаратні питання » Вынос датчика температуры на улицу » 2016-03-12 11:59:12

Eadercach пише:

в длине проводов(датчик не корректно работает)

А на коротких проводках корректно?
Библиотеку какую используете?

#159 Re: Апаратні питання » Вынос датчика температуры на улицу » 2016-03-12 11:09:56

А в чем собственно вопрос - в длине проводов или в сверлении дырки в стене?

#160 Re: Програмування Arduino » Вопрос по использованию библиотеки <Bounce.h> » 2016-03-03 23:15:55

Zen пише:

пытаюсь бороться с дребезгом контактов....

Лучше 0,1 мкф впаралель кнопкам.

#162 Re: Програмування Arduino » ПОМОГИТЕ ПОСТАВИТЬ ТОЧКИ НАД И » 2016-02-28 17:29:28

Себе делаю инкубатор, но я делаю по другому принципу - из меню будет выбираться вид птицы, все остальное инкубатор будет делать сам.
Чтоб вместо SHT10 поставить DTH11 надо менять библиотеку - у них протоколы разные.
Глянул скетч - измерения встречаются в нескольких функциях. Попросите автора, а то могут быть подводные камни.

#164 Re: Проекти » Камера с отправкой фоток на почту или сервер » 2016-02-25 23:46:20

Опытный образец как правило очень сильно отличается от серийного производства. Его часто делают в сжатые сроки, поэтому как правило собирают на готовых модулях, используется много тяжелых библиотек, старшие модели в линейке процов и т.д. Далее идет уточнение техзадания, проверка работы, подгонка параметров, тестирование, вылавливание глюков.
При переходе на серийное производство идет замена готовых модулей микросхемами, оптимизация кода и схемы, переход не более дешевые комплектующие.
Собрать опытный образец просто, а вот доводка до серийного производства требует немало усилий. Мой внутренний опыт подсказывает мне, что ваш проект уже реализован теми же китайцами. Изобретать велосипед вряд ли стоит, тем более что суммарные затраты на весь процесс от опытного образца до серийного устройства у нас будут намного больше чем у китайцев. Как я писал - я почти уверен, что у китайцев уже есть готовое решение для вас. Вам надо только выйти на них и четко сформулировать задачу.

#165 Re: Програмування Arduino » Серво Sg-90 » 2016-02-25 23:20:55

NoName пише:

как по мне сдал ),  чур я за доброго!

А мне тогда кем быть?

VS, по п.3:

if (УСЛОВИЕ) КОМАНДА1
else КОМАНДА2

Если УСЛОВИЕ истинно (не 0) выполняется КОМАНДА1 иначе выполняется КОМАНДА2

Теперь ближе к теме - входы подтянуты на + питания, следовательно на них всегда лог. 1

Задание: разобраться с оператором !

#166 Re: Проекти » Камера с отправкой фоток на почту или сервер » 2016-02-24 22:52:18

Питание откуда берем? Автономность нужна? Вандалоустойчивость?

#167 Re: Програмування Arduino » Сделайте мне программу! » 2016-02-24 22:47:38

NoName пише:

...пока итог один - все разработчики - странные люди...

Чё-то бегают, делают, думают, пялятся в неподвижное изображение на мониторе часами, а в это время в голове разработчика идет сложный мыслительный процесс... Ему поставили одну задачу, а он решая ее столкнулся с другой, которая напрямую не относится к поставленной задаче, но не решив ее, невозможно корректно выполнить начальную задачу. И попробуй объясни заказчику и срыв сроков и почему на решение задачи отрисовки тени от предмета вдруг понадобились размеры вспышек на Солнце.
Если разработчик не изучает новое - он быстро умирает как профессионал. Возьмем несколько веков назад - родится человек, были лошади да телеги, повзрослел, постарел, умер. Как были лошади с телегами так и все осталось без изменений. Технический прогресс шел очень медленно по сравнению с продолжительностью жизни человека. А сейчас совершенно другое время. Когда я родился, в СССР еще даже видеомагнитофонов не делали. А про такие вещи как мобилки и планшеты вообще даже речи не было. За мою жизнь сменилось несколько поколений носителей информации: магнитная лента, CD/DVD, флешпамять. А про технологии и поколения техники я вообще молчу. И все это надо успевать осваивать, иначе ты отстанешь, и шанса догнать может не быть. Времени это отнимает много, объяснить заказчику зачем мне вспышки на солнце невозможно.
Только мало кто это понимает.

#168 Re: Програмування Arduino » Серво Sg-90 » 2016-02-24 18:04:52

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

#include "Servo.h"
Servo servoMain; // Объект Servo

void setup()
{
  servoMain.attach(12); // Servo присоединен к 12 выводу
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
}
void loop()
{
  if (!digitalRead(5)) // Условие 1-й кнопки
  {
    servoMain.write(-45);  // Повернуть серво влево на 45 градусов
  }
  if (!digitalRead(6)) // Условие 2-й кнопки
  {
    servoMain.write(0);  // Повернуть серво влево на 45 градусов
  }
  if (!digitalRead(7)) // Условие 3-й кнопки
  {
    servoMain.write(45);  // Повернуть серво влево на 45 градусов
  }
}

#169 Re: Програмування Arduino » Серво Sg-90 » 2016-02-24 17:10:06

При текущем скетче надо не кнопки через 10кОм посадить на землю, а на выводы 5, 6 и 7 и землю вцепить эти 10кОм. А кнопки вцепить на +5В.

#170 Re: Програмування Arduino » Работа с портами » 2016-02-22 16:13:22

Возьми исходник digitalWrite, сделай скетч на его основе. Если мигает - начинай пошагово упрощать/приводить к своему варианту и найдеш где собака зарыта.

#171 Re: Програмування Arduino » Работа с портами » 2016-02-22 15:10:53

Предполагаю, что микросхемы ATmega на уно и нано разные. Мне попадались atmega168pa в tqfp корпусе, у которых 2 первых порта (TX, RX) настроенные на вход с включенной PULLUP внутренней подтяжкой имели на выводах 1-2 вольта. Все остальные порты нормально подтягивались к логической единице. Чтоб их подтянуть на лог. 1 пришлось ставить резисторы 2.7 кОм, при 3 кОм был лог. 0. Вот такие микросхемы бывают.

#172 Re: Апаратні питання » "нормально замкнутый" оптосимистор, нужны идеи... » 2016-02-20 15:15:15

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

#174 Апаратні питання » Вопрос по лок битам (Fuse) Atmega168 » 2016-02-09 12:48:06

alex_dol
відповідей: 2

В Atmega168 есть 6 лок бит: BLB12, BLB11, BLB02, BLB01, LB2, LB1.

LB2 и LB1 отвечают за общую защиту flash и EEPROM. Их установка запрещает запись или запись и чтение любыми способами, включая программатор.
BLB02 и BLB01 отвечают за защиту области программы. Их установка запрещает запись или чтение или запись и чтение SPM и LPM инструкциями.
BLB12 и BLB11 отвечают за защиту области бутлоадера. Их установка запрещает запись или чтение или запись и чтение SPM и LPM инструкциями.

Если я правильно понял при установленной защите битами BLB12, BLB11, BLB02 и BLB01 программу можно читать с помощью программатора.
Растолкуйте мне прав ли я.

Підвал форуму