Jump to content
Sign in to follow this  
AndreyASUNO

Борьба С Влажностью

Recommended Posts

Здрасте всем!

Имеется гараж с подвалом!

Есть желание избавиться от влаги из помещения как гаража так и подвала!

Расклад такой:

1. Arduino nano

2. LCD 16X2

3. I2C модуль для подключения LCD к 4, 5 ножкам Arduino

4. Вентиляторы - 3 шт. 220В. для вытяжек в квартирах.

5. Релейный модуль на 4 релюшки

Текст программки для зашивки в Аrduino

#include <DHT.h>

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

#define I2C_SDA 4 // I2C модуль для подключения LCD

#define I2C_SLC 5 // I2C модуль для подключения LCD

#define DHTPIN_U 2 // DHT-11 с улицы

#define DHTPIN_G 3 // DHT-11 в гараже

#define DHTPIN_P 6 // DHT-11 в подвале

#define VEN_U 7 // нога управления релюшкой вентилятора В1

#define VEN_G 8 // нога управления релюшкой вентилятора В2

#define VEN_P 9 // нога управления релюшкой вентилятора В3

LiquidCrystal_I2C lcd(0x27,16,2);

#define DHTTYPE DHT11

DHT dht_U(DHTPIN_U, DHTTYPE); //Улица

DHT dht_G(DHTPIN_G, DHTTYPE); //Гараж

DHT dht_P(DHTPIN_P, DHTTYPE); //Подвал

void setup (void)

{

lcd.init();

lcd.backlight();

// Serial.begin(9600);

dht_U.begin();

dht_G.begin();

dht_P.begin();

pinMode (VEN_U,OUTPUT); digitalWrite(VEN_U, LOW);

pinMode (VEN_G,OUTPUT); digitalWrite(VEN_G, LOW);

pinMode (VEN_P,OUTPUT); digitalWrite(VEN_P, LOW);

}

void loop ()

{

float h_U = dht_U.readHumidity();

float t_U = dht_U.readTemperature();

if (isnan(t_U) || isnan(h_U))

{

Serial.println("Failed to read from DHT_U");

} else

{

// Serial.print("Hum:"); Serial.print(h_U); Serial.print(" %\t");

// Serial.print("Tem:"); Serial.print(t_U); Serial.println(" *C");

lcd.print("H_U="); lcd.print(h_U);

lcd.print("T_U="); lcd.print(t_U);

}

if (t_U < 0) digitalWrite(VEN_U, LOW);

if (h_U > 90) digitalWrite(VEN_U, LOW);

float h_G = dht_G.readHumidity();

float t_G = dht_G.readTemperature();

if (isnan(t_G) || isnan(h_G))

{

Serial.println("Failed to read from DHT_G");

} else

{

// Serial.print("Hum:"); Serial.print(h_G); Serial.print(" %\t");

// Serial.print("Tem:"); Serial.print(t_G); Serial.println(" *C");

lcd.print("H_G="); lcd.print(h_G);

lcd.print("T_G="); lcd.print(t_G);

}

if (h_G > h_U) digitalWrite(VEN_U, HIGH);

if (h_G > 90) digitalWrite(VEN_G, LOW);

if (t_G < 0) digitalWrite(VEN_G, LOW);

float h_P = dht_P.readHumidity();

float t_P = dht_P.readTemperature();

if (isnan(t_P) || isnan(h_P))

{

Serial.println("Failed to read from DHT_P");

} else

{

// Serial.print("Hum:"); Serial.print(h_P); Serial.print(" %\t");

// Serial.print("Tem:"); Serial.print(t_P); Serial.println(" *C");

lcd.print("H_P="); lcd.print(h_P);

lcd.print("T_P="); lcd.print(t_P);

}

if (h_P > h_G) digitalWrite(VEN_P, HIGH);

if (t_G < 0) digitalWrite(VEN_G, LOW);

}

Пока жду комплектацию по почте, может подскажете что еще можно учесть и добавить!

post-151627-0-17961300-1420374155_thumb.png

Edited by AndreyASUNO

Share this post


Link to post
Share on other sites

Схема железа где? и словами описать алгоритм работы.


Errare humanum est. Коли людЯм позволено, что же о нас то говорить!
 

Share this post


Link to post
Share on other sites

Схема - приблизительно такая!

Алгоритм:

Поочередный опрос трех датчиков влажности размещенных на улиже в гараже и подвале!

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

post-151627-0-24034500-1420377325_thumb.jpg

Edited by AndreyASUNO

Share this post


Link to post
Share on other sites

Вебинар «Каждому ключу — свой драйвер» (13.08.2020)

Компания КОМПЭЛ приглашает вас принять участие в вебинаре, который будет посвящен теме драйверов управления транзисторами компании Infineon. Мы рассмотрим четыре различных технологии изготовления микросхем драйверов, в чём их отличия и особенности.

Подробнее

как вариант попроще = ставь крупную свечку под вытяжку в подвал на час... два,три. а там сам увидишь.

http://www.drive2.ru/b/1240725/

и почитай коментарии...

Edited by Rede RED

Что обещано- УЖЕ НЕ ТВОЕ

Share this post


Link to post
Share on other sites

Меньше не бывает: неизолированные микро-DC/DC нового поколения R4 от Mornsun

Компания Mornsun разработала серию R4 неизолированных импульсных стабилизаторов напряжения в новом миниатюрном конструктивном исполнении. Уменьшение коснулось не только размеров, на 80% меньше существующих преобразователей, но и стоимости.

Подробнее

Датчики влажности, дадут не всюинформацию, нужно еще учитывать градиент температуры.

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


Errare humanum est. Коли людЯм позволено, что же о нас то говорить!
 

Share this post


Link to post
Share on other sites

Сетевой источник питания с расширенным диапазоном входных напряжений на основе VIPER26xK

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

Подробнее

Про градиент температур - не знаю куда примкнуть данные о температуре от датчиков, а с осушителем интересно! Что именно Вы имеете в виду за осушитель ?

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Что именно Вы имеете в виду за осушитель ?

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

Очень эффективно! Установка в 9 кВт, держит 60% влажность в неотапливаемом помещении в 18000 куб метров, в любое время года.

Для гаража, это будет ватт 40, и то работать будет по мере надобности.

