Акваконтроллер


Новичок




46
Germany
2 г. назад
Акваконтроллер
Добрый день.
Не могли бы вы помочь в написании скетча.
Я к сожалению в программировании полный ноль.

Что имеется:
Arduino Mega 2560
LCD Keypad Shield 1602 c 5-ю кропками
Блок реле (двухканальное)
Часы DS1307 Tiny RTC I2C module, 24C32 EEPROM
Датчик температуры DS18B20

LCD Keypad Shield подключен к пинам 4,5,6,7,8,9, кнопки к А0, подсветка к 10 пину.
Датчик температуры DS18B20 подключен к пину 53.
Блок реле к пинам 40,41
К пинам 3,11,12 подключены LED через мосфеты.

Что требуется:
1). Реле будут включать обогрев (назовём Н1 и Н2), т.е. Н1 управляется по 40 пину, а Н2 - по 41.
При температуре 28 включаются оба нагревателя. При достижении температуры 28,3 нагреватель Н1 отключается. При 28,5 отключается Н2.

2). LED подсветка (назовём LW – pin3, LR – pin11 и LB – pin12) должна включаться и выключаться по времени. Т.е. например в 17:00 плавно в течении 5 минут включается LW и LR, далее в 21:55 начинает плавно гаснуть (5 минут), а в это время плавно включается LB. Затем в 23:00 плавно гаснет (5 минут) LB.

3). Меню
Главный экран:

Т=28,4° 14:53
Н1-Off H2-On

т.е. отображается текущая температура, текущее время и состояние нагревателей.

Следующий экран:

Н1: On-28° Off-28,3°

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

Следующий экран:

H2: On-28° Off-28,5°

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

Следующий экран:

LW+LR: On-17:00
Off-21:55

т.е. возможность регулирования времени включения и выключения света LW и LR.

Следующий экран:

LB: On-21:55
Off-23:00

т.е. возможность регулирования времени включения и выключения света LB.


Переключение между экранами - кнопками Left и Right.
Выбор - кнопкой Select.
Установка – кнопками Up и Down.

Ещё нужна на главном экране возможность включения и выключения света LW и LR кнопкой, независимо от времени. А также возможность включения и выключения нагревателя Н1 кнопкой, независимо от температуры.
И ещё возможность установки часов.


Ещё нужна возможность регулировки яркости света для каждого канала в самом скетче, т.к. ещё сам не знаю будет ли свет гореть на 100% или хватит на 80%.


Ну вроде всё, вроде ничего не забыл.
Я конечно понимаю, что это наглость с моей стороны, и что у вас наверняка нету времени заниматься моими проблемами, но мне просто не к кому обратиться.


Заранее благодарен, и надеюсь на ваше понимание и помощь.
С уважением.
2014-03-18 добавлено 18/03/2014 18:56:10#1951621

Новичок




46
Germany
2 г. назад
Вот для этого кода нужно плавное включение света в заданное время и плавное выключение в другое заданное время. Помогите разобраться.

// Библиотеки необходимые для работы модуля часов
#include "Wire.h"
#include "DS1307new.h"

// библиотека экрана
#include "LiquidCrystal.h"
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int hours;
int minutes;
int LW = 3;
int LR = 11;
int LB = 12;
int On_Time =0;
int Off_Time =0;
int Curent_Time =0;

void setup(){
Serial.begin(9600);
lcd.begin(16, 2); // запускаем библиотеку экрана
pinMode(LW, OUTPUT);
pinMode(LR, OUTPUT);
pinMode(LB, OUTPUT);
}

void loop(){
analogWrite(10, 100);
RTC.getTime();// получить время от модуля
RTC.hour;
RTC.minute;
printTimeToSerial(); // выводим полученное время в лог
printTimeToLCD();; // выводи время на экран
lcd.setCursor(0, 1); // Set the cursor to column 0, line 1
doSerialCommands(); // слушаем и выполняем команды из Serial
On_Time=(20*60+27);
Off_Time=(20*60+29);
Curent_Time=RTC.hour*60+RTC.minute;//текущее время
if(On_Time < Off_Time) //Проверка, таймер в течении одних суток?
{
if (Curent_Time >= On_Time && Curent_Time <= Off_Time)
for(int fadeValue = 0; fadeValue <= 255; fadeValue +=3)
{
analogWrite(LR, fadeValue);
}
else
for(int fadeValue = 255; fadeValue >= 0; fadeValue -=3)
{
analogWrite(LR, fadeValue);
}
}
else // если сутки сменились
{
if ((Curent_Time >= On_Time && Curent_Time <= 2820)||(Curent_Time >= 0 && Curent_Time <= Off_Time))//2820=24часа*60
for(int fadeValue = 0; fadeValue <= 255; fadeValue +=3)
{
analogWrite(LR, fadeValue);
}
else
for(int fadeValue = 255; fadeValue >= 0; fadeValue -=3)
{
analogWrite(LR, fadeValue);
}
}
}

// Выводит текущие время в Serial
void printTimeToSerial(){

byte static prevSecond=0; // тут будем хранить, сколько секунд было при прошлом отчете

if(RTC.second!=prevSecond){ // что-то делаем только если секунды поменялись
Serial.print(RTC.hour); // часы

Serial.print(":"); // разделитель
Serial.print(RTC.minute);

Serial.print(":");
Serial.println(RTC.second);

prevSecond=RTC.second; // запомнили когда мы "отчитались"
}
}

// Выводит текущие время на LCD

void printTimeToLCD(){
byte static prevSecond=0; // тут будем хранить, сколько секунд было при выводе

if(RTC.second!=prevSecond){ // что-то делаем только если секунды поменялись
lcd.setCursor(11,0); // устанавливаем позицию курсора

if(RTC.hour<10)lcd.print(" ");
lcd.print(RTC.hour); // часы

lcd.print( (RTC.second % 2)?" ":":"); // разделитель моргает

if(RTC.minute<10)lcd.print(0); // лидирующий ноль, если нужен
lcd.print(RTC.minute);

prevSecond=RTC.second; // запомнили когда мы "отчитались"
}
}

// устанавливает часы модуля на какое-то заранее определенное время
void setSomeTime(){
RTC.stopClock();// останавливаем часы
RTC.fillByHMS(20,24,0); // "подкручиваем стрелки на 2000
RTC.setTime();// отправляем "подкрученное время" самому модулю
RTC.startClock(); // и опять запускаем часы
}

// слушает из Serial команды и выполняет их. Каждая команда - один символ.
// доступны команды:
// s - установить время указанное в функции setSomeTime()
void doSerialCommands(){
if(Serial.available()){ // что-нибудь пришло?
char ch=Serial.read(); // читаем что пришло

switch(ch){
case 's': // команда установки времени
setSomeTime(); // устанавливаем
break;

// тут, в будущем, мы можем добавлять дополнительные команды
default:;
// на неизвестную команду - ничего не делаем
};
}
}
2014-03-24 добавлено 24/03/2014 02:11:29#1954161

Создать новую темуБыстрый ответ