Если ардуино использовать одновременно как контроллер тачскрина, то при выключенном компьютере можно будет управлять климатом через тач, если еще картинку вывести. Вот http://www.compcar.ru/forum/showthre...ED%E8%F2%EE%F0
Если ардуино использовать одновременно как контроллер тачскрина, то при выключенном компьютере можно будет управлять климатом через тач, если еще картинку вывести. Вот 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);
}
напруги все проверил все в норме стоит залить проверочный
все огонь.
Последний раз редактировалось basurman971; 22.03.2012 в 23:13.
Скетч из последнего поста не содержит управления 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);
}
}
manu_245
Я уже дошел до того чтобы завести мотор .
Дисплей работает нормально на все реагирует пока не пытаешься вкарячить мотор к температуре.
Или мотор работает,или температура на дисплее изменяется.
И еще хотелось бы знать,как другие моторы видят кнопки,сам никак не пойму.
Последний раз редактировалось basurman971; 26.03.2012 в 00:26.
Другие моторы не видят кнопки. на кнопки прописаны заранее установленные положения приводов (соответствующие положениям заслонок), а кнопками только выбор осуществляется. Тоже самое можно делать и вообще без кнопок, через терминал или программу управляющую (в этой теме выкладывал).
Если подключить мотор на кнопки (третий привод так и подключен), то при его движении (кнопка нажата) АЦП res_dt1 не будет равно 1023 и не будет выполняться termometer(); Сделано это было для страховки от глюков при опросе датчиков. Можно попробовать termometer() просто в loop поставить, без таймера. Тогда нажатие кнопок не будет влиять на температуру и ее отображение.
В идеале конечно хорошо бы все под себя переписать.Но это на данный момент нереально.Не осилю,поэтому мучаюсь с тем что есть.
Меня вполне бы устроило регулирование на десять положений заслонки
с увеличением в два градуса,скажем от 16 до 36.
Но блин этож китайская грамота,чем дальше лезу,тем больше непонятней.
Крайние положения определил,мотор крутится,как положено,но на дисплее тишина.Как это возможно?НЕ могу понять.Я понимаю,что здесь не семинар по програмированию,но куда еще идти?Другие моторы не видят кнопки. на кнопки прописаны заранее установленные положения приводов (соответствующие положениям заслонок), а кнопками только выбор осуществляется.
Добрый вечер.
Мучался я мучался,ну и что-то вроде получилось.
Только вот мотор дергается во всех положениях, подскажите пожалуйста как это можно победить.Мотор это который температуру регулирует.
Вот скетч:
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 Thermometer2[8], Thermometer3[8];//адреса датчиков
float temp2, temp3;// t2 - улица, t3-салон
byte bytes[8];
int err2, err3;
int error=0;
int vent_set=2;
#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 enl 38 //enable
#define JOY 1 //АЦП джойстик
#define val2 5 //АЦП второго мотора
#define val1 6 //АЦП первого мотора
#define var 7 //АЦП третьего мотора
#define vent 31 //ШИМ вентилятора
int res_dt1;//джойстик
int motor1, motor2, motor3;//АЦП приводов
int var_0 = 132; //(заслонка горячий-холодный)
int var_1 = 144; //(заслонка горячий-холодный)
int var_2 = 162; //(заслонка горячий-холодный)
int var_3 = 206; //(заслонка горячий-холодный)
int var_4 = 275; //(заслонка горячий-холодный)
int var_5 = 342; //(заслонка горячий-холодный)
int var_6 = 396; //(заслонка горячий-холодный)
int var_7 = 451; //(заслонка горячий-холодный)
int var_8 = 506; //(заслонка горячий-холодный)
int var_9 = 561; //(заслонка горячий-холодный)
int var_10 = 620; //(заслонка горячий-холодный)
int var_11 = 685; //(заслонка горячий-холодный)
int var_12 = 760; //(заслонка горячий-холодный)
int var_13 = 805; //(заслонка горячий-холодный)
int var_14 = 856; //(заслонка горячий-холодный)
int var_15 = 896; //(заслонка горячий-холодный)
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;
int temp_s=17;
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(enl,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(enl,HIGH);
digitalWrite(vent,LOW );
sensors.begin();
Serial.begin(115200);
TCCR2B = TCCR2B & 0b11111000 | 0x04;
//devices=sensors.getDeviceCount();//считаем сколько датчиков подключено
if (!sensors.getAddress(Thermometer2, 2)) err2=1;//ошибка. нет датчика 2 - улица
if (!sensors.getAddress(Thermometer3, 3)) err3=1;//ошибка. нет датчика 3 - салон
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);//отправляем ее в комп
Serial.println(analogRead(var));
}
void loop(void)
{
res_dt1 = analogRead(JOY); // прочитать данные АЦП
buttons();
motor1 = analogRead(val1); // прочитать данные АЦП
motor2 = analogRead(val2); // прочитать данные АЦП
motor3 = analogRead(var); // прочитать данные АЦП
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);//вентилятор
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();
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(temp_s)//мотор заслонки температуры
{
if(temp_s==40)
{
if (analogRead(var)<var_15)digitalWrite(m3_r,HIGH);
else digitalWrite(m3_r,LOW);
if (analogRead(var)>var_15)digitalWrite(m3_l,HIGH);
else digitalWrite(m3_l,LOW);
}
if(temp_s==38)
{
if (analogRead(var)<var_14)digitalWrite(m3_r,HIGH);
else digitalWrite(m3_r,LOW);
if (analogRead(var)>var_14)digitalWrite(m3_l,HIGH);
else digitalWrite(m3_l,LOW);
}
if(temp_s==36)
{
if (analogRead(var)<var_13)digitalWrite(m3_r,HIGH);
else digitalWrite(m3_r,LOW);
if (analogRead(var)>var_13)digitalWrite(m3_l,HIGH);
else digitalWrite(m3_l,LOW);
}
if(temp_s==34)
{
if (analogRead(var)<var_12)digitalWrite(m3_r,HIGH);
else digitalWrite(m3_r,LOW);
if (analogRead(var)>var_12)digitalWrite(m3_l,HIGH);
else digitalWrite(m3_l,LOW);
}
if(temp_s==32)
{
if (analogRead(var)<var_11)digitalWrite(m3_r,HIGH);
else digitalWrite(m3_r,LOW);
if (analogRead(var)>var_11)digitalWrite(m3_l,HIGH);
else digitalWrite(m3_l,LOW);
}
if(temp_s==30)
{
if (analogRead(var)<var_10)digitalWrite(m3_r,HIGH);
else digitalWrite(m3_r,LOW);
if (analogRead(var)>var_10)digitalWrite(m3_l,HIGH);
else digitalWrite(m3_l,LOW);
}
if(temp_s==28)
{
if (analogRead(var)<var_9)digitalWrite(m3_r,HIGH);
else digitalWrite(m3_r,LOW);
if (analogRead(var)>var_9)digitalWrite(m3_l,HIGH);
else digitalWrite(m3_l,LOW);
}
if(temp_s==26)
{
if (analogRead(var)<var_8)digitalWrite(m3_r,HIGH);
else digitalWrite(m3_r,LOW);
if (analogRead(var)>var_8)digitalWrite(m3_l,HIGH);
else digitalWrite(m3_l,LOW);
}
if(temp_s==24)
{
if (analogRead(var)<var_7)digitalWrite(m3_r,HIGH);
else digitalWrite(m3_r,LOW);
if (analogRead(var)>var_7)digitalWrite(m3_l,HIGH);
else digitalWrite(m3_l,LOW);
}
if(temp_s==22)
{
if (analogRead(var)<var_6)digitalWrite(m3_r,HIGH);
else digitalWrite(m3_r,LOW);
if (analogRead(var) >var_6)digitalWrite(m3_l,HIGH);
else digitalWrite(m3_l,LOW);
}
if(temp_s==20)
{
if (analogRead(var)<var_5)digitalWrite(m3_r,HIGH);
else digitalWrite(m3_r,LOW);
if (analogRead(var)>var_5)digitalWrite(m3_l,HIGH);
else digitalWrite(m3_l,LOW);
}
if(temp_s==18)
{
if (analogRead(var)<var_4)digitalWrite(m3_r,HIGH);
else digitalWrite(m3_r,LOW);
if (analogRead(var)>var_4)digitalWrite(m3_l,HIGH);
else digitalWrite(m3_l,LOW);
}
if(temp_s==16)
{
if (analogRead(var)<var_3)digitalWrite(m3_r,HIGH);
else digitalWrite(m3_r,LOW);
if (analogRead(var)>var_3)digitalWrite(m3_l,HIGH);
else digitalWrite(m3_l,LOW);
}
if(temp_s==14)
{
if (analogRead(var)<var_2)digitalWrite(m3_r,HIGH);
else digitalWrite(m3_r,LOW);
if (analogRead(var)>var_2)digitalWrite(m3_l,HIGH);
else digitalWrite(m3_l,LOW);
}
if(temp_s==12)
{
if (analogRead(var)<var_1)digitalWrite(m3_r,HIGH);
else digitalWrite(m3_r,LOW);
if (analogRead(var)>var_1)digitalWrite(m3_l,HIGH);
else digitalWrite(m3_l,LOW);
}
if(temp_s==10)
{
if (analogRead(var)>var_0)digitalWrite(m3_l,HIGH);
else digitalWrite(m3_l,LOW);
if (analogRead(var)<var_0)digitalWrite(m3_r,HIGH);
else digitalWrite(m3_r,LOW);
}
}
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>=715 && res_dt1<=725)//temp_s++. кнопка VOL UP
{
if(temp_s<40)
{
temp_s=temp_s+2;
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-2;
delay(30);
}
bytes[0] = 0x5A; //префикс
bytes[1] = temp_s;
bytes[2] = 0;
bytes[3] = 0;
Serial.write( bytes,4);
delay(150);
}
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("0");
}
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);
}
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)