А с градиентом, если в гараже холодно, а на улице потеплело, то по притоку пойдет насыщение, вплоть до росы. Хоть, и сухой снаружи воздух.


Errare humanum est. Коли людЯм позволено, что же о нас то говорить!
 

Share this post


Link to post
Share on other sites

На производстве сушат воздух в компрессорной. Блок осушки содержит два "бака":

-один поглощает влагу

-другой в это время нагревается до 140 (уточните в НЕТ) градусов с продувкой воздухом (140 имеет воздух). Автоматика такова - после прогрева силикагеля до 140 нагрев выключается, он считается высушенным. Если воздухом не продувать - это будет неправильно.

-------------------------------

Если силикагель перегреть - будет квака!

Также при вентиляции важно учитывать температуру:

наружную

и внутреннюю

Делать вывод о целесообразности вентиляции *потери тепла!) или же перегрев погреба летом.

По простому:

-при морозе вЫключать вентиляторы,

-летом днём не вентилировать.

Edited by Гор

Share this post


Link to post
Share on other sites

Ну а если под вытяжную трубу в подвале поставить не свечу а керамическую трубку обмотанную нихромом и управление завести на контроллер! Мне кажется это будет более безопасно чем горящая свеча среди стелажей и ящиков!

Share this post


Link to post
Share on other sites

Всё нужно КОНТРОЛЛировать, поэтому кроме влажности обязательно учитывать наружную температуру и эвристически "предвидеть" последствия вентилирования (либо невентилирования) при данных условиях, и делать выбор о необходимости и режиме вентилирования, осушения, подогрева... либо закупоривания труб.

Share this post


Link to post
Share on other sites

Перед тем как вентилировать подвал нужно сделать гидро и тепло изоляцию стен и пола.

Share this post


Link to post
Share on other sites

По мере работ по разработки ПО и и самого железа столкнулся с тем что DHT-11 вовольно сильно врут относительно друг друга! Три датчика находять на полутора сантиметровом расстоянии друг от друга дают показания по температуре : 1ый- 32, 2ой- 24, 3тий- 23 градуса! Подскажите кто игрался с DHT-22, они по точности также врут!

Для калибровки датчиков ввел в схему Dallas 18B20! 747605.jpgПолучилась вот такая железка! (Назовем ее блочёк!) Появились три окошка с показаниями датчиков и статистики за последний час работы с дискретой вывода данных в 4 минуты! Добавил расчет точки росы для гаража и подвала, при котором блокируется работа вентиляторов!

747606.jpg, 747608.jpg, 747609.jpg, появился режим принудительной продувки! 747610.jpgи менюшка сводных данных с показанием температур точек росы!747611.jpgКому интересно могу выложить полную рабочую схему и текст прошивки!

Edited by AndreyASUNO

Share this post


Link to post
Share on other sites

#include <Bounce.h>

#include <math.h>

#include <Wire.h>

#include <DHT.h>

#include <LiquidCrystal_I2C.h>

#include <OneWire.h>

#define DHTPIN_U 2 // DHT-11 с улицы

#define DHTPIN_G 3 // DHT-11 в гараже

#define DHTPIN_P 4 // DHT-11 в подвале

#define DL_18B20 5 // Dallas 18B20

#define VEN_U 6 // Включение - выключение вентилятора с улицы в гараж

#define VEN_G 7 // Включение - выключение вентилятора из гаража в подвал

#define VEN_P 8 // Включение - выключение вентилятора из подвала на улицу

#define OBOGREV 9 // Включение - выключение оборгева

#define BUT_LEFT 11 // Кнопка левая

#define BUT_RIGH 10 // Кнопка правая

#define BUZER 12 // Пищалка

#define DHTTYPE DHT11 // тип датчика влажности для библиотеки <DHT.h>

DHT dht_U(DHTPIN_U, DHTTYPE); //сделали датчик для улицы

DHT dht_G(DHTPIN_G, DHTTYPE); //сделали датчик для гаража

DHT dht_P(DHTPIN_P, DHTTYPE); //сделали датчик для подвала

OneWire ds(DL_18B20); // //сделали датчик для гаража калибровочный

Bounce bouncer_BUT_LEFT = Bounce( BUT_LEFT,1); //Создали левую кнопку

Bounce bouncer_BUT_RIGH = Bounce( BUT_RIGH,1); //Создали правую кнопку

LiquidCrystal_I2C lcd(0x27,16,2); //

int h_U, t_U , h_G ; // переменные для влажности

int t_G, h_P , t_P ; // переменные для температуры

int matrix_h_U[17]; int matrix_t_U[17]; //массивы для улицы

int matrix_h_G[17]; int matrix_t_G[17]; //массивы для гаража

int matrix_h_P[17]; int matrix_t_P[17]; //массивы для подваля

int secundy=-1; int i=1; int tackt=0;

const float a=17.27;

const float b=237.7;

double c_G, c_P, c_U, vl_P, vl_G;

int Tochka_Rosy_G, Tochka_Rosy_P,Tochka_Rosy_U;

//---------------------------------------------------------------------------------------------------------

void produvka(void)//принудительная продувка 600 сек по нажатию правой кнопки!

{

lcd.clear();

int door=600;

while (door!=0)

{

digitalWrite(VEN_U, LOW); digitalWrite(VEN_G, LOW); digitalWrite(VEN_P, LOW); digitalWrite(OBOGREV, LOW);

lcd.setCursor(0,0); lcd.print("PRODUVKA 600 Sec");

lcd.setCursor(0,1); lcd.print("OcTalocb "); lcd.print(door); lcd.print(" Sec");

delay(1000);

door--;

}

digitalWrite(VEN_U, HIGH); digitalWrite(VEN_G, HIGH); digitalWrite(VEN_P, HIGH); digitalWrite(OBOGREV, HIGH);

lcd.clear();

}

//-----------------------------------------------------------------------------------------------------------------------------

void matrix_init (void) //заполяем массивы нулями

{int i_matrix=0;

for (i_matrix=0; i_matrix<60; i_matrix++)

{

matrix_h_U[i_matrix]=0; matrix_t_U[i_matrix]=0;

matrix_h_G[i_matrix]=0; matrix_t_G[i_matrix]=0;

matrix_h_P[i_matrix]=0; matrix_t_P[i_matrix]=0;

}

}

