Ну наконец то сбылось! Спасибо огромное автору за его проделанное!
Единственное можно как то систематизировать достигнутое (для не очень продвинутых) в смысле какой то архив с пояснениями что куда.
И вопрос по ЖК индикатору, а dem128064a подойдёт?
Вид для печати
Ну наконец то сбылось! Спасибо огромное автору за его проделанное!
Единственное можно как то систематизировать достигнутое (для не очень продвинутых) в смысле какой то архив с пояснениями что куда.
И вопрос по ЖК индикатору, а dem128064a подойдёт?
Респект автору.
Систематизировать пока особенно нечего.
Устройство лишено каких-либо настроек, все правится в скетче.
В строке:
Зона датчика подбирается вручную, в зависимости от адреса датчика.PHP код:
float temp0, temp1, temp2, temp3, temp_s=25;//t0 - двигатель, t1 - воздуховод, t2 - улица, t3 - салон, temp_s - заданая
И все обращения к этим переменным тоже тогда необходимо исправить.
В строках:
Значения подбираются тоже вручную.PHP код:
int min_2 = 185;
int max_2 = 450;
int centr_1 = 310;
int min_1 = 310;
int max_1 = 490;
int centr_2 = 370;
Пока не определился как лучше реализовать настройку. Не очень много памяти остается у 168 меги...
dem128064a просто так не подойдет - там контроллер S6B0107. Я использовал библиотеки ks0108 и немного их переписал для инверсии данных (для удобства монтажа 74hc595).
На всякий случай выкладываю печатные платы в формате SL4. Имхо, не самые удачные, но погнался за габаритами и корпусом BOX-M31. Поскольку плату индикатора я изначально делал для другого устройства, где он питался от отдельного 7805, ничего менять не стал. Вреда никакого, по-моему, от этого нет.
Железяка почти готова, а с программами непонятки какие то.
Сам с програмированием ну ни как.
Неужели ни кому не интересно?
Что именно непонятно?Цитата:
Сообщение от fox-explorer
Постарался в меру возможности обобщить то, что получилось. Поскольку мое образование очень далеко от электроники и вообще техники, написал комментарий для таких же НЕспециалистов, за неточности прошу не пинать, а, если таковые имеются, разъяснить:)
файл
всегда мечтал о таком проекте. Автору спасибо ;)
Ни где не могу найти джостик sony rm-x4s, говорят древний очень.
А можно номиналы сопротивлений по кнопкам.
http://www.wheelremote.ru/auto/sony_...me_sony_tn.gif
Точно повторять нет необходимости. Всегда можно скетч исправить под другие значения.
Сейчас в разработке новый вариант. 3 привода, доп. выход (в моем варианте на дополнительную помпу).
В архиве плата в SL5 и схема. В железе еще не собирал.
Всем доброго дня, заинтересовала тема с климат контролем ,хочу что то подобное соорудить на машине, щас стоит в машине
компьютер с установленной Centrafuse ,монитор тачскиновый на 7 дюймов
1) мотор печки 4 режима (ползунковый переключатель)
2)заслонка воздуха снаружи-салон (два положения)
3)заслонка направления обдува по салону(4 положения)
4)заслонка горячий-холодный воздух (тут можно поставить как угодно)
Купил Arduino Mega с платой релюшек управления ,заслонки будут двигать сервоприводы.Ну и датчики температуры на DS-18B20 3 шт
Теоретически всё понимаю что надо ,но на практике ничего такого не делал. Понимаю что надо програмку на ардуино залить ,(которую ещё надо написать)и самое главное в идеале прикрутить это всё к Centrafuse.на компе нет Com порта,только USB. кнопки управления должны быть на мониторе .Поможите:)
raskor,
Реле весело щелкать будут))
Для начала стоит попробовать просто подвигать заслонки сервами, т.к. мне, например, не очень понятно, как и где фиксируются положения.
а можно модель сервы уточнить?
как это непосредственно с ардуины? не очень представляю. драйвер нужен в том или ином виде.
— земля (коричневый/черный),
— питание +5 вольт (красный),
— сигнальный (оранжевый/желтый/белый).
Управляющий сигнал можно подавать напрямую с ноги МК, а вот силовое питание (особенно если задействовано более одной-двух серв) нужно подавать от внешнего источника питания (т.е. не от +5В Arduino). В этом случае – нужно не забыть соединить землю Arduino с минусом внешнего источника питания.
Хорошо бы еще добавить, работу с кондиционером.
В новом варианте предусмотрел выход на дополнительные устройства, можно использовать для управления кондиционером. Но тестировать эту часть мне не на чем.
Пока нет времени заниматься плотно устройством. Мне не очень понравилось подключение индикатора через сдвиговый регистр, иногда есть ошибки отображения. Хотя может быть причина и не в этом.
Всем привет, мне ещё не понятно как привязать всё к Cenrafuse.Автор скидывал плагин ,но как то не очень разобрался ,нельзя ли здесь немного поподробнее прокоментировать всю эту процедуру . У меня пока всё на столе лежит, на улице зима и под торпеду лезть не хочется,да и всё сначало хотелось бы протестить не на машине.:)
Если речь о том, что выкладывал я, то программа встаривается в центрифугу как внешнее приложение, т.е. это не плагин. Для настройки необходимо в файле setup.ini вписать номер и скорость порта, в соответстии с тем куда подключено, и как настроено ардуино. После этого при нажатии кнопок будет отправляться посылка из 2 байт вида:Цитата:
как привязать всё к Cenrafuse.Автор скидывал плагин
bytes[0] = 0x64; //префикс. определяет какую величину отправляем.
например: 0х64-температура заданная, 0х78 - скорость вентилятора.
Значения подбирались произвольно, но чтобы байт данных не мог совпасть с байтом префикса. На всякий случай.
bytes[1] = vent; //данные. само значение температуры, направления потока, скорости вентилятора.
Прием данных работает аналогично.
Программа ждет посылки вида:
bytes[0] = 0x64; //префикс
bytes[1] = temp3; //температура в салоне
bytes[2] = m; //знаки. 00 если обе положительные, 11-обе отрицательные. первая единица "минус" в салоне, вторая на улице
bytes[3] = temp2; //температура на улице
P.S. Способ отправки знака, конечно, усложенен. Исправил на такой вариант: отправляться будет 127-temp. байт м не нужен. в понедельник выложу
Выложил.
Ждет 4 байта.
bytes[0] = 0x64; //префикс
bytes[1] = температура в салоне + 127;
bytes[2] = температура на улице + 127;
bytes[3] = 0;
Всем привет,на плагине для центрефуги есть кнопки с уже предрасположенными значениями, а можно сделать в виде ползунков как к примеру на эквалайзере , под мои сервоприводы надо скетч править , как только не знаю ))) он и щас почему то не заливается пишет ошибку на вот этой строчке
tempSensor.begin(12); //Вешаем Датчик на 12 порт
сам почти не разбираюсь,что посоветуете? какие строчки надо править?
у меня будет три датчика температуры,три сервопривода,и вот с положениями привода мотора печки как быть,что бы скорость постепенно регулировать.
Вообще по задумке хотел добавить функции
1) Подсветка приборной панели RGB Led
2) Подсветка салона авто тоже RGB Led, но можно и в один объеденить
3)Уровень топлива в баке,с остатком хода по километражу
4) Голосовое приветствие , и голосовым сопровождением нажимаемым кнопкам
5) пристегнуть ремень безопасности, тоже с голосом
это так пока только в мечтах , что скажите ? :)
Можно написать один скетч ,наподобие программы ,с информацией для выводов, что этот Пин идёт туда то ,а этот туда то, и что чего будет делать,было бы супер , таких желающих как я тысячи наверное ))
какая библиотека используется для датчика температуры?Цитата:
пишет ошибку на вот этой строчке
tempSensor.begin(12); //Вешаем Датчик на 12 порт
имеющаяся программа скорость мотора как раз плавно регулирует. кнопками. надо сделать ползунки на каждый привод? крайние значения как устанавливать? ход заслонки и ход привода скорее всего не равны.Цитата:
у меня будет три датчика температуры,три сервопривода,и вот с положениями привода мотора печки как быть,что бы скорость постепенно регулировать.
имхо, надо максимально конкретизировать задачу. я же не программист))Цитата:
Можно написать один скетч ,наподобие программы ,с информацией для выводов, что этот Пин идёт туда то ,а этот туда то, и что чего будет делать,было бы супер , таких желающих как я тысячи наверное ))
Библиотека на DS18B20 и DS18S20 .Наверное надо добавить вашу библиотеку EEPROM
ход заслонки это я думаю не очень сложно узнать ,когда уже сервопривод будет смонтирован.
Пока на данный момент мысли
1)Двигатель отопителя ,(можно просто сделать 4 кнопки) будет работать через релюшки
2)Сервопривод заслонки направления потока воздуха ( здесь лучше ползунок)
3)Сервопривод заслонки горячего и холодного воздуха (два положения,кнопка)
3)Сервопривод заслонки забора воздуха улица-салон (два положения,кнопка)
4)Подсветка RGB панелb приборов и салона ( три кнопки )
5)Уровень топлива(снимать показания с прибора на панели приборов ,аналоговый)
6)температура за бортом, в салоне, и двигателя
остальное можно добавлять по мере возможностей и фантазии.
ещё не очень понял какие контакты на Ардуине за что отвечают ,и что на каких сидит
raskor, сейчас какой-нибудь скетч залит для управления сервами?
Вечер добрый. Вопрос может прост может нет незнай Собрал я на ардуинке меге управление отопителем все классно все работает но вот беда стал переделывать управление заслонкой тепло-холод и уперся. Ну ни в какую ниче не получается програмист я не то что плохой скорей никакой.Обратиться решил к вам так как девайс оч иочень нужен.Очень хотелось бы знать как правильно переписать скетч под третий мотор
#define m1_l 39 //первый влево
#define m1_r 40 //первый вправо
#define m2_l 41 //второй влево (боковые)
#define m2_r 42 //второй вправо(стекло)
#define m3_l 44 //третий влево(заслонка горячий-холодный)
#define m3_r 43 //третий вправо(заслонка горячий-холодный)
#define JOY 1 //АЦП джойстик
#define val2 5 //АЦП второго мотора
#define val1 6 //АЦП первого мотора
#define val3 7 //АЦП третьего мотора
#define vent 31 //ШИМ вентилятора
int res_dt1;//джойстик
int min_3 = 190; //(заслонка горячий-холодный)
int max_3 = 900; //(заслонка горячий-холодный)
int min_2 = 185; //боковые
int max_2 = 450; //стекло
int centr_1 = 310; //среднее первый
int min_1 = 310; //ноги
int max_1 = 490; //ноги закрыто
int centr_2 = 370; //среднее второй
int vent_s=0;
int vent_speed=0;
int t=5, f=0;
int flow=5;
unsigned long time;
void setup(void)
{
pinMode(m1_l,OUTPUT);
pinMode(m1_r,OUTPUT);
pinMode(m2_l,OUTPUT);
pinMode(m2_r,OUTPUT);
pinMode(m3_l,OUTPUT);
pinMode(m3_r,OUTPUT);
pinMode(vent,OUTPUT);
digitalWrite(m1_l,LOW);
digitalWrite(m1_r,LOW);
digitalWrite(m2_l,LOW);
digitalWrite(m2_r,LOW);
digitalWrite(m3_l,LOW);
digitalWrite(m3_r,LOW);
digitalWrite(vent,LOW );
sensors.begin();
Serial.begin(115200);
TCCR2B = TCCR2B & 0b11111000 | 0x04;
/*
if(analogRead(val1) > max_1-10 && analogRead(val2) < min_2+10) flow=2;
if(analogRead(val1) > max_1-10 && analogRead(val2) > max_2-10) flow=0;
if(analogRead(val1) > min_1-10 && analogRead(val1) < min_1+10) flow=1;
???????????
*/
void motors()
{
if(flow==0)//стекло
{
if (analogRead(val2)<max_2)digitalWrite(m2_r,HIGH);
else digitalWrite(m2_r,LOW);
if (analogRead(val1)<max_1)digitalWrite(m1_l,HIGH);
else digitalWrite(m1_l,LOW);
}
if(flow==1)//в ноги
{
if (analogRead(val1)>min_1)digitalWrite(m1_r,HIGH);
else digitalWrite(m1_r,LOW);
}
if(flow==2)//боковые
{
if (analogRead(val2)>min_2)digitalWrite(m2_l,HIGH);
else digitalWrite(m2_l,LOW);
if (analogRead(val1)<max_1)digitalWrite(m1_l,HIGH);
else digitalWrite(m1_l,LOW);
}
if(flow==3)//стекло и ноги
{
if (analogRead(val2)<max_2)digitalWrite(m2_r,HIGH);
else digitalWrite(m2_r,LOW);
if (analogRead(val1)>min_1)digitalWrite(m1_r,HIGH);
else digitalWrite(m1_r,LOW);
}
if(temp_s+1)//регулировка температуры
{ ??????????????
}
if(temp_s-1)//регулировка температуры
{ ???????????????
}
void buttons()
{
if(res_dt1>=715 && res_dt1<=725)//temp_s++. кнопка VOL UP
{
if(temp_s<40)
{
if (analogRead(val3)) ????????????
temp_s=temp_s+1;
delay(30);
}
bytes[0] = 0x5A; //префикс
bytes[1] = temp_s;
bytes[2] = 0;
bytes[3] = 0;
Serial.write( bytes,4);
delay(150);
}
if(res_dt1>=635 && res_dt1<=645)//temp_s--. кнопка VOL DOWN
{
if(temp_s>10)
{
temp_s=temp_s-1;
if (analogRead(val3))?????????????
delay(30);
}
bytes[0] = 0x5A; //префикс
bytes[1] = temp_s;
bytes[2] = 0;
bytes[3] = 0;
Serial.write( bytes,4);
delay(150);
}
я знаков вопросительных наставил где мне кажется чето надо делать
Заранее спасибо
basurman971,
Функция buttons не меняется - там просто задается требуемое значение температуры.
Управление приводом можно сделать из функции motors или из функции termometer.
В самом простом варианте для теста:
Ну и соответственно при temp>temp_s в другую сторону.PHP код:
if(temp<temp_s)
{
if (analogRead(val3)<max_3)digitalWrite(m3_r,HIGH);
else digitalWrite(m3_r,LOW);
}
Тогда заслонку будет гонять от края до края при каждом переходе через заданную температуру. Для клапана печки это нормально, для заслонки не очень.
Необходимо либо линейно, либо по какой-то зависимости привязать положение заслонки к температуре.
Для настройки можно ввести digitalWrite(m3_l,HIGH) и digitalWrite(m3_r,HIGH) на кнопки и двигать заслонку для поиска правильного положения.
Спасибо вечером попробую
manu_245,
Ага крутиться начал,уже хорошо но сдается мне что датчик положения он не видит и тупо крутит то вправо то влево причем на кнопки не реагирует
manu_245,
а вэтих штуках случайно не задаются параметры аналогового входаPHP код:
/*
if(analogRead(val1) > max_1-10 && analogRead(val2) < min_2+10) flow=2;
if(analogRead(val1) > max_1-10 && analogRead(val2) > max_2-10) flow=0;
if(analogRead(val1) > min_1-10 && analogRead(val1) < min_1+10) flow=1;
*/
Эта часть вообще закомментирована, не используется.
Для проверки кнопками можно так сделать:
другие обращения к m3_l и m3_r при этом необходимо отключить.PHP код:
if(res_dt1>=556 && res_dt1<=566)//vent_s ++. кнопка TRACK UP или другая кнопка (соответственно переназначить надо)
{
digitalWrite(m3_r,HIGH);
}
else digitalWrite(m3_r,LOW);
if(res_dt1>=475 && res_dt1<=485)//vent_s --. кнопка TRACK DOWN
{
digitalWrite(m3_l,HIGH);
}
else digitalWrite(m3_l,LOW);
Должен крутить влево в право только при нажатии кнопок.
Для проверки и настройки можно в loop добавить:
Serial.println(val3);
и в терминале посмотреть как меняются значения. при этом остальные обращения к порту для удобства лучше отключить.
Соответственно можно будет увидеть увеличивается или уменьшается значение АЦП при движении m3_r и тогда возможно поправить код из предыдущего поста.
manu_245
Спасибо за внимание может хоть к старости чонить понимать буду в энтих языках и каракулях.Но помоему я мозг не токо себе полосчу.
Надоело мне извращаться и решил драйвер ипонский проверить ,а он редиска возьми и дух испусти. Счас прилужу 293 и уж помучаю его.
manu_245
Какашка какая не работает.
Я в шоке.
Эти кривые буковки меня с ума сводят.
Вот че получилось все равно не работает либо поворачивает мотор и до перезагрузки.PHP код:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <EEPROM.h>
#include <ks0108.h>
#include "ks0108_Mega.h" // include this for the Arduino Mega other ATmega1280 boards
#include "SystemFont5x7.h"//шрифт 5х7
#include "legs1.h"//значек(воздух вниз)
#include "both1.h"//значек(воздух вверх-вниз)
#include "screen1.h"//значек(воздух вверх)
#include "side1.h"//значек (воздух вперед)
#include "DS1.h"//шрифт крупный(температура)
int address = 0;
#define ONE_WIRE_BUS 50 //датчики на 50 ноге
#define TEMPERATURE_PRECISION 9
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
uint8_t Thermometer0[8], Thermometer1[8], Thermometer2[8], Thermometer3[8];//адреса датчиков
float temp0, temp1, temp2, temp3, temp_s=25;//t0 - двигатель, t1 - воздуховод, t2 - улица, t3 - салон, temp_s - заданая
byte bytes[8];
int err0, err1, err2, err3;
int error=0;
int vent_set=0;
#define m3_l 43 //третий влево(заслонка горячий-холодный)
#define m3_r 44 //третий вправо(заслонка горячий-холодный)
#define en 38 //enable
#define JOY 1 //АЦП джойстик
int res_dt1;//джойстик
void setup(void)
{
pinMode(m3_l,OUTPUT);
pinMode(m3_r,OUTPUT);
pinMode(en,OUTPUT);
digitalWrite(m3_l,LOW);
digitalWrite(m3_r,LOW);
digitalWrite(en,HIGH);
sensors.begin();
Serial.begin(115200);
}
void loop(void)
{
res_dt1 = analogRead(JOY); // прочитать данные АЦП
/*
bytes[0] = analogRead(val1) & 255;
bytes[1] = (analogRead(val1) & 768) >> 8;
bytes[2] = analogRead(val2) & 255;
bytes[3] = (analogRead(val2) & 768) >> 8;
bytes[4] = analogRead(val3) & 255;
bytes[5] = (analogRead(val3) & 768) >> 8;
Serial.write( bytes,6);//отправляем в комп
*/
}
void buttons()
{
if(res_dt1>=715 && res_dt1<=725)//temp_s++. кнопка VOL UP
{
digitalWrite(m3_r,HIGH);
}
else digitalWrite(m3_r,LOW);
if(res_dt1>=635 && res_dt1<=645)//temp_s--. кнопка VOL DOWN
{
digitalWrite(m3_l,HIGH);
}
else digitalWrite(m3_l,LOW);
}
В эмуляторе проверил. Работает.
PHP код:
#define m3_l 43 //третий влево(заслонка горячий-холодный)
#define m3_r 44 //третий вправо(заслонка горячий-холодный)
#define en 38 //enable
#define val3 7 //АЦП третьего мотора
#define JOY 1 //АЦП джойстик
int res_dt1;//джойстик
void setup(void)
{
pinMode(m3_l,OUTPUT);
pinMode(m3_r,OUTPUT);
pinMode(en,OUTPUT);
digitalWrite(m3_l,LOW);
digitalWrite(m3_r,LOW);
digitalWrite(en,HIGH);
Serial.begin(115200);
}
void loop(void)
{
res_dt1 = analogRead(JOY); // прочитать данные АЦП
buttons();
Serial.println(analogRead(val3));
}
void buttons()
{
if(res_dt1>=715 && res_dt1<=725)//temp_s++. кнопка VOL UP
{
digitalWrite(m3_r,HIGH);
}
else digitalWrite(m3_r,LOW);
if(res_dt1>=635 && res_dt1<=645)//temp_s--. кнопка VOL DOWN
{
digitalWrite(m3_l,HIGH);
}
else digitalWrite(m3_l,LOW);
}
manu_245
Прикольно и правда работает.
Ниче не понимаю.Эт называется гляжу в книгу вижу фигу.
Serial.begin(115200);-это важная весч?
buttons();
Serial.println(analogRead(val3));и это
остальное один в один:confused:
manu_245
СПАСИБО!
Ниче не понимай,но работает.
Гений ёмаё.
Сам исче долго кипел бы,блин,тяжело жить с деревянной головой.
Вечером попробую это дело к большой присобачить.
Вобчем то мне от заслонки не много надо было,только чтоб поворачивалась сколько температуру выбрал.
Исче раз спасибо.
Пришла мысля, возник вопрос. А ардуина с тач-скрином может работать?
В том плане если в автономном режиме без компа перед lcd поставить, и
не надо джостика!
Не лучше энкодер вместо кнопок температуры.
Вроде сподручней управлять.
fox-explorer
http://robocraft.ru/blog/366.html
Если ардуино использовать одновременно как контроллер тачскрина, то при выключенном компьютере можно будет управлять климатом через тач, если еще картинку вывести. Вот http://www.compcar.ru/forum/showthre...ED%E8%F2%EE%F0
manu_245
Странно.
Скетч из 72 поста работает как часы.
Пробую подставлять в свой и тишина.
И почемуто на моем скетче стал сильно греться драйверPHP код:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <EEPROM.h>
#include <ks0108.h>
#include "ks0108_Mega.h" // include this for the Arduino Mega other ATmega1280 boards
#include "SystemFont5x7.h"//шрифт 5х7
#include "legs1.h"//значек(воздух вниз)
#include "both1.h"//значек(воздух вверх-вниз)
#include "screen1.h"//значек(воздух вверх)
#include "side1.h"//значек (воздух вперед)
#include "DS1.h"//шрифт крупный(температура)
int address = 0;
#define ONE_WIRE_BUS 50 //датчики на 50 ноге
#define TEMPERATURE_PRECISION 9
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
uint8_t Thermometer0[8], Thermometer1[8], Thermometer2[8], Thermometer3[8];//адреса датчиков
float temp0, temp1, temp2, temp3, temp_s=25;//t0 - двигатель, t1 - воздуховод, t2 - улица, t3 - салон, temp_s - заданая
byte bytes[8];
int err0, err1, err2, err3;
int error=0;
int vent_set=0;
#define m1_l 39 //первый влево
#define m1_r 40 //первый вправо
#define m2_l 41 //второй влево (боковые)
#define m2_r 42 //второй вправо(стекло)
#define m3_l 43 //третий влево(заслонка горячий-холодный)
#define m3_r 44 //третий вправо(заслонка горячий-холодный)
#define en 38 //enable
#define JOY 1 //АЦП джойстик
#define val2 5 //АЦП второго мотора
#define val1 6 //АЦП первого мотора
#define val3 7 //АЦП третьего мотора
#define vent 31 //ШИМ вентилятора
int res_dt1;//джойстик
//int min_3 = 115; //(заслонка горячий-холодный)
//int max_3 = 950; //(заслонка горячий-холодный)
int min_2 = 185; //боковые
int max_2 = 450; //стекло
int centr_1 = 310; //среднее первый
int min_1 = 310; //ноги
int max_1 = 490; //ноги закрыто
int centr_2 = 370; //среднее второй
int vent_s=3;
int vent_speed=3;
int t=5, f=0;
int flow=5;
unsigned long time;
void setup(void)
{
pinMode(m1_l,OUTPUT);
pinMode(m1_r,OUTPUT);
pinMode(m2_l,OUTPUT);
pinMode(m2_r,OUTPUT);
pinMode(m3_l,OUTPUT);
pinMode(m3_r,OUTPUT);
pinMode(en,OUTPUT);
pinMode(vent,OUTPUT);
digitalWrite(m1_l,LOW);
digitalWrite(m1_r,LOW);
digitalWrite(m2_l,LOW);
digitalWrite(m2_r,LOW);
digitalWrite(m3_l,LOW);
digitalWrite(m3_r,LOW);
digitalWrite(en,HIGH);
digitalWrite(vent,LOW );
sensors.begin();
Serial.begin(115200);
TCCR2B = TCCR2B & 0b11111000 | 0x04;
//devices=sensors.getDeviceCount();//считаем сколько датчиков подключено
if (!sensors.getAddress(Thermometer0, 0)) err0=1;//ошибка. нет датчика 0 - двигатель
if (!sensors.getAddress(Thermometer1, 1)) err1=1;//ошибка. нет датчика 1 - воздуховод
if (!sensors.getAddress(Thermometer2, 2)) err2=1;//ошибка. нет датчика 2 - улица
if (!sensors.getAddress(Thermometer3, 3)) err3=1;//ошибка. нет датчика 3 - салон
sensors.setResolution(Thermometer0, 9);
sensors.setResolution(Thermometer1, 9);
sensors.setResolution(Thermometer2, 9);
sensors.setResolution(Thermometer3, 9);
GLCD.Init(NON_INVERTED); // initialise the library, non inverted writes pixels onto a clear screen
GLCD.ClearScreen();
GLCD.SelectFont(System5x7);
GLCD.CursorTo(0,5);
GLCD.Puts("OUTSIDE:");
GLCD.CursorTo(0,6);
GLCD.Puts("VENT SPEED:");
/*
if(analogRead(val1) > max_1-10 && analogRead(val2) < min_2+10) flow=2;
if(analogRead(val1) > max_1-10 && analogRead(val2) > max_2-10) flow=0;
if(analogRead(val1) > min_1-10 && analogRead(val1) < min_1+10) flow=1;
*/
temp_s = EEPROM.read(address);//читаем заданую температуру из еепром
bytes[0] = 0xFF;
bytes[1] = temp_s;
bytes[2] = flow;
bytes[3] = 0;
Serial.write( bytes,4);//отправляем ее в комп
}
void loop(void)
{
res_dt1 = analogRead(JOY); // прочитать данные АЦП
/*
bytes[0] = analogRead(val1) & 255;
bytes[1] = (analogRead(val1) & 768) >> 8;
bytes[2] = analogRead(val2) & 255;
bytes[3] = (analogRead(val2) & 768) >> 8;
bytes[4] = analogRead(val3) & 255;
bytes[5] = (analogRead(val3) & 768) >> 8;
Serial.write( bytes,6);//отправляем в комп
*/
byte a, b;
if (Serial.available() > 1)
{
a = Serial.read();
b = Serial.read();
if(a==0x64)temp_s=b;
if(a==0xFF)f=b;
if(a==0x78)vent_s=b*10;
Serial.println(analogRead(val3));
}
analogWrite(vent, vent_s);//вентилятор
buttons();
if ((millis()-time)>500 && res_dt1 == 1023) //запуск процедур по таймеру
{
time = millis();
termometer();
}
motors();
lcd();
vent_speed=vent_s/17;
}
void termometer()
{
int m0, m1, m;
sensors.requestTemperatures();
temp0 = sensors.getTempC(Thermometer0);
temp1 = sensors.getTempC(Thermometer1);
temp2 = sensors.getTempC(Thermometer2);
temp3 = sensors.getTempC(Thermometer3);
if(temp3<0)
{
m0=1;
temp3=-temp3;
}
else m0=0;
if(temp2<0)
{
m1=1;
temp2=-temp2;
}
else m1=0;
m=m0*10+m1;
bytes[0] = 0x64; //префикс
bytes[1] = temp3; //салон
bytes[2] = m;
bytes[3] = temp2; //улица
Serial.write( bytes,4);
}
void motors()
{
if(flow==0)//стекло
{
if (analogRead(val2)<max_2)digitalWrite(m2_r,HIGH);
else digitalWrite(m2_r,LOW);
if (analogRead(val1)<max_1)digitalWrite(m1_l,HIGH);
else digitalWrite(m1_l,LOW);
}
if(flow==1)//в ноги
{
if (analogRead(val1)>min_1)digitalWrite(m1_r,HIGH);
else digitalWrite(m1_r,LOW);
}
if(flow==2)//боковые
{
if (analogRead(val2)>min_2)digitalWrite(m2_l,HIGH);
else digitalWrite(m2_l,LOW);
if (analogRead(val1)<max_1)digitalWrite(m1_l,HIGH);
else digitalWrite(m1_l,LOW);
}
if(flow==3)//стекло и ноги
{
if (analogRead(val2)<max_2)digitalWrite(m2_r,HIGH);
else digitalWrite(m2_r,LOW);
if (analogRead(val1)>min_1)digitalWrite(m1_r,HIGH);
else digitalWrite(m1_r,LOW);
}
}
void buttons()
{
if(res_dt1>=176 && res_dt1<=186)//кнопка SOURCE
{
EEPROM.write(address, temp_s);//пишем в еепром temp_set
delay(500);
}
if(res_dt1>=556 && res_dt1<=566)//vent_s ++. кнопка TRACK UP
{
vent_s=vent_s+10;
delay(30);
if(vent_s > 250)vent_s=255;
bytes[0] = 0xC8; //префикс
bytes[1] = vent_s/10;
bytes[2] = 0;
bytes[3] = 0;
Serial.write( bytes,4);
delay(80);
}
if(res_dt1>=475 && res_dt1<=485)//vent_s --. кнопка TRACK DOWN
{
vent_s=vent_s-10;
delay(30);
if(vent_s <=0)vent_s=0;
bytes[0] = 0xC8; //префикс
bytes[1] = vent_s/10;
bytes[2] = 0;
bytes[3] = 0;
Serial.write( bytes,4);
delay(80);
}
if((res_dt1>=843 && res_dt1<=853) || f==0)// на стекло. кнопка MODE
{
flow=0;
f=5;
bytes[0] = 0x4B;
bytes[1] = flow;
bytes[2] = 0;
bytes[3] = 0;
Serial.write( bytes,4);
delay(80);
}
if((res_dt1>=401 && res_dt1<=411) || f==1)//в ноги. кнопка FILE
{
flow=1;
f=5;
bytes[0] = 0x4B;
bytes[1] = flow;
bytes[2] = 0;
bytes[3] = 0;
Serial.write( bytes,4);
delay(80);
}
if((res_dt1>=784 && res_dt1<=794) || f==2)//боковые. кнопка SEL
{
flow=2;
f=5;
bytes[0] = 0x4B;
bytes[1] = flow;
bytes[2] = 0;
bytes[3] = 0;
Serial.write( bytes,4);
delay(80);
}
if((res_dt1>=307 && res_dt1<=327) || f==3)//на стекло и в ноги. кнопка ATT
{
flow=3;
f=5;
bytes[0] = 0x4B;
bytes[1] = flow;
bytes[2] = 0;
bytes[3] = 0;
Serial.write( bytes,4);
delay(80);
}
}
void lcd()
{
GLCD.SelectFont(DS);
GLCD.CursorTo(0,0);
GLCD.PrintNumber(temp3);
GLCD.Puts("/ ");
if(temp_s>=10)GLCD.CursorTo(5,0);
else GLCD.CursorTo(6,0);
GLCD.PrintNumber(temp_s);
GLCD.Puts("/");
GLCD.SelectFont(System5x7);
GLCD.CursorTo(8,5);
GLCD.PrintNumber(temp2);
GLCD.Puts(" C");
int i=0;
for(i=0;i<vent_speed;i++)
{
GLCD.CursorTo(i,7);
GLCD.Puts("*");
}
int j=0;
for(j=vent_speed;j<15;j++)
{
GLCD.CursorTo(j,7);
GLCD.Puts(" ");
}
if(flow==0)GLCD.DrawBitmap(screen, 96,32, BLACK);
if(flow==1)GLCD.DrawBitmap(legs, 96,32, BLACK);
if(flow==2)GLCD.DrawBitmap(side, 96,32, BLACK);
if(flow==3)GLCD.DrawBitmap(both, 96,32, BLACK);
}
напруги все проверил все в норме стоит залить проверочный
все огонь.
Скетч из последнего поста не содержит управления 3-м приводом, остальные должны работать. Связи между нагревом и скетчем я не вижу. Возможно неправильно подключены приводы.
Минусом всей этой схемы является то, что обязательно надо проверять направление.
То есть, если пишем, например,
, необходимо обязательно поверить, что при m2_r,HIGH значение АЦП увеличивается, а не уменьшается! Иначе analogRead(val2) всегда будет <max_2, и привод упрется, но будет продолжать крутить.PHP код:
if (analogRead(val2)<max_2)digitalWrite(m2_r,HIGH);
else digitalWrite(m2_r,LOW);
Чтобы прописать заслонку температуры необходимо знать АЦП в крайних положениях и, главное, как ее положение должно быть связано с температурой или каким-либо другим параметром. Скорее всего эта зависимость подбирается по месту на конкретной заслонке.
Вот пока вариант с управлением заслонкой джойстиком. ЖК отключен.
Предположительно с экраном проблема. Библиотека то не под мегу переписана.
Как подключен ЖК? Есть схема? Регистр применяется? На меге без регистра лучше даже. Это вынужденная мера была для экономии ног.
PHP код:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <EEPROM.h>
int address = 0;
#define ONE_WIRE_BUS 50 //датчики на 50 ноге
#define TEMPERATURE_PRECISION 9
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
uint8_t Thermometer0[8], Thermometer1[8], Thermometer2[8], Thermometer3[8];//адреса датчиков
float temp0, temp1, temp2, temp3, temp_s=25;//t0 - двигатель, t1 - воздуховод, t2 - улица, t3 - салон, temp_s - заданая
byte bytes[8];
int err0, err1, err2, err3;
int error=0;
int vent_set=0;
#define m1_l 39 //первый влево
#define m1_r 40 //первый вправо
#define m2_l 41 //второй влево (боковые)
#define m2_r 42 //второй вправо(стекло)
#define m3_l 43 //третий влево(заслонка горячий-холодный)
#define m3_r 44 //третий вправо(заслонка горячий-холодный)
#define en 38 //enable
#define JOY 1 //АЦП джойстик
#define val2 5 //АЦП второго мотора
#define val1 6 //АЦП первого мотора
#define val3 7 //АЦП третьего мотора
#define vent 31 //ШИМ вентилятора
int res_dt1;//джойстик
int min_3 = 115; //(заслонка горячий-холодный)
int max_3 = 950; //(заслонка горячий-холодный)
int min_2 = 185; //боковые
int max_2 = 450; //стекло
int centr_1 = 310; //среднее первый
int min_1 = 310; //ноги
int max_1 = 490; //ноги закрыто
int centr_2 = 370; //среднее второй
int vent_s=3;
int vent_speed=3;
int t=5, f=0;
int flow=5;
unsigned long time;
void setup(void)
{
pinMode(m1_l,OUTPUT);
pinMode(m1_r,OUTPUT);
pinMode(m2_l,OUTPUT);
pinMode(m2_r,OUTPUT);
pinMode(m3_l,OUTPUT);
pinMode(m3_r,OUTPUT);
pinMode(en,OUTPUT);
pinMode(vent,OUTPUT);
digitalWrite(m1_l,LOW);
digitalWrite(m1_r,LOW);
digitalWrite(m2_l,LOW);
digitalWrite(m2_r,LOW);
digitalWrite(m3_l,LOW);
digitalWrite(m3_r,LOW);
digitalWrite(en,HIGH);
digitalWrite(vent,LOW );
sensors.begin();
Serial.begin(115200);
TCCR2B = TCCR2B & 0b11111000 | 0x04;
//devices=sensors.getDeviceCount();//считаем сколько датчиков подключено
if (!sensors.getAddress(Thermometer0, 0)) err0=1;//ошибка. нет датчика 0 - двигатель
if (!sensors.getAddress(Thermometer1, 1)) err1=1;//ошибка. нет датчика 1 - воздуховод
if (!sensors.getAddress(Thermometer2, 2)) err2=1;//ошибка. нет датчика 2 - улица
if (!sensors.getAddress(Thermometer3, 3)) err3=1;//ошибка. нет датчика 3 - салон
sensors.setResolution(Thermometer0, 9);
sensors.setResolution(Thermometer1, 9);
sensors.setResolution(Thermometer2, 9);
sensors.setResolution(Thermometer3, 9);
temp_s = EEPROM.read(address);//читаем заданую температуру из еепром
bytes[0] = 0xFF;
bytes[1] = temp_s;
bytes[2] = flow;
bytes[3] = 0;
Serial.write( bytes,4);//отправляем ее в комп
}
void loop(void)
{
res_dt1 = analogRead(JOY); // прочитать данные АЦП
/*
bytes[0] = analogRead(val1) & 255;
bytes[1] = (analogRead(val1) & 768) >> 8;
bytes[2] = analogRead(val2) & 255;
bytes[3] = (analogRead(val2) & 768) >> 8;
bytes[4] = analogRead(val3) & 255;
bytes[5] = (analogRead(val3) & 768) >> 8;
Serial.write( bytes,6);//отправляем в комп
*/
byte a, b;
if (Serial.available() > 1)
{
a = Serial.read();
b = Serial.read();
if(a==0x64)temp_s=b;
if(a==0xFF)f=b;
if(a==0x78)vent_s=b*10;
}
analogWrite(vent, vent_s);//вентилятор
buttons();
if ((millis()-time)>500 && res_dt1 == 1023) //запуск процедур по таймеру
{
time = millis();
termometer();
}
motors();
vent_speed=vent_s/17;
}
void termometer()
{
sensors.requestTemperatures();
temp0 = sensors.getTempC(Thermometer0);
temp1 = sensors.getTempC(Thermometer1);
temp2 = sensors.getTempC(Thermometer2);
temp3 = sensors.getTempC(Thermometer3);
bytes[0] = 0x64; //префикс
bytes[1] = temp3+40; //салон
bytes[2] = 0;
bytes[3] = temp2+40; //улица
Serial.write( bytes,4);
}
void motors()
{
if(flow==0)//стекло
{
if (analogRead(val2)<max_2)digitalWrite(m2_r,HIGH);
else digitalWrite(m2_r,LOW);
if (analogRead(val1)<max_1)digitalWrite(m1_l,HIGH);
else digitalWrite(m1_l,LOW);
}
if(flow==1)//в ноги
{
if (analogRead(val1)>min_1)digitalWrite(m1_r,HIGH);
else digitalWrite(m1_r,LOW);
}
if(flow==2)//боковые
{
if (analogRead(val2)>min_2)digitalWrite(m2_l,HIGH);
else digitalWrite(m2_l,LOW);
if (analogRead(val1)<max_1)digitalWrite(m1_l,HIGH);
else digitalWrite(m1_l,LOW);
}
if(flow==3)//стекло и ноги
{
if (analogRead(val2)<max_2)digitalWrite(m2_r,HIGH);
else digitalWrite(m2_r,LOW);
if (analogRead(val1)>min_1)digitalWrite(m1_r,HIGH);
else digitalWrite(m1_r,LOW);
}
}
void buttons()
{
if(res_dt1>=176 && res_dt1<=186)//кнопка SOURCE
{
EEPROM.write(address, temp_s);//пишем в еепром temp_set
delay(500);
}
if(res_dt1>=715 && res_dt1<=725)//temp_s++. кнопка VOL UP
{
digitalWrite(m3_r,HIGH);
}
else digitalWrite(m3_r,LOW);
if(res_dt1>=635 && res_dt1<=645)//temp_s--. кнопка VOL DOWN
{
digitalWrite(m3_l,HIGH);
}
else digitalWrite(m3_l,LOW);
if(res_dt1>=556 && res_dt1<=566)//vent_s ++. кнопка TRACK UP
{
vent_s=vent_s+10;
delay(30);
if(vent_s > 250)vent_s=255;
bytes[0] = 0xC8; //префикс
bytes[1] = vent_s/10;
bytes[2] = 0;
bytes[3] = 0;
Serial.write( bytes,4);
delay(80);
}
if(res_dt1>=475 && res_dt1<=485)//vent_s --. кнопка TRACK DOWN
{
vent_s=vent_s-10;
delay(30);
if(vent_s <=0)vent_s=0;
bytes[0] = 0xC8; //префикс
bytes[1] = vent_s/10;
bytes[2] = 0;
bytes[3] = 0;
Serial.write( bytes,4);
delay(80);
}
if((res_dt1>=843 && res_dt1<=853) || f==0)// на стекло. кнопка MODE
{
flow=0;
f=5;
bytes[0] = 0x4B;
bytes[1] = flow;
bytes[2] = 0;
bytes[3] = 0;
Serial.write( bytes,4);
delay(80);
}
if((res_dt1>=401 && res_dt1<=411) || f==1)//в ноги. кнопка FILE
{
flow=1;
f=5;
bytes[0] = 0x4B;
bytes[1] = flow;
bytes[2] = 0;
bytes[3] = 0;
Serial.write( bytes,4);
delay(80);
}
if((res_dt1>=784 && res_dt1<=794) || f==2)//боковые. кнопка SEL
{
flow=2;
f=5;
bytes[0] = 0x4B;
bytes[1] = flow;
bytes[2] = 0;
bytes[3] = 0;
Serial.write( bytes,4);
delay(80);
}
if((res_dt1>=307 && res_dt1<=327) || f==3)//на стекло и в ноги. кнопка ATT
{
flow=3;
f=5;
bytes[0] = 0x4B;
bytes[1] = flow;
bytes[2] = 0;
bytes[3] = 0;
Serial.write( bytes,4);
delay(80);
}
}