//----------------------------------------------------------------------------------------------------------------------------

void datchiki(void)//принятие решения на вкл или выкл релюшек

{

t_U = dht_U.readTemperature()-14;

h_U = dht_U.readHumidity()-2;

t_G = dht_G.readTemperature()-1;

h_G = dht_G.readHumidity();

t_P = dht_P.readTemperature();

h_P = dht_P.readHumidity();

vl_G = double(h_G)/100;

vl_P = double(h_P)/100;

c_G = ((a*t_G)/(b+t_G))+log(vl_G);

Tochka_Rosy_G=int((b*c_G)/(a-c_G));

c_P = ((a*t_P)/(b+t_P))+log(vl_P);

Tochka_Rosy_P=int((b*c_P)/(a-c_P));

int Tochka_Rosy_G_min=Tochka_Rosy_G-2;

int Tochka_Rosy_G_max=Tochka_Rosy_G+2;

int Tochka_Rosy_P_min=Tochka_Rosy_P-2;

int Tochka_Rosy_P_max=Tochka_Rosy_P+2;

if (t_U<0) {digitalWrite(VEN_U, HIGH);}

else

{

if (t_G>Tochka_Rosy_G_min&&t_G<Tochka_Rosy_G_max) digitalWrite(VEN_U, HIGH); else

{

if (h_U>50) digitalWrite(VEN_U, HIGH); else digitalWrite(VEN_U, LOW);

};

};

if (t_G<0) {digitalWrite(VEN_G, HIGH);}

else

{

if (t_P>Tochka_Rosy_P_min&&t_P<Tochka_Rosy_P_max) digitalWrite(VEN_P, HIGH); else

{

if (h_G>50) digitalWrite(VEN_G, HIGH); else digitalWrite(VEN_G, LOW);

};

};

if (t_P<0) digitalWrite(VEN_P, HIGH);

else

{

if (h_P>50) digitalWrite(VEN_P, LOW); else digitalWrite(VEN_P, HIGH);

};

if (t_P<0) digitalWrite(OBOGREV, LOW);

else

{

if (h_P>60) digitalWrite(OBOGREV, LOW); else digitalWrite(OBOGREV, HIGH);

};

}

//--------------------------------------------------------------------------------------------------------------------------------

void svode (void) // сводная таблица с температурами и влажностями со всех трех DHT

{

//-------------------------

t_U = dht_U.readTemperature()-14;

h_U = dht_U.readHumidity()-2;

lcd.setCursor(0,0); lcd.print("T:="); lcd.print(t_U); lcd.print(" ");

lcd.setCursor(0,1); lcd.print("H:="); lcd.print(h_U); lcd.print(" ");

//-------------------------

t_G = dht_G.readTemperature()-1;

h_G = dht_G.readHumidity();

lcd.setCursor(5,0); lcd.print("="); lcd.print(t_G); lcd.print(" ");

lcd.setCursor(5,1); lcd.print("="); lcd.print(h_G); lcd.print(" ");

//--------------------------

t_P = dht_P.readTemperature();

h_P = dht_P.readHumidity();

lcd.setCursor(8,0); lcd.print("="); lcd.print(t_P); lcd.print("Tg=");lcd.print(Tochka_Rosy_G); lcd.print(" ");

lcd.setCursor(8,1); lcd.print("="); lcd.print(h_P); lcd.print("Tp=");lcd.print(Tochka_Rosy_P); lcd.print(" ");

//--------------------------

delay(5000); lcd.clear(); //рисуется 5 сек и перетирает экран

}

//-------------------------------------------------------------------------------------------------------------------------------------------------

void menu_U (void)//получение влажности и температуры с улици

{

t_U = dht_U.readTemperature()-14;

h_U = dht_U.readHumidity()-2;

lcd.setCursor(0,0); lcd.print("OUTDOR:H="); lcd.print(h_U); lcd.print(" T=");lcd.print(t_U);

int a=0;

for (-1; a<16; a++)

{ lcd.setCursor(a,1);

int s =(matrix_h_U[a]/10);

switch (s)

{case 0: lcd.print("\0") ;break;

case 1: lcd.print("\1") ;break;

case 2: lcd.print("\1") ;break;

case 3: lcd.print("\2") ;break;

case 4: lcd.print("\3") ;break;

case 5: lcd.print("\4") ;break;

case 6: lcd.print("\5") ;break;

case 7: lcd.print("\6") ;break;

case 8: lcd.print("\7") ;break; }

}

}

//-----------------------------------------------------------------------------------------------------------------------------------------------

void menu_G(void)//получение влажности и температуры из гаража

{

t_G = dht_G.readTemperature()-1;

h_G = dht_G.readHumidity();

lcd.setCursor(0,0); lcd.print("GARAGE:H="); lcd.print(h_G); lcd.print(" T=");lcd.print(t_G);

int a=0;

for (-1; a<16; a++)

{ lcd.setCursor(a,1);

int s =int(matrix_h_G[a]/10);

switch (s)

{case 0: lcd.print("\0") ;break;

case 1: lcd.print("\1") ;break;

case 2: lcd.print("\1") ;break;

case 3: lcd.print("\2") ;break;

case 4: lcd.print("\3") ;break;

case 5: lcd.print("\4") ;break;

case 6: lcd.print("\5") ;break;

case 7: lcd.print("\6") ;break;

case 8: lcd.print("\7") ;break; }

}

}

//-------------------------------------------------------------------------------------------------------------------------------------------------

void menu_P (void) //получение влажности и температуры из подвала

{

t_P = dht_P.readTemperature();

h_P = dht_P.readHumidity();

lcd.setCursor(0,0); lcd.print("BASEME:H="); lcd.print(h_P); lcd.print(" T=");lcd.print(t_P);

int a=0;

for (-1; a<16; a++)

{

lcd.setCursor(a,1);

int s =int(matrix_h_P[a]/10);

switch (s){

case 0: lcd.print("\0") ;break;

case 1: lcd.print("\1") ;break;

case 2: lcd.print("\1") ;break;

case 3: lcd.print("\2") ;break;

case 4: lcd.print("\3") ;break;

case 5: lcd.print("\4") ;break;

case 6: lcd.print("\5") ;break;

case 7: lcd.print("\6") ;break;

case 8: lcd.print("\7") ;break; }

}

}

//----------------------------------------------------------------------------------------------------------------------------------------------------

void opros_datchikov (void)

{

//------------------------------------

lcd.setCursor(0,0); lcd.print("T:");

t_U = dht_U.readTemperature()-14;

h_U = dht_U.readHumidity()-2;

if (isnan(t_U) || isnan(h_U)) { lcd.print("Fail"); } else { lcd.print(t_U); lcd.setCursor(0,1); lcd.print("H:"); lcd.print(h_U); } ;

//-----------------------------------

lcd.setCursor(4,0); lcd.print("\4");

t_G = dht_G.readTemperature()-1;

h_G = dht_G.readHumidity();

if (isnan(t_G) || isnan(h_G)) { lcd.print("Fail"); } else { lcd.print(t_G); lcd.setCursor(4,1); lcd.print("\4"); lcd.print(h_G); } ;

//-----------------------------------

lcd.setCursor(7,0); lcd.print("\4");

t_P = dht_P.readTemperature();

h_P = dht_P.readHumidity();

if (isnan(t_P) || isnan(h_P)) { lcd.print("Fail"); } else { lcd.print(t_P); lcd.setCursor(7,1); lcd.print("\4"); lcd.print(h_P); } ;

//------------------------------------

byte i; byte present = 0; byte type_s; byte data[12]; byte addr[8]; float celsius;

if ( !ds.search(addr)) { ds.reset_search(); delay(250); return; }

switch (addr[0]) { case 0x10: type_s = 1; break; case 0x28: type_s = 0; break; case 0x22: type_s = 0; break; return;

} ds.reset(); ds.select(addr); ds.write(0x44, 1); delay(1000);

present = ds.reset(); ds.select(addr); ds.write(0xBE);

for ( i = 0; i < 9; i++) { data = ds.read(); } int16_t raw = (data[1] << 8) | data[0];

if (type_s) { raw = raw << 3; if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60);

if (cfg == 0x00) raw = raw & ~7; else if (cfg == 0x20) raw = raw & ~3; else if (cfg == 0x40) raw = raw & ~1; }

celsius = (float)raw / 16.0;

lcd.setCursor(10,0); lcd.print("\4"); lcd.print(celsius);

lcd.setCursor(10,1); lcd.print("\4"); lcd.print("\6");lcd.print("\4");lcd.print("\2");lcd.print("\5");lcd.print("\7");

//---------------------------------------

}

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

void setup (void)

{

dht_U.begin(); delay(1000);

dht_G.begin(); delay(1000);

dht_P.begin(); delay(1000);

lcd.init();

lcd.backlight(); delay(200);

lcd.noBacklight();

pinMode(VEN_U, OUTPUT); digitalWrite(VEN_U, HIGH);

pinMode(VEN_G, OUTPUT); digitalWrite(VEN_G, HIGH);

pinMode(VEN_P, OUTPUT); digitalWrite(VEN_P, HIGH);

pinMode(OBOGREV, OUTPUT); digitalWrite(OBOGREV, HIGH);

pinMode(BUT_LEFT,INPUT);

pinMode(BUT_RIGH,INPUT);

matrix_init();//заполняем нулями

byte linia_0 [8] = { B00000, B00000, B00000, B00000, B00000, B00000, B00000, B11111,}; lcd.createChar(0, linia_0);

byte linia_15[8] = { B00000, B00000, B00000, B00000, B00000, B00000, B11111, B11111,}; lcd.createChar(1, linia_15);

byte linia_30[8] = { B00000, B00000, B00000, B00000, B00000, B11111, B11111, B11111,}; lcd.createChar(2, linia_30);

byte linia_45[8] = { B00000, B00000, B00000, B00000, B11111, B11111, B11111, B11111,}; lcd.createChar(3, linia_45);

byte linia_60[8] = { B00000, B00000, B00000, B11111, B11111, B11111, B11111, B11111,}; lcd.createChar(4, linia_60);

byte linia_75[8] = { B00000, B00000, B11111, B11111, B11111, B11111, B11111, B11111,}; lcd.createChar(5, linia_75);

byte linia_90[8] = { B00000, B11111, B11111, B11111, B11111, B11111, B11111, B11111,}; lcd.createChar(6, linia_90);

byte linia_100[8] = { B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111,}; lcd.createChar(7, linia_100);

opros_datchikov();

delay(4000);

lcd.clear();

}

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

void loop (void)//вечный цикл в петле

{

datchiki(); //переключаем релюшки в зависимости от показаний датчиков

bouncer_BUT_LEFT.update ( ); int value_BUT_LEFT = bouncer_BUT_LEFT.read();

bouncer_BUT_RIGH.update ( ); int value_BUT_RIGH = bouncer_BUT_RIGH.read();

if ( value_BUT_LEFT == HIGH) { i++; if (i>4) i=1;}

if ( value_BUT_RIGH == HIGH) { produvka();} else {delay(1);}

switch (i)

{

case 1: menu_U() ; break;

case 2: menu_G() ; break;

case 3: menu_P() ; break;

case 4: {svode() ; delay(5000); i=1;} break;

}

tackt++;

//запись в массивы температуры и влажности

if (tackt>=115) // время между циклами записи в массивы порядка 4 минут

{tackt=0; secundy++; if (secundy>15)secundy=0;

matrix_h_U[secundy]=h_U; matrix_t_U[secundy]=t_U;

matrix_h_G[secundy]=h_G; matrix_t_G[secundy]=t_G;

matrix_h_P[secundy]=h_P; matrix_t_P[secundy]=t_P;

tone(12, 2000, 150); } // Попискивание при записи очередных элементов массива */

}

//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Share this post


Link to post
Share on other sites

В гараже беда! Прикрепил к стене, подключил датчики! Влажность в гараже 92 при температуре +2, в подвале 95 при температуре +4С! Вроде все завертелось закрутилось! Спустя минут 10 от первого включения на LCD начали пропадать столбцы отрисовки! Через 2 часа работы потухло процентов 70, невозможно разобрать ни температуру ни влажность! Беда!

Share this post


Link to post
Share on other sites
В 24.02.2015 в 16:24, AndreyASUNO сказал:

#include <Bounce.h>

#include <math.h>

#include <Wire.h>

#include <DHT.h>

#include <LiquidCrystal_I2C.h>

#include <OneWire.h>

#define DHTPIN_U 2 // DHT-11 с улицы

#define DHTPIN_G 3 // DHT-11 в гараже

#define DHTPIN_P 4 // DHT-11 в подвале

#define DL_18B20 5 // Dallas 18B20

#define VEN_U 6 // Включение - выключение вентилятора с улицы в гараж

#define VEN_G 7 // Включение - выключение вентилятора из гаража в подвал

#define VEN_P 8 // Включение - выключение вентилятора из подвала на улицу

#define OBOGREV 9 // Включение - выключение оборгева

#define BUT_LEFT 11 // Кнопка левая

#define BUT_RIGH 10 // Кнопка правая

#define BUZER 12 // Пищалка

#define DHTTYPE DHT11 // тип датчика влажности для библиотеки <DHT.h>

DHT dht_U(DHTPIN_U, DHTTYPE); //сделали датчик для улицы

DHT dht_G(DHTPIN_G, DHTTYPE); //сделали датчик для гаража

DHT dht_P(DHTPIN_P, DHTTYPE); //сделали датчик для подвала

OneWire ds(DL_18B20); // //сделали датчик для гаража калибровочный

Bounce bouncer_BUT_LEFT = Bounce( BUT_LEFT,1); //Создали левую кнопку

Bounce bouncer_BUT_RIGH = Bounce( BUT_RIGH,1); //Создали правую кнопку

LiquidCrystal_I2C lcd(0x27,16,2); //

int h_U, t_U , h_G ; // переменные для влажности

int t_G, h_P , t_P ; // переменные для температуры

int matrix_h_U[17]; int matrix_t_U[17]; //массивы для улицы

int matrix_h_G[17]; int matrix_t_G[17]; //массивы для гаража

int matrix_h_P[17]; int matrix_t_P[17]; //массивы для подваля

int secundy=-1; int i=1; int tackt=0;

const float a=17.27;

const float b=237.7;

double c_G, c_P, c_U, vl_P, vl_G;

int Tochka_Rosy_G, Tochka_Rosy_P,Tochka_Rosy_U;

//---------------------------------------------------------------------------------------------------------

void produvka(void)//принудительная продувка 600 сек по нажатию правой кнопки!

{

lcd.clear();

int door=600;

while (door!=0)

{

digitalWrite(VEN_U, LOW); digitalWrite(VEN_G, LOW); digitalWrite(VEN_P, LOW); digitalWrite(OBOGREV, LOW);

lcd.setCursor(0,0); lcd.print("PRODUVKA 600 Sec");

lcd.setCursor(0,1); lcd.print("OcTalocb "); lcd.print(door); lcd.print(" Sec");

delay(1000);

door--;

}

digitalWrite(VEN_U, HIGH); digitalWrite(VEN_G, HIGH); digitalWrite(VEN_P, HIGH); digitalWrite(OBOGREV, HIGH);

lcd.clear();

}

//-----------------------------------------------------------------------------------------------------------------------------

void matrix_init (void) //заполяем массивы нулями

{int i_matrix=0;

for (i_matrix=0; i_matrix<60; i_matrix++)

{

matrix_h_U[i_matrix]=0; matrix_t_U[i_matrix]=0;

matrix_h_G[i_matrix]=0; matrix_t_G[i_matrix]=0;

matrix_h_P[i_matrix]=0; matrix_t_P[i_matrix]=0;

}

}

//----------------------------------------------------------------------------------------------------------------------------

void datchiki(void)//принятие решения на вкл или выкл релюшек

{

t_U = dht_U.readTemperature()-14;

h_U = dht_U.readHumidity()-2;

t_G = dht_G.readTemperature()-1;

h_G = dht_G.readHumidity();

t_P = dht_P.readTemperature();

h_P = dht_P.readHumidity();

vl_G = double(h_G)/100;

vl_P = double(h_P)/100;

c_G = ((a*t_G)/(b+t_G))+log(vl_G);

Tochka_Rosy_G=int((b*c_G)/(a-c_G));

c_P = ((a*t_P)/(b+t_P))+log(vl_P);

Tochka_Rosy_P=int((b*c_P)/(a-c_P));

int Tochka_Rosy_G_min=Tochka_Rosy_G-2;

int Tochka_Rosy_G_max=Tochka_Rosy_G+2;

int Tochka_Rosy_P_min=Tochka_Rosy_P-2;

int Tochka_Rosy_P_max=Tochka_Rosy_P+2;

if (t_U<0) {digitalWrite(VEN_U, HIGH);}

else

{

if (t_G>Tochka_Rosy_G_min&&t_G<Tochka_Rosy_G_max) digitalWrite(VEN_U, HIGH); else

{

if (h_U>50) digitalWrite(VEN_U, HIGH); else digitalWrite(VEN_U, LOW);

};

};

if (t_G<0) {digitalWrite(VEN_G, HIGH);}

else

{

if (t_P>Tochka_Rosy_P_min&&t_P<Tochka_Rosy_P_max) digitalWrite(VEN_P, HIGH); else

{

if (h_G>50) digitalWrite(VEN_G, HIGH); else digitalWrite(VEN_G, LOW);

};

};

if (t_P<0) digitalWrite(VEN_P, HIGH);

else

{

if (h_P>50) digitalWrite(VEN_P, LOW); else digitalWrite(VEN_P, HIGH);

};

if (t_P<0) digitalWrite(OBOGREV, LOW);

else

{

if (h_P>60) digitalWrite(OBOGREV, LOW); else digitalWrite(OBOGREV, HIGH);

};

}

//--------------------------------------------------------------------------------------------------------------------------------

void svode (void) // сводная таблица с температурами и влажностями со всех трех DHT

{

//-------------------------

t_U = dht_U.readTemperature()-14;

h_U = dht_U.readHumidity()-2;

lcd.setCursor(0,0); lcd.print("T:="); lcd.print(t_U); lcd.print(" ");

lcd.setCursor(0,1); lcd.print("H:="); lcd.print(h_U); lcd.print(" ");

//-------------------------

t_G = dht_G.readTemperature()-1;

h_G = dht_G.readHumidity();

lcd.setCursor(5,0); lcd.print("="); lcd.print(t_G); lcd.print(" ");

lcd.setCursor(5,1); lcd.print("="); lcd.print(h_G); lcd.print(" ");

//--------------------------

t_P = dht_P.readTemperature();

h_P = dht_P.readHumidity();

lcd.setCursor(8,0); lcd.print("="); lcd.print(t_P); lcd.print("Tg=");lcd.print(Tochka_Rosy_G); lcd.print(" ");

lcd.setCursor(8,1); lcd.print("="); lcd.print(h_P); lcd.print("Tp=");lcd.print(Tochka_Rosy_P); lcd.print(" ");

//--------------------------

delay(5000); lcd.clear(); //рисуется 5 сек и перетирает экран

}

//-------------------------------------------------------------------------------------------------------------------------------------------------

void menu_U (void)//получение влажности и температуры с улици

{

t_U = dht_U.readTemperature()-14;

h_U = dht_U.readHumidity()-2;

lcd.setCursor(0,0); lcd.print("OUTDOR:H="); lcd.print(h_U); lcd.print(" T=");lcd.print(t_U);

int a=0;

for (-1; a<16; a++)

{ lcd.setCursor(a,1);

int s =(matrix_h_U[a]/10);

switch (s)

{case 0: lcd.print("\0") ;break;

case 1: lcd.print("\1") ;break;

case 2: lcd.print("\1") ;break;

case 3: lcd.print("\2") ;break;

case 4: lcd.print("\3") ;break;

case 5: lcd.print("\4") ;break;

case 6: lcd.print("\5") ;break;

case 7: lcd.print("\6") ;break;

case 8: lcd.print("\7") ;break; }

}

}

//-----------------------------------------------------------------------------------------------------------------------------------------------

void menu_G(void)//получение влажности и температуры из гаража

{

t_G = dht_G.readTemperature()-1;

h_G = dht_G.readHumidity();

lcd.setCursor(0,0); lcd.print("GARAGE:H="); lcd.print(h_G); lcd.print(" T=");lcd.print(t_G);

int a=0;

for (-1; a<16; a++)

{ lcd.setCursor(a,1);

int s =int(matrix_h_G[a]/10);

switch (s)

{case 0: lcd.print("\0") ;break;

case 1: lcd.print("\1") ;break;

case 2: lcd.print("\1") ;break;

case 3: lcd.print("\2") ;break;

case 4: lcd.print("\3") ;break;

case 5: lcd.print("\4") ;break;

case 6: lcd.print("\5") ;break;

case 7: lcd.print("\6") ;break;

case 8: lcd.print("\7") ;break; }

}

}

//-------------------------------------------------------------------------------------------------------------------------------------------------

void menu_P (void) //получение влажности и температуры из подвала

{

t_P = dht_P.readTemperature();

h_P = dht_P.readHumidity();

lcd.setCursor(0,0); lcd.print("BASEME:H="); lcd.print(h_P); lcd.print(" T=");lcd.print(t_P);

int a=0;

for (-1; a<16; a++)

{

lcd.setCursor(a,1);

int s =int(matrix_h_P[a]/10);

switch (s){

case 0: lcd.print("\0") ;break;

case 1: lcd.print("\1") ;break;

case 2: lcd.print("\1") ;break;

case 3: lcd.print("\2") ;break;

case 4: lcd.print("\3") ;break;

case 5: lcd.print("\4") ;break;

case 6: lcd.print("\5") ;break;

case 7: lcd.print("\6") ;break;

case 8: lcd.print("\7") ;break; }

}

}

//----------------------------------------------------------------------------------------------------------------------------------------------------

void opros_datchikov (void)

{

//------------------------------------

lcd.setCursor(0,0); lcd.print("T:");

t_U = dht_U.readTemperature()-14;

h_U = dht_U.readHumidity()-2;

if (isnan(t_U) || isnan(h_U)) { lcd.print("Fail"); } else { lcd.print(t_U); lcd.setCursor(0,1); lcd.print("H:"); lcd.print(h_U); } ;

//-----------------------------------

lcd.setCursor(4,0); lcd.print("\4");

t_G = dht_G.readTemperature()-1;

h_G = dht_G.readHumidity();

if (isnan(t_G) || isnan(h_G)) { lcd.print("Fail"); } else { lcd.print(t_G); lcd.setCursor(4,1); lcd.print("\4"); lcd.print(h_G); } ;

//-----------------------------------

lcd.setCursor(7,0); lcd.print("\4");

t_P = dht_P.readTemperature();

h_P = dht_P.readHumidity();

if (isnan(t_P) || isnan(h_P)) { lcd.print("Fail"); } else { lcd.print(t_P); lcd.setCursor(7,1); lcd.print("\4"); lcd.print(h_P); } ;

//------------------------------------

byte i; byte present = 0; byte type_s; byte data[12]; byte addr[8]; float celsius;

if ( !ds.search(addr)) { ds.reset_search(); delay(250); return; }

switch (addr[0]) { case 0x10: type_s = 1; break; case 0x28: type_s = 0; break; case 0x22: type_s = 0; break; return;

} ds.reset(); ds.select(addr); ds.write(0x44, 1); delay(1000);

present = ds.reset(); ds.select(addr); ds.write(0xBE);

for ( i = 0; i < 9; i++) { data = ds.read(); } int16_t raw = (data[1] << 8) | data[0];

if (type_s) { raw = raw << 3; if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60);

if (cfg == 0x00) raw = raw & ~7; else if (cfg == 0x20) raw = raw & ~3; else if (cfg == 0x40) raw = raw & ~1; }

celsius = (float)raw / 16.0;

lcd.setCursor(10,0); lcd.print("\4"); lcd.print(celsius);

lcd.setCursor(10,1); lcd.print("\4"); lcd.print("\6");lcd.print("\4");lcd.print("\2");lcd.print("\5");lcd.print("\7");

//---------------------------------------

}

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

void setup (void)

{

dht_U.begin(); delay(1000);

dht_G.begin(); delay(1000);

dht_P.begin(); delay(1000);

lcd.init();

lcd.backlight(); delay(200);

lcd.noBacklight();

pinMode(VEN_U, OUTPUT); digitalWrite(VEN_U, HIGH);

pinMode(VEN_G, OUTPUT); digitalWrite(VEN_G, HIGH);

pinMode(VEN_P, OUTPUT); digitalWrite(VEN_P, HIGH);

pinMode(OBOGREV, OUTPUT); digitalWrite(OBOGREV, HIGH);

pinMode(BUT_LEFT,INPUT);

pinMode(BUT_RIGH,INPUT);

matrix_init();//заполняем нулями

byte linia_0 [8] = { B00000, B00000, B00000, B00000, B00000, B00000, B00000, B11111,}; lcd.createChar(0, linia_0);

byte linia_15[8] = { B00000, B00000, B00000, B00000, B00000, B00000, B11111, B11111,}; lcd.createChar(1, linia_15);

byte linia_30[8] = { B00000, B00000, B00000, B00000, B00000, B11111, B11111, B11111,}; lcd.createChar(2, linia_30);

byte linia_45[8] = { B00000, B00000, B00000, B00000, B11111, B11111, B11111, B11111,}; lcd.createChar(3, linia_45);

byte linia_60[8] = { B00000, B00000, B00000, B11111, B11111, B11111, B11111, B11111,}; lcd.createChar(4, linia_60);

byte linia_75[8] = { B00000, B00000, B11111, B11111, B11111, B11111, B11111, B11111,}; lcd.createChar(5, linia_75);

byte linia_90[8] = { B00000, B11111, B11111, B11111, B11111, B11111, B11111, B11111,}; lcd.createChar(6, linia_90);

byte linia_100[8] = { B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111,}; lcd.createChar(7, linia_100);

opros_datchikov();

delay(4000);

lcd.clear();

}

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

void loop (void)//вечный цикл в петле

{

datchiki(); //переключаем релюшки в зависимости от показаний датчиков

bouncer_BUT_LEFT.update ( ); int value_BUT_LEFT = bouncer_BUT_LEFT.read();

bouncer_BUT_RIGH.update ( ); int value_BUT_RIGH = bouncer_BUT_RIGH.read();

if ( value_BUT_LEFT == HIGH) { i++; if (i>4) i=1;}

if ( value_BUT_RIGH == HIGH) { produvka();} else {delay(1);}

switch (i)

{

case 1: menu_U() ; break;

case 2: menu_G() ; break;

case 3: menu_P() ; break;

case 4: {svode() ; delay(5000); i=1;} break;

}

tackt++;

//запись в массивы температуры и влажности

if (tackt>=115) // время между циклами записи в массивы порядка 4 минут

{tackt=0; secundy++; if (secundy>15)secundy=0;

matrix_h_U[secundy]=h_U; matrix_t_U[secundy]=t_U;

matrix_h_G[secundy]=h_G; matrix_t_G[secundy]=t_G;

matrix_h_P[secundy]=h_P; matrix_t_P[secundy]=t_P;

tone(12, 2000, 150); } // Попискивание при записи очередных элементов массива */

}

//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

хотел применить твой код но вылазит ошибка

 

Arduino: 1.8.3 (Windows 7), Плата:"Arduino Nano, ATmega328"

D:\РґРґРґ\garag\sket4\Garag_v1.1.1\Garag_v1.1.1.ino: In function 'void opros_datchikov()':

Garag_v1.1.1:439: error: incompatible types in assignment of 'uint8_t {aka unsigned char}' to 'byte [12] {aka unsigned char [12]}'

exit status 1
incompatible types in assignment of 'uint8_t {aka unsigned char}' to 'byte [12] {aka unsigned char [12]}'

Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"
 

 

 

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Сообщения

  • Similar Content

    • By sys
      Потребовалась в проекте простая и долгоживущая память для вобщем- то небольшого количества данных, на случай сбоя по питанию. Работа ограничивалась записью текущих изменяющихся значений и восстановлением при включении. При неспешной записи несколько раз в минуту, ресурс ATMEGA328 выбирался за 2 года гарантированной записи её родной EEPROM, происходившей по кольцу, что не очень радовало.
              Отступление небольшое, в нете читал статью где этот чип подвергался повышенным напряжением в 7- 9В и при снижении опять начинал работать, так это правда, случайно проверил. Ещё тестили количество циклов чтения- записи, реально намного превышает количество заявленное производителем, но у меня не тот случай где можно на это надеяться.
      Присутствовал на борту модуль с Алиекспресса с DS3231,  на нём имелась память 24С32. Ввиду чрезвычайного удобства (модуль два в одном, и часы и память, общая шина IIC/TWI) эта микросхема использовалась для вышеуказанных целей очень долгое время. А потом всё устройство обрастало свистелками- перделками многочисленными датчиками  и подвергалось давлению перфекционизма. Времени для записи, по даташиту  10ms, стало слишком много и в обрез оставалось для основной работы программы. Я посмотрел в сторону FRAM.
             Были заказаны на том же Али FM24С64 и 04. Частота работы до 1 Мгц,  выпускаются в вариантах 5 и 3,3В, объёма, учитывая количество циклов записи- чтения 10 в 12-й степени хватало. Перепробовав безуспешно адаптировать несколько библиотек, для обычных 24СХХ, решил написать подпрограммы, напрямую работая со встроенной библиотекой Wire Arduino IDE (https://www.arduino.cc/en/Reference/Wire). Этими скетчами проверял присланные микросхемы.
      Для FM24C04:
      #include <Wire.h>
      byte iich = 0x50;// адрес устройства
      unsigned int address = 0;
      byte datawrite = 0x77;// чем заполнить ячейки памяти
      void setup() {
        Serial.begin(115200);
        Wire.begin();
        Wire.setClock (400000);// скорость шины, от 3,3В через конвертер уровней TXS0108 тоже работают
        for (address = 0; address < 512; address ++ ) {  // цикл для записи в память
          iic_write (address, datawrite);    
        }
        for (address = 0; address < 512; address ++ ) { // цикл для чтения из памяти
          Serial.println ();
          Serial.print (address);
          Serial.print ("--");
         Serial.print (iic_read (address),HEX);
          Serial.print ("--");   
        }
      }
      /////////////////////////////////////////////////////
        void loop() {
        }
      /////////////////////////////////////////////////////
        
      unsigned int iic_read (unsigned int adrd) {
          Wire.beginTransmission(iich);
          Wire.write(adrd);
          Wire.requestFrom(iich, 1);
          return  Wire.read();
          Wire.endTransmission();
        }
       void iic_write ( unsigned int adwr, byte dat) {
          Wire.beginTransmission(iich);
          Wire.write(adwr);
          Wire.write(dat);
          Wire.endTransmission();
        }
       
      Для  FM24С64 меня ждали несколько шикарных, испытанных временем граблей.
      Перерыт инет, перечитан даташит. Внутренний подтягивающий к земле резистор  internally pulled down достаточно велик для уровня наводки, воспринимаемой как логический "0" или "1". Поэтому вывод WP- обязательно к земле наикратчайшим  проводом, тем более если это "сопли" на разъёмах на столе. То- же о выводах А0-А2, висящие в воздухе они давали несколько несуществующих адресов. Почему- то это не касается FM24C04 и я попался на этом чипе.
      Подпрограммы изменились, для чтения:
      unsigned int iic_read (unsigned int adrd) {
        Wire.beginTransmission(iich);
        Wire.write(adrd >> 8);// старший байт
        Wire.write(adrd & 0xFF);//младший байт
        Wire.requestFrom(iich, 1);
        if (Wire.available()) {
          return  Wire.read();
        }
        Wire.endTransmission();
      }

      для записи:
      void iic_write ( unsigned int adwr, byte dat) {
        Wire.beginTransmission(iich);
        Wire.write(adwr >> 8);
        Wire.write(adwr & 0xFF);
        Wire.write(dat);
        Wire.endTransmission();
      }
      Работа 5В версии (FM24C64-G) при питании 3,3В и скорости шины 400000 стабильна, что рекомендовать к работе конечно нельзя.
      По поводу  FM24C64 (подозреваю что и С32 ,  С128,  С256) коротко и ясно написано на https://forum.arduino.cc/index.php?topic=18946.0 пользователь alicemirror объясняет как работает чтение у этих микросхем, а поскольку они прямая замена для, например, АТ24С64, то и для них это справедливо.  Дело в том, что данные из микросхемы "выстреливаются" далее без указания адреса с его автоинкрементом самой микросхемой после подтверждения от ведущего. Эту прыть и надо останавливать при получении байта :-)  и способ адресации отличается от младших, с меньшим объёмом.
         Интересных всем проектов!
    • By jonytvester
      Есть у меня два блока питания один на 35kV второй на 65kV, у обоих присутствует порт аналогового программирования 0-10 v (смотрите  прикрепленный мануал ), я ищу умельца который сможет выполнить описанную ниже задачу. возможно есть уже готовое решение ? 
      Задача состоит из двух частей 
      Железо которое должно подключатся с одной стороны  к блоку питания FUG(мануал во вложении ) выдавая от 0-10V , а с другой стороны к ПК через юсб Программа , в которой будет возможно калибровать выходное напряжение блока питания  в зависимости от подключенного БП, возможность повышать/понижать  напряжение постепенно , таймер на выключение/ включение блока питания  .  Analog_programming.pdf
    • By Gor_Th
      Доброго времени суток.

      Есть ли здесь знатоки, кто мог бы на пальцах объяснить работу минут в часах с видео? а еще лучше подсказать, где можно найти схему и код на подобное. (Имеются часы: плоская дощечка длинною в 30см на которой зажигаются минуты. То есть нужна схема, при которой индикаторы зажигаются поочередно.)
      Я в этом деле полный профан и начал копаться в "ардуинах" с неделю назад. Если я правильно понимаю можно получить данный эффект с помощью часов реального времени (например DS 3231) подключенных к arduino и 60 светодиодов подключенных через сдвиговые резисторы плюс, разумеется, должен быть будильник и кнопки которые этим всем оркестром будут управлять, так?
      Реально ли найти готовые схему подключения и сам код работы подобных часов?
      PS: Если кто даст буду крайне благодарен (мало ли у кого-то завалялось).

      lineclock1.mp4
    • Guest Игорь
      By Guest Игорь
      Доброй ночи, уважаемые.
      Прошу Вашего совета по следующей куче проблем для меня, т.к. не соображаю в электронике, схемах, резисторах и подобному, но дружу с компом и есть желание сделать определенный механизм, но пока нет наставления на путь истинный от специалистов)
      Задача состоит в следующем - хочу мотор стеклоочистителя подключить к Ардуино, но управлять им необходимо с кнопки. Шилд, например, который обрабатывает сигнал нажатия на кнопку (допустим кнопка записи), при ее активации, нажимаю на другую кнопку, которая дает команду движку вращаться по часовой стрелке. Отпускают ее, моторчик останавливается. Другая кнопка, вращение в противоположную сторону. Т.е. записал последовательность и продолжительность вращений,  нажимаю вновь на кнопку запись и мои действия сохраняются. Далее на 4 кнопку жму и моя игра с моторчиком автоматически воспроизводится. Если такое выполнимо с помощью плат и шилдов без доп программирования логики, то буду ОЧЕНЬ  признателен если расскажете как вкратце это осуществить или кинете ссылки к примеру на Али с нужными товарами. Если легковыполнимо, то в будущем наверное уже разберусь,  как обойтись без нажатия на 4 кнопку (воспроизведения записанных действий) и запускать этот процесс, подключив датчик движения или звука.
      Если необходимо описывать логику или создавать типа какого-то протокола, что шилд (?) умел понимать, что я от него хочу, то подскажите среду разработки для неба, что б там по минимуму было наворотов) В принципе с основами c++ для Ардуино скорее всего придется ознакомиться. 
      Заранее спасибо!
    • By Антон Знаенок
      Доброго времени суток, уважаемые!
      Собираю реле на оптопара с симисторным выходом moc3063 и семисторе bt136-600e.
      В оригинальной схеме используется вместо bt136, bt138 но такого семистора под рукой нет.
      (оригинальная схема во вложении)
      Помогите пожалуйста понять, как нужно расчитывать сопротивления от оптопары идущие к семистору.
      С сопротивлениями указанными в схеме bt136 не открывается.

×
×
  • Create New...