Аквариумный контроллер,Help
- Войдите на сайт для отправки комментариев
Доброе время суток, далек от програмирования, сидел две недели и питалсся разобраться но не получилось, поэтому прошу помощи.
Сообственно нужно из скетча удалить все что связано с:
EXT_HEATER
EXT_COOLING
EXT_LIGHT_1
EXT_LIGHT_2
EXT_UDO_MICRO
EXT_UDO_MACRO
EXT_UDO_Fe
EXT_POWER_ON
EXT_LIGHT_LED
пробовал удалать, но вылезают ошибки постоянно, потом забил на это дело и решил сделать шим регулировку для led драйвера
что-то вроде этого:
//---------------- Проедварительная настройка света -дабы долго не настраивать ;) ------------------------
// byte initLight[] = {
// // Sp, Mn
// 0, 0, // 0
// 0, 0, // 1
// 0, 0, // 2
// 0, 0, // 3
// 0, 0, // 4
// 0, 0, // 5
// 0, 0, // 6
// 0, 0, // 7
// 0, 0, // 8
// 10, 10, // 9
// 50, 40, // 10
// 90, 80, // 11
// 100, 90, // 12
// 130, 120, // 13
// 240, 240, // 14
// 240, 240, // 15
// 250, 250, // 16
// 250, 250, // 17
// 250,250, // 18
// 250,250, // 19
// 250,250, // 20
// 170, 160, // 21
// 110, 100, // 22
// 0, 0, // 23
Для двух каналов:
#define Light_Coll_Whi 9
#define Light_Warm_Whi 10
Наведите на мысль, или помогите сделать, руки уже опускаються и ничего не хочется:(
// Обращение к ним идет по номерам от 14 (для аналогового входа 0) до 19 (для аналогового входа 5).
#define EXT_FILTER_PIN 12
#define EXT_AIR_PIN 1
#define EXT_HEATER_PIN 13
#define EXT_COOLING_PIN A3
#define EXT_LIGHT_1_PIN 15
#define EXT_LIGHT_2_PIN 16
#define EXT_CO2_PIN 0
#define Light_Coll_Whi 9
#define Light_Warm_Whi 10
#define EXT_POWER_ON_PIN 20
#define EXT_LIGHT_LED_PIN 11
#define EXT_UDO_MICRO_PIN 17
#define EXT_UDO_MACRO_PIN 18
#define EXT_UDO_Fe_PIN 19
#define Key_PIN 7
#define DispLight_min 235 //минимальная подсветка в режиме часов
#define CorrTime 0 // коррекция хода системных часов [Сек] выполняется каждый час
//const int CorrTime = -1; // коррекция хода системных часов [Сек]
// It is assumed that the LCD module is connected to
// the following pins using a levelshifter to get the
// correct voltage to the module.
// SCK - Pin 8
// MOSI - Pin 9
// DC - Pin 10
// RST - Pin 11
// CS - Pin 12
//
#include <LCD5110_Graph.h>
#define LED_LIGHT_PIN A4
LCD5110 myGLCD(8,7,6,4,5);
extern uint8_t SmallFont[];
extern uint8_t BigNumbers[];
//extern unsigned char TinyFont[];
byte ledContrast;
byte ledLight;
//подключаем заголовочный файл библиотеки EEPROM
#include <EEPROM.h>
#include <OneWire.h>
OneWire temp(14); // on pin 10 (a 4.7K resistor is necessary)
float cur_temp = -999;
byte temp_type_s;
byte temp_data[12];
byte temp_addr[8];
byte temp_cicle = 0;
// I assume you know how to connect the DS1307.
// DS1307: SDA pin -> Arduino Digital 4
// SCL pin -> Arduino Digital 5
#include <DS1307.h>
// Init the DS1307
DS1307 rtc(3, 2);
// Init a Time-data structure
Time time;
unsigned long currentTime;
unsigned long loopTime;
byte key = 0;
byte prev_key = 0;
byte idle_key = 0;
//const int max_idle_key = 100; //цыклов не активности перед скринсейвером
#define max_idle_key 100 //цыклов не активности перед скринсейвером
int cur_menu = 0;
int cur_item = 0;
boolean cur_item_edit = false;
byte aquaT; // Требуемая температура воды
boolean CoolingEnabled; // Разрешено ли охлаждение куллером
boolean light1 = false;
boolean light2 = false;
boolean air = false;
boolean CO2 = false;
byte kormMin = 0; // Остаток времени для кормления мин
byte minCool = 0; // минимальные обороты кулера для вентиляции крышки и охлаждения ламп
byte maxCool = 0; // максимальные обороты для охлаждения воды
void setup()
{
pinMode(EXT_HEATER_PIN, OUTPUT); // устанавливает режим работы - выход
digitalWrite(EXT_HEATER_PIN, LOW); // выключает
pinMode(EXT_COOLING_PIN, OUTPUT); // устанавливает режим работы - выход
digitalWrite(EXT_COOLING_PIN, LOW); // выключает
pinMode(EXT_LIGHT_1_PIN, OUTPUT); // устанавливает режим работы - выход
digitalWrite(EXT_LIGHT_1_PIN, HIGH); // выключает
light1 = true;
pinMode(EXT_LIGHT_2_PIN, OUTPUT); // устанавливает режим работы - выход
digitalWrite(EXT_LIGHT_2_PIN, LOW); // выключает
light2 = false;
pinMode(EXT_FILTER_PIN, OUTPUT); // устанавливает режим работы - выход
digitalWrite(EXT_FILTER_PIN, HIGH); // выключает
pinMode(EXT_CO2_PIN, OUTPUT); // устанавливает режим работы - выход
digitalWrite(EXT_CO2_PIN, LOW); // выключает
CO2 = false;
pinMode(EXT_AIR_PIN, OUTPUT); // устанавливает режим работы - выход
digitalWrite(EXT_AIR_PIN, HIGH); // выключает
air = true;
CoolingEnabled = false; // Разрешено ли охлаждение куллером
pinMode(EXT_POWER_ON_PIN, OUTPUT); // устанавливает режим работы - выход
digitalWrite(EXT_POWER_ON_PIN, LOW); // выключает
pinMode(EXT_LIGHT_LED_PIN, OUTPUT); // устанавливает режим работы - выход
digitalWrite(EXT_LIGHT_LED_PIN, LOW); // выключает
pinMode(EXT_UDO_MICRO_PIN, OUTPUT); // устанавливает режим работы - выход
digitalWrite(EXT_UDO_MICRO_PIN, LOW); // выключает
pinMode(EXT_UDO_MACRO_PIN, OUTPUT); // устанавливает режим работы - выход
digitalWrite(EXT_UDO_MACRO_PIN, LOW); // выключает
pinMode(EXT_UDO_Fe_PIN, OUTPUT); // устанавливает режим работы - выход
digitalWrite(EXT_UDO_Fe_PIN, LOW); // выключает
pinMode(Light_Coll_Whi, OUTPUT);
pinMode(Light_Warm_Whi, OUTPUT);
//включит pullup резистор для входа:
// pinMode(Key_PIN, INPUT);
// Init EEPROM
// for(int e = 0; e < 2047; e++) EEPROM.write(e,0);
// EEPROM.write(0,61); // ledContrast !!!!!!! Очень акуратно иначе белый либо черный экран
// EEPROM.write(1,200); // ledLight
// EEPROM.write(2,24); // Требуемая температура воды
// EEPROM.write(3,1); // Разрешено ли охлаждение куллером
ledContrast = EEPROM.read(0);
// первичная установка контраста - иначе при первом запуске нихрена невидно
if ((ledContrast==0)||(ledContrast==255)){
ledContrast = 65;
}
ledLight = EEPROM.read(1);
myGLCD.InitLCD(ledContrast);
pinMode(LED_LIGHT_PIN, OUTPUT); // устанавливает режим работы - выход
analogWrite(LED_LIGHT_PIN,ledLight);
aquaT = EEPROM.read(2); // Требуемая температура воды
minCool = EEPROM.read(3); // минимальные обороты кулера для вентиляции крышки и охлаждения ламп
maxCool = EEPROM.read(4); // максимальные обороты для охлаждения воды
// Set the clock to run-mode
rtc.halt(false);
// rtc.setDOW(SUNDAY); // Set Day-of-Week to SUNDAY
// rtc.setTime(12, 0, 0); // Set the time to 12:00:00 (24hr format)
// rtc.setDate(3, 10, 2010); // Set the date to October 3th, 2010
myGLCD.setFont(SmallFont);
myGLCD.clrScr();
myGLCD.update();
/*
myGLCD.setFont(SmallFont);
myGLCD.clrScr();
myGLCD.print("AQUA kontrolx", CENTER, 3);
myGLCD.print("MIHS", CENTER, 20);
myGLCD.drawRect(28, 18, 56, 28);
for (int i=0; i<6; i++)
{
myGLCD.drawLine(57, 18+(i*2), 83-(i*3), 18+(i*2));
myGLCD.drawLine((i*3), 28-(i*2), 28, 28-(i*2));
}
// myGLCD.setFont(TinyFont);
myGLCD.print(" - 2016 - ", CENTER, 36);
// myGLCD.print("AlexVOK@gmail.com", CENTER, 42);
myGLCD.update();
delay(1000);
*/
//-------------------------------------------------------------------------------
byte b = 0;
while ( (!temp.search(temp_addr))&&(b < 10)) {
//Serial.println("Нет больше адресов.");
temp.reset_search();
delay(250);
b++;
}
// if (OneWire::crc8(temp_addr, 7) != temp_addr[7]) {
// Serial.println("CRC не является действительным!");
// }
// Первый байт ROM указывает, какой чип
switch (temp_addr[0]) {
case 0x10:
// Serial.println(" Chip = DS18S20");
temp_type_s = 1;
break;
case 0x28:
// Serial.println(" Chip = DS18B20");
temp_type_s = 0;
break;
case 0x22:
// Serial.println(" Chip = DS1822");
temp_type_s = 0;
break;
// default:
// Serial.println("Устройство не распознано");
}
currentTime = millis();
loopTime = currentTime;
}
//-----------------------------------------------------------------------------------
float getTemp(){
// temp.reset();
// temp.select(temp_addr);
// temp.write(0x44, 1); // start conversion, with parasite power on at the end
// delay(1000); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.
temp.reset();
temp.select(temp_addr);
temp.write(0xBE); // Read Scratchpad
for (byte i = 0; i < 9; i++) { // we need 9 bytes
temp_data[i] = temp.read();
}
// Serial.print(OneWire::crc8(data, 8), HEX);
// Convert the data to actual temperature
// because the result is a 16 bit signed integer, it should
// be stored to an "int16_t" type, which is always 16 bits
// even when compiled on a 32 bit processor.
int16_t raw = (temp_data[1] << 8) | temp_data[0];
if (temp_type_s) {
raw = raw << 3; // 9 bit resolution default
if (temp_data[7] == 0x10) {
// "count remain" gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - temp_data[6];
}
} else {
byte cfg = (temp_data[4] & 0x60);
// at lower res, the low bits are undefined, so let's zero them
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
//// default is 12 bit resolution, 750 ms conversion time
}
return ((float)raw / 16.0);
}
//-----------------------------------------------------------------------------------
// Нажатые кнопки
//int button;
const byte BUTTON_NONE = 0;
const byte BUTTON_UP = 1;
const byte BUTTON_DOWN = 2;
const byte BUTTON_OK = 3;
const byte BUTTON_CANCEL = 4;
int getPressedButton()
{
byte KeyNum=0;
int KeyValue1=0;
int KeyValue2=0;
//Читаем в цикле аналоговый вход, для подавления дребезга и нестабильности читаем по два раза подряд, пока значения не будут равны.
//Если значения равны 1023 – значит не была нажата ни одна клавиша.
do {
// считываем значения с аналогового входа(A0)
KeyValue1=analogRead(Key_PIN);
delay(10);
KeyValue2=analogRead(Key_PIN);
delay(5);
} while (KeyValue1!=KeyValue2);
//Интерпретируем полученное значение и определяем код нажатой клавиши
if (KeyValue2 > 900)
{KeyNum = BUTTON_NONE;}
else if (KeyValue2 > 450)
{KeyNum = BUTTON_CANCEL;}
else if (KeyValue2 > 250)
{KeyNum = BUTTON_UP;}
else if (KeyValue2 > 100)
{KeyNum = BUTTON_DOWN;}
else {KeyNum = BUTTON_OK;}
//Возвращаем код нажатой клавиши
return KeyNum;
}
//-----------------------------------------------------------------------------------
void naviKey(byte maxItems){
if(key == BUTTON_UP){
cur_item--;
if(cur_item < 1)
cur_item = maxItems;
}
if(key == BUTTON_DOWN){
cur_item++;
if(cur_item > maxItems)
cur_item = 1;
}
}
//-----------------------------------------------------------------------------------
void drawMenu(String mName, String item1, String item2, String item3, String item4){
myGLCD.setFont(SmallFont);
myGLCD.clrScr();
myGLCD.print(mName,1,0);
myGLCD.print(rtc.getTimeStr(FORMAT_SHORT),RIGHT,0);
myGLCD.drawLine(0,8,83,8);
myGLCD.drawLine(0,9,83,9);
if(cur_item == 1){
myGLCD.print(item1,3,12);
myGLCD.drawRoundRect(0,11,83,20);
}else
myGLCD.print(item1,0,12);
if(cur_item == 2){
myGLCD.print(item2,3,21);
myGLCD.drawRoundRect(0,20,83,29);
}else
myGLCD.print(item2,0,21);
if(cur_item == 3){
myGLCD.print(item3,3,30);
myGLCD.drawRoundRect(0,29,83,38);
}else
myGLCD.print(item3,0,30);
if(cur_item == 4){
myGLCD.print(item4,3,39);
myGLCD.drawRoundRect(0,38,83,47);
}else
myGLCD.print(item4,0,39);
myGLCD.update();
}
byte menu_hh;
byte menu_mi;
byte menu_dd;
byte menu_mm;
int menu_yyyy;
byte menu_dow;
byte menu_off;
byte menu_item_count;
int alertAdr;
byte curLoad;
byte prMin = 0;
//-----------------------------------------------------------------------------------
void drawIntMenu(String mName, int minVal, int maxVal, int Val){
myGLCD.setFont(SmallFont);
myGLCD.clrScr();
myGLCD.print(mName,1,0);
// myGLCD.print(rtc.getTimeStr(FORMAT_SHORT),RIGHT,0);
myGLCD.drawLine(0,8,83,8);
myGLCD.drawLine(0,9,83,9);
myGLCD.setFont(BigNumbers);
myGLCD.printNumI(Val,CENTER,11);
myGLCD.drawRoundRect(0,38,83,47);
int k = 80*(Val-minVal)/(maxVal - minVal);
for(int i = 2; i < k+2; i++)
myGLCD.drawLine(i,40,i,46);
myGLCD.update();
}
boolean new_hour = true;
byte secc = 0;
byte LED_sunrise = 0;
byte LED_cur_pos = 0;
byte udo_tim = 0;
byte bt;
//*****************************************************************************************
//*****************************************************************************************
void loop() {
currentTime = millis();
key = getPressedButton();
if((currentTime >= (loopTime + 250))||(key != prev_key)){ // проверяем каждые 5мс (20 Гц)
if((prev_key != key)&&(key != 0)){
idle_key = 0;
}else{
idle_key++;
}
prev_key = key;
if (key == 0) // Измереяем температуру только в состоянии простоя
{
if(temp_cicle == 0){
temp.reset();
temp.select(temp_addr);
temp.write(0x44, 1); // start conversion, with parasite power on at the end
}
if(temp_cicle == 4){
cur_temp = getTemp();
// Управление нагревом и охлаждением ----------------------------------------------
if(cur_temp < (float)aquaT){
digitalWrite(EXT_HEATER_PIN, HIGH); // включает нагреватель
}else
digitalWrite(EXT_HEATER_PIN, LOW); // выключает нагреватель
if (CoolingEnabled) {
if(cur_temp > ((float)aquaT+0.1)){ // Разрешено ли охлаждение куллером
int coll_cur = minCool+(((float)(maxCool - minCool))/100)*(((float)(cur_temp-aquaT))/0.5)*100;
if (coll_cur > maxCool) { coll_cur = maxCool;}
analogWrite(EXT_COOLING_PIN, coll_cur); // включает куллер
}else{
analogWrite(EXT_COOLING_PIN, minCool); // включаем режим проветривания
}
}else{
if (air||light1){
// if (air||light1||light2){
analogWrite(EXT_COOLING_PIN, minCool); // включаем режим проветривания
}else{
digitalWrite(EXT_COOLING_PIN, LOW); // выключает куллер
}
}
}
if(temp_cicle > 51){
temp_cicle = 0;
}else{
temp_cicle++;
}
}
// --------------------------------------------------------------------------------
if(secc > 4){
secc = 0;
}else{
secc++;
}
// Get data from the DS1307
time = rtc.getTime();
// коррекция хода системных часов [Сек]
if (time.min == 0){
new_hour = true;
}
if ((time.min == 30)&&(new_hour)){
int corr_sec = time.sec + CorrTime; // коррекция хода системных часов [Сек]
byte corr_min = time.min;
if (corr_sec < 0){
corr_sec = corr_sec + 60;
corr_min--;
}
if (corr_sec > 59){
corr_sec = corr_sec - 60;
corr_min++;
}
rtc.setTime(time.hour, corr_min, corr_sec); // Set the time to 12:00:00 (24hr format)
new_hour = false;
}
//-----
// Новая минута ----------------------------------------------
if(prMin != time.min){
prMin = time.min;
// Время для кормления мин
if(kormMin > 0){
digitalWrite(EXT_FILTER_PIN, LOW); // выключает Фильтр
kormMin--;
}else{
digitalWrite(EXT_FILTER_PIN, HIGH); // включает Фильтр
}
// Восход / Закат
if (LED_sunrise > 0){
byte led_val = (LED_sunrise&B01111111);
byte led_tmp = 0;
boolean is_sunrise = LED_sunrise&B10000000;
if (LED_cur_pos >= led_val){
led_tmp = 255;
LED_sunrise = 0;
}else{
led_tmp = LED_cur_pos*255/led_val;
}
if(!is_sunrise){ // Закат
led_tmp = 255 - led_tmp;
}
// Управляем блоком питания
if (led_tmp == 0){
digitalWrite(EXT_POWER_ON_PIN, LOW);
}else{
digitalWrite(EXT_POWER_ON_PIN, HIGH);
}
analogWrite(EXT_LIGHT_LED_PIN, led_tmp); // LED
LED_cur_pos++;
}
//-------ALARM-------------------------------------------------------------------------
for(int a = 100; a < 1001; a = a + 4){
byte b1 = EEPROM.read(a);
// if(((boolean)(b1&B10000000))&((boolean)(_BV(time.dow-1)&b1))){ // активная запись и день недели
if(b1&B10000000){
if((1<<(time.dow-1))&b1){ // активная запись и день недели
byte b2 = EEPROM.read(a+1);
if(time.hour == (byte)(b2&B00011111)){ // сравниваем часы
byte b3 = EEPROM.read(a+2);
if(time.min == (byte)(b3&B00111111)){ // сравниваем минути
byte b4 = EEPROM.read(a+3);
switch((byte)((b2>>5)&B00000111)){ // определяем нагрузку
case 0:
// Разрешено ли охлаждение куллером
if (b4&B00000001){
CoolingEnabled = true;
analogWrite(EXT_COOLING_PIN, minCool); // включаем режим проветривания
}else{
CoolingEnabled = false;
digitalWrite(EXT_COOLING_PIN, LOW);
}
break;
case 1: // Light1
if (b4&B00000001){
digitalWrite(EXT_LIGHT_1_PIN, HIGH);
light1 = true;
}else{
digitalWrite(EXT_LIGHT_1_PIN, LOW);
light1 = false;
}
break;
case 2: // Light2
if (b4&B00000001){
digitalWrite(EXT_LIGHT_2_PIN, HIGH);
light2 = true;
}else{
digitalWrite(EXT_LIGHT_2_PIN, LOW);
light2 = false;
}
break;
case 3: // Air
if (b4&B00000001){
digitalWrite(EXT_AIR_PIN, HIGH);
air = true;
}else{
digitalWrite(EXT_AIR_PIN, LOW);
air = false;
}
break;
case 4: // CO2
if (b4&B00000001){
digitalWrite(EXT_CO2_PIN, HIGH);
CO2 = true;
}else{
digitalWrite(EXT_CO2_PIN, LOW);
CO2 = false;
}
break;
case 5: //LED
// 8 бит 1 восход 0 закат остальные кол мин
LED_sunrise = b4;
LED_cur_pos = 0;
break;
case 6: // UDO
udo_tim = (byte)(b4&B00111111);
digitalWrite(EXT_POWER_ON_PIN, HIGH);
delay(100); //Время на выход в режим БП
switch((byte)((b4>>6)&B00000011)){
case 0:
digitalWrite(EXT_UDO_MICRO_PIN, HIGH);
delay(udo_tim*4.2);
digitalWrite(EXT_UDO_MICRO_PIN, LOW);
break;
case 1:
digitalWrite(EXT_UDO_MACRO_PIN, HIGH);
delay(udo_tim*4.2);
digitalWrite(EXT_UDO_MACRO_PIN, LOW);
break;
case 2:
digitalWrite(EXT_UDO_Fe_PIN, HIGH);
delay(udo_tim*4.2);
digitalWrite(EXT_UDO_Fe_PIN, LOW);
break;
case 3:
break;
}
digitalWrite(EXT_POWER_ON_PIN, LOW);
break;
case 7:
break;
}
}
}
}
}
}
}
//------------------------------------------------------------------------------------
if((idle_key > max_idle_key)&&(cur_menu != 0)){
cur_menu = 0;
cur_item = 0;
cur_item_edit = false;
}
switch(cur_menu){
case 0: // Time
{
analogWrite(LED_LIGHT_PIN,DispLight_min);
myGLCD.setFont(BigNumbers);
myGLCD.clrScr();
myGLCD.printNumI(time.hour,7,2,2,'0');
myGLCD.drawCircle(42,9,3);
myGLCD.drawCircle(42,19,3);
if(secc < 2){
myGLCD.drawCircle(42,9,2);
myGLCD.drawCircle(42,19,2);
myGLCD.drawRect(41,8,43,10);
myGLCD.drawRect(41,18,43,20);
myGLCD.setPixel(42,9);
myGLCD.setPixel(42,19);
}
myGLCD.printNumI(time.min,49,2,2,'0');
myGLCD.setFont(SmallFont);
if(cur_temp < 1){
myGLCD.print(" net dat`ika",3,38);
}else{
myGLCD.print("T:",3,38);
myGLCD.printNumF(cur_temp,2,15,38);
}
myGLCD.update();
if(key > 0)
cur_menu = 1;
cur_item = 0;
cur_item_edit = false;
// Включаем подсветку LED
// analogWrite(LED_LIGHT_PIN,ledLight);
break;
}
case 1: // men/ -----------------------------------------------------------------
{
analogWrite(LED_LIGHT_PIN,ledLight);
String ll;
if(light1||light2){
ll = "wkl";
}else
ll ="otkl";
String aa;
if(air){
aa = "wkl";
}else
aa ="otkl";
if(cur_item_edit&&(cur_item == 1))
ll = "["+ll+"]";
if(cur_item_edit&&(cur_item == 2))
aa = "["+aa+"]";
String lk = "";
if(kormMin > 0){
lk = " ("+(String)kormMin+")";
}
drawMenu("men/","swet "+ll,"wozduh "+aa,"Kormlenie"+lk,"nastrojki");
naviKey(4);
switch(key){
case BUTTON_OK:
switch(cur_item){
case 1:
light1 = !light1;
light2 = light1;
if(light1){
digitalWrite(EXT_LIGHT_1_PIN, HIGH); // включает LED
}else
digitalWrite(EXT_LIGHT_1_PIN, LOW); // выключает LED
if(light2){
digitalWrite(EXT_LIGHT_2_PIN, HIGH); // включает lightTUBE
}else
digitalWrite(EXT_LIGHT_2_PIN, LOW); // выключает lightTUBE
break;
case 2:
air = !air;
if(air){
digitalWrite(EXT_AIR_PIN, HIGH); // включает
}else
digitalWrite(EXT_AIR_PIN, LOW); // выключает
break;
case 3:
kormMin = 20;
digitalWrite(EXT_FILTER_PIN, LOW); // выключает Фильтр
break;
case 4:
cur_menu = 13;
cur_item = 0;
break;
}
break;
case BUTTON_CANCEL:
cur_item_edit = false;
cur_menu = 0;
cur_item = 0;
break;
}
break;
}
case 13: // nastrojki -----------------------------------------------------------------
{
drawMenu("nastrojki", "sistema","Termostat","zada`a","udo");
naviKey(4);
switch(key){
case BUTTON_OK:
switch(cur_item){
case 1:
cur_menu = 131;
cur_item = 0;
break;
case 2:
cur_menu = 132;
cur_item = 0;
break;
case 3:
cur_menu = 130;
cur_item = 1;
break;
case 4:
cur_menu = 134;
cur_item = 0;
break;
}
break;
case BUTTON_CANCEL:
cur_menu = 1;
cur_item = 3;
break;
}
break;
}
case 134: // udo -----------------------------------------------------------------
{ String uu;
if (CO2){
uu = "wkl";
}else{
uu = "Otkl";
}
drawMenu("udo", "CO2", "udo","CO2 "+uu,"");
naviKey(3);
switch(key){
case BUTTON_OK:
switch(cur_item){
case 1:
cur_menu = 133;
cur_item = 1;
menu_off = 1;
menu_item_count = 25;
curLoad = 4;
break;
case 2:
cur_menu = 133;
cur_item = 1;
menu_off = 1;
menu_item_count = 25;
curLoad = 6;
break;
case 3:
CO2 = !CO2;
if (CO2){
digitalWrite(EXT_CO2_PIN, HIGH);
}else{
digitalWrite(EXT_CO2_PIN, LOW);
}
break;
case 4:
// cur_menu = 130;
// cur_item = 1;
break;
}
break;
case BUTTON_CANCEL:
cur_menu = 13;
cur_item = 4;
break;
}
break;
}
case 130: // zada`a -----------------------------------------------------------------
{
drawMenu("zada`a","swet 1","swet 2","swet LED ","wozduh");
naviKey(4);
switch(key){
case BUTTON_OK:
switch(cur_item){
case 1:
cur_menu = 133;
cur_item = 1;
menu_off = 1;
menu_item_count = 25;
curLoad = 1;
break;
case 2:
cur_menu = 133;
cur_item = 1;
menu_off = 1;
menu_item_count = 25;
curLoad = 2;
break;
case 3:
cur_menu = 133;
cur_item = 1;
menu_off = 1;
menu_item_count = 25;
curLoad = 5;
break;
case 4:
cur_menu = 133;
cur_item = 1;
menu_off = 1;
menu_item_count = 25;
curLoad = 3;
break;
}
break;
case BUTTON_CANCEL:
cur_menu = 13;
cur_item = 3;
break;
}
break;
}
case 133: // zada`a Menu List -----------------------------------------------------------------
{
myGLCD.setFont(SmallFont);
myGLCD.clrScr();
int offf;
switch(curLoad){
case 0:
myGLCD.print("nastroika",1,0);
offf = 400;
break;
case 1:
myGLCD.print("swet 1",1,0);
offf = 100;
break;
case 2:
myGLCD.print("swet 2",1,0);
offf = 200;
break;
case 3:
myGLCD.print("wozduh",1,0);
offf = 300;
break;
case 4:
myGLCD.print("CO2",1,0);
offf = 500;
break;
case 5:
myGLCD.print("LED",1,0);
offf = 600;
break;
case 6:
myGLCD.print("udo",1,0);
offf = 700;
break;
}
myGLCD.print(rtc.getTimeStr(FORMAT_SHORT),RIGHT,0);
myGLCD.drawLine(0,8,83,8);
myGLCD.drawLine(0,9,83,9);
String tt;
byte vy;
for(byte j = menu_off; j <= min(menu_off+3,menu_item_count); j++){
vy = 3+9*(j-menu_off+1);
alertAdr = offf+(j-1)*4;
bt = EEPROM.read(alertAdr+1)&B00011111;
tt = (String)(j) + " ";
if(bt < 10){
tt = tt + "0";
}
tt = tt + (String)bt + ":";
bt = EEPROM.read(alertAdr+2)&B00111111;
if(bt < 10){
tt = tt + "0";
}
tt = tt + (String)bt + " ";
byte bt = EEPROM.read(alertAdr+3);
switch(curLoad){
case 5: // "TimerLED"
if (bt&B10000000){
tt = tt + "wkl";
}else{
tt = tt + "otkl";
}
break;
case 6: // "TimerUDO"
switch((byte)((bt>>6)&B00000011)){
case 0: // Micro
tt = tt + "Micro";
break;
case 1: // Macro
tt = tt + "Macro";
break;
case 2: // Fe+
tt = tt + "Fe+";
break;
case 3: // Ka
tt = tt + "Ka";
break;
}
break;
default:
if(bt > 0){
tt = tt + "wkl";
}else{
tt = tt + "Otkl";
}
break;
}
// tt = "Time "+(String)(j);
// if(EEPROM.read(offf+(j-1)*4)&B10000000){
// tt = tt+" Active";
// }
if(cur_item == j){
myGLCD.print(tt,3,vy);
myGLCD.drawRoundRect(0,vy-1,83,vy+8);
}else
myGLCD.print(tt,0,vy);
// перечеркиваем не активные таймера
if(!(EEPROM.read(offf+(j-1)*4)&B10000000)){
myGLCD.drawLine(0,vy+5,83,vy+5);
}
}
switch(key){
case BUTTON_UP:
if(cur_item == 1){
cur_item = menu_item_count;
menu_off = menu_item_count - 3;
}else{
cur_item--;
if(cur_item < menu_off){
menu_off = cur_item;
}
}
break;
case BUTTON_DOWN:
if(cur_item == menu_item_count){
cur_item = 1;
menu_off = 1;
}else{
cur_item++;
if(cur_item > menu_off+3){
menu_off = cur_item-3;
}
}
break;
case BUTTON_OK:
alertAdr = offf+(cur_item-1)*4;
cur_menu = 1330;
cur_item = 1;
cur_item_edit = false;
break;
case BUTTON_CANCEL:
switch(curLoad){
case 0:
//"CoolTime"
cur_menu = 132;
cur_item = 2;
break;
case 1:
//"Light1",
cur_menu = 130;
cur_item = 1;
break;
case 2:
//"Light2"
cur_menu = 130;
cur_item = 2;
break;
case 3:
//"Air"
cur_menu = 130;
cur_item = 4;
break;
case 4:
//"CO2"
cur_menu = 134;
cur_item = 1;
break;
case 5:
//"LED"
cur_menu = 130;
cur_item = 3;
break;
case 6:
//"UDO"
cur_menu = 134;
cur_item = 2;
break;
}
cur_item_edit = false;
break;
}
myGLCD.update();
break;
}
case 1330: // zada`a Menu -----------------------------------------------------------------
{
myGLCD.setFont(SmallFont);
myGLCD.clrScr();
switch(curLoad){
case 0:
myGLCD.print("nastroika",1,0);
break;
case 1:
myGLCD.print("swet1",1,0);
break;
case 2:
myGLCD.print("swet2",1,0);
break;
case 3:
myGLCD.print("wozduh",1,0);
break;
case 4:
myGLCD.print("CO2",1,0);
break;
case 5:
myGLCD.print("LED",1,0);
break;
case 6:
myGLCD.print("udo",1,0);
break;
}
myGLCD.print(rtc.getTimeStr(FORMAT_SHORT),RIGHT,0);
myGLCD.drawLine(0,8,83,8);
myGLCD.drawLine(0,9,83,9);
byte b1 = EEPROM.read(alertAdr);
bt = b1;
myGLCD.print("pnwtsr`tptsbws",0,11);
for(int j = 1; j < 8; j++){
// if((cur_item == j)&cur_item_edit){
if(cur_item == j){
myGLCD.drawRect(j*12-10,20,j*12-2,28);
}
myGLCD.drawCircle(j*12-6,24,3);
if(bt&B00000001){
myGLCD.drawCircle(j*12-6,24,2);
myGLCD.drawCircle(j*12-6,24,1);
}
bt = bt >> 1;
}
String stat = "";
if(cur_item == 8){
stat = stat + "[";
}
if(EEPROM.read(alertAdr)&B10000000){
stat = stat + "aktiw";
}else
stat = stat + "ne aktiw";
if(cur_item == 8){
stat = stat + "]";
}
stat = stat + ".";
if(cur_item == 9){
stat = stat + "[";
}
byte tmpb = EEPROM.read(alertAdr+3);
switch(curLoad){
case 5: // "TimerLED"
if (tmpb&B10000000){
stat = stat + "wkl";
}else{
stat = stat + "Otkl";
}
stat = stat + " " + (tmpb&B01111111)+"min";
break;
case 6: // "TimerUDO"
switch((byte)((tmpb>>6)&B00000011)){
case 0: // Micro
stat = stat + "Micro";
break;
case 1: // Macro
stat = stat + "Macro";
break;
case 2: // Fe+
stat = stat + "Fe+";
break;
case 3: // Ka
stat = stat + "Ka";
break;
}
stat = stat + (tmpb&B00111111)+"mil";
break;
default:
if(tmpb > 0){
stat = stat + "wkl";
}else{
stat = stat + "Otkl";
}
break;
}
if(cur_item == 9){
stat = stat + "]";
}
myGLCD.print(stat,0,29);
stat = "wremq: ";
if(cur_item == 10){
stat = stat + "[";
}
bt = EEPROM.read(alertAdr+1)&B00011111;
if(bt < 10){
stat = stat + "0";
}
stat = stat + (String)bt;
if(cur_item == 10){
stat = stat + "]";
}
stat = stat + ":";
if(cur_item == 11){
stat = stat + "[";
}
bt = EEPROM.read(alertAdr+2)&B00111111;
if(bt < 10){
stat = stat + "0";
}
stat = stat + (String)bt;
if(cur_item == 11){
stat = stat + "]";
}
myGLCD.print(stat,0,39);
switch(key){
case BUTTON_UP:
if(cur_item_edit){
if((cur_item == 9)&&(curLoad > 4)){
bt = EEPROM.read(alertAdr+3);
//if(bt == 255){
// bt = 0;
//}else
bt++;
EEPROM.write(alertAdr+3,bt);
}
if(cur_item == 10){
bt = (EEPROM.read(alertAdr+1)&B00011111);
if(bt == 23){
bt = 0;
}else
bt++;
EEPROM.write(alertAdr+1,bt^(curLoad<<5));
}
if(cur_item == 11){
bt = EEPROM.read(alertAdr+2)&B00111111;
if(bt == 59){
bt = 0;
}else
bt++;
EEPROM.write(alertAdr+2,bt);
}
}else
if(cur_item == 1){
cur_item = 11;
}else
cur_item--;
break;
case BUTTON_DOWN:
if(cur_item_edit){
if((cur_item == 9)&&(curLoad > 4)){
bt = EEPROM.read(alertAdr+3);
//if(bt == 0){
// bt = 255;
//}else
bt--;
EEPROM.write(alertAdr+3,bt);
}
if(cur_item == 10){
bt = EEPROM.read(alertAdr+1)&B00011111;
if(bt == 0){
bt = 23;
}else
bt--;
EEPROM.write(alertAdr+1,bt^(curLoad<<5));
}
if(cur_item == 11){
bt = EEPROM.read(alertAdr+2)&B00111111;
if(bt == 0){
bt = 59;
}else
bt--;
EEPROM.write(alertAdr+2,bt);
}
}else
if(cur_item == 11){
cur_item = 1;
}else
cur_item++;
break;
case BUTTON_OK:
EEPROM.write(alertAdr+1,((EEPROM.read(alertAdr+1)&B00011111)^(curLoad<<5))); // сохраняем номер нагрузки
switch(cur_item){
case 8:
EEPROM.write(alertAdr,(EEPROM.read(alertAdr)^B10000000));
break;
case 9:
if(curLoad < 5){
//EEPROM.write(alertAdr+3,(EEPROM.read(alertAdr+3)^B00000001));
EEPROM.write(alertAdr+3,((EEPROM.read(alertAdr+3)&B00000001)^B00000001));
}else{
cur_item_edit = !cur_item_edit;
}
break;
case 10:
cur_item_edit = !cur_item_edit;
break;
case 11:
cur_item_edit = !cur_item_edit;
break;
default:
EEPROM.write(alertAdr,(EEPROM.read(alertAdr)^(1<<(cur_item-1))));
break;
}
break;
case BUTTON_CANCEL:
switch(curLoad){
case 0:
//CoolTime
cur_menu = 132;
cur_item = 2;
break;
case 1:
//"Light1",
cur_menu = 130;
cur_item = 1;
break;
case 2:
//"Light2"
cur_menu = 130;
cur_item = 2;
break;
case 3:
//"Air"
cur_menu = 130;
cur_item = 4;
break;
case 4:
//"CO2"
cur_menu = 134;
cur_item = 1;
break;
case 5:
//"LED"
cur_menu = 130;
cur_item = 3;
break;
case 6:
//"UDO"
cur_menu = 134;
cur_item = 2;
break;
}
cur_item_edit = false;
break;
}
myGLCD.update();
break;
}
case 132: // Termostat -----------------------------------------------------------------
{
drawMenu("Termostat", "temp.woda["+(String)aquaT+"]","went.wremq","min.skor","maks.skor");
naviKey(4);
switch(key){
case BUTTON_OK:
switch(cur_item){
case 1:
cur_menu = 1321;
cur_item = 0;
break;
case 2: //CoolTime
cur_menu = 133;
cur_item = 1;
menu_off = 1;
menu_item_count = 8;
curLoad = 0;
break;
case 3: //minCool // минимальные обороты кулера для вентиляции крышки и охлаждения ламп
cur_menu = 1323;
break;
case 4: //maxCool // максимальные обороты для охлаждения воды
cur_menu = 1324;
break;
}
break;
case BUTTON_CANCEL:
cur_menu = 13;
cur_item = 2;
cur_item_edit = false;
break;
}
break;
}
case 1321: // Aqua Temperature -----------------------------------------------------------------
{
drawIntMenu("maks.temp.woda",18,35,aquaT);
switch(key){
case BUTTON_UP:
aquaT++;
aquaT = min(aquaT, 35);
break;
case BUTTON_DOWN:
aquaT--;
aquaT = max(aquaT, 18);
break;
case BUTTON_OK:
EEPROM.write(2,aquaT); // Требуемая температура воды
cur_menu = 132;
cur_item = 1;
break;
case BUTTON_CANCEL:
aquaT = EEPROM.read(2); // Требуемая температура воды
cur_menu = 132;
cur_item = 1;
break;
}
break;
}
case 1323: // min.skor // минимальные обороты кулера для вентиляции крышки и охлаждения ламп ------------------------------------------
{
drawIntMenu("min.skor",0,maxCool,minCool);
switch(key){
case BUTTON_UP:
minCool++;
minCool = min(minCool, maxCool);
analogWrite(EXT_COOLING_PIN, minCool);
break;
case BUTTON_DOWN:
minCool--;
minCool = max(minCool, 0);
analogWrite(EXT_COOLING_PIN, minCool);
break;
case BUTTON_OK:
EEPROM.write(3,minCool); // минимальные обороты кулера для вентиляции крышки и охлаждения ламп
cur_menu = 132;
cur_item = 3;
break;
case BUTTON_CANCEL:
minCool = EEPROM.read(3); // минимальные обороты кулера для вентиляции крышки и охлаждения ламп
cur_menu = 132;
cur_item = 3;
break;
}
break;
}
case 1324: // maks.skor // максимальные обороты для охлаждения воды ------------------------------------------
{
drawIntMenu("maks.skor",0,255,maxCool);
switch(key){
case BUTTON_UP:
maxCool++;
maxCool = min(maxCool, 255);
analogWrite(EXT_COOLING_PIN, maxCool);
break;
case BUTTON_DOWN:
maxCool--;
maxCool = max(maxCool, minCool);
analogWrite(EXT_COOLING_PIN, maxCool);
break;
case BUTTON_OK:
EEPROM.write(4,maxCool); // максимальные обороты для охлаждения воды
cur_menu = 132;
cur_item = 4;
break;
case BUTTON_CANCEL:
maxCool = EEPROM.read(4); // максимальные обороты для охлаждения воды
cur_menu = 132;
cur_item = 4;
break;
}
break;
}
case 131: // nastroika sistema -----------------------------------------------------------------
{
drawMenu("sistema", "wremq","data","disp kontrast","displ qrkostx");
naviKey(4);
switch(key){
case BUTTON_OK:
switch(cur_item){
case 1:
cur_menu = 1311;
cur_item = 0;
menu_hh = time.hour;
menu_mi = time.min;
break;
case 2:
cur_menu = 1312;
cur_item = 0;
menu_dd = time.date;
menu_mm = time.mon;
menu_yyyy = time.year;
menu_dow = time.dow;
break;
case 3:
cur_menu = 1313;
cur_item = 0;
break;
case 4:
cur_menu = 1314;
cur_item = 0;
break;
}
break;
case BUTTON_CANCEL:
cur_menu = 0;
cur_item = 0;
break;
}
break;
}
case 1311: // Time -----------------------------------------------------------------
{
myGLCD.setFont(SmallFont);
myGLCD.clrScr();
myGLCD.print("wremq",1,0);
myGLCD.print(rtc.getTimeStr(FORMAT_SHORT),RIGHT,0);
myGLCD.drawLine(0,8,83,8);
myGLCD.drawLine(0,9,83,9);
if((cur_item == 1)&&cur_item_edit)
myGLCD.invertText(true);
myGLCD.printNumI(menu_hh,26,20,2,'0');
myGLCD.invertText(false);
myGLCD.print(":",39,20);
if((cur_item == 2)&&cur_item_edit)
myGLCD.invertText(true);
myGLCD.printNumI(menu_mi,46,20,2,'0');
myGLCD.invertText(false);
if(cur_item == 1)
myGLCD.drawRoundRect(25,18,39,28);
if(cur_item == 2)
myGLCD.drawRoundRect(45,18,59,28);
switch(key){
case BUTTON_UP:
if(!cur_item_edit){
cur_item--;
if(cur_item < 1)
cur_item = 2;
}else{
if(cur_item == 1){
menu_hh++;
if(menu_hh == 24)
menu_hh = 0;
}
if(cur_item == 2){
menu_mi++;
if(menu_mi == 60)
menu_mi = 0;
}
}
break;
case BUTTON_DOWN:
if(!cur_item_edit){
cur_item++;
if(cur_item > 2)
cur_item = 1;
}else{
if(cur_item == 1){
if(menu_hh == 0)
menu_hh = 23;
else
menu_hh--;
}
if(cur_item == 2){
if(menu_mi == 0)
menu_mi = 59;
else
menu_mi--;
}
}
break;
case BUTTON_OK:
if(cur_item_edit){
switch(cur_item){
case 1:
rtc.setTime(menu_hh, time.min, 0); // Set the time to 12:00:00 (24hr format)
break;
case 2:
rtc.setTime(time.hour, menu_mi, 0); // Set the time to 12:00:00 (24hr format)
break;
}
cur_item_edit = false;
}else
cur_item_edit = true;
break;
case BUTTON_CANCEL:
cur_item_edit = false;
cur_menu = 131;
cur_item = 1;
break;
}
myGLCD.update();
break;
}
case 1312: // data -----------------------------------------------------------------
{
myGLCD.setFont(SmallFont);
myGLCD.clrScr();
myGLCD.print("data",1,0);
myGLCD.print(rtc.getTimeStr(FORMAT_SHORT),RIGHT,0);
myGLCD.drawLine(0,8,83,8);
myGLCD.drawLine(0,9,83,9);
if((cur_item == 1)&&cur_item_edit)
myGLCD.invertText(true);
myGLCD.printNumI(menu_dd,12,20,2,'0');
myGLCD.invertText(false);
myGLCD.print(".",24,20);
if((cur_item == 2)&&cur_item_edit)
myGLCD.invertText(true);
myGLCD.printNumI(menu_mm,30,20,2,'0');
myGLCD.invertText(false);
myGLCD.print(".",42,20);
if((cur_item == 3)&&cur_item_edit)
myGLCD.invertText(true);
myGLCD.printNumI(menu_yyyy,48,20,4,'0');
myGLCD.invertText(false);
myGLCD.print("denx nedeli",0,32);
if((cur_item == 4)&&cur_item_edit)
myGLCD.invertText(true);
myGLCD.printNumI(menu_dow,68,32);
myGLCD.invertText(false);
switch(cur_item){
case 1:
myGLCD.drawRoundRect(11,18,25,28);
break;
case 2:
myGLCD.drawRoundRect(29,18,44,28);
break;
case 3:
myGLCD.drawRoundRect(47,18,73,28);
break;
case 4:
myGLCD.drawRoundRect(67,30,75,40);
break;
}
switch(key){
case BUTTON_UP:
if(!cur_item_edit){
cur_item--;
if(cur_item < 1)
cur_item = 4;
}else{
if(cur_item == 1){
menu_dd++;
if(menu_dd > 31)
menu_dd = 1;
}
if(cur_item == 2){
menu_mm++;
if(menu_mm > 12)
menu_mm = 1;
}
if(cur_item == 3){
menu_yyyy++;
}
if(cur_item == 4){
menu_dow++;
if(menu_dow > 7)
menu_dow = 1;
}
}
break;
case BUTTON_DOWN:
if(!cur_item_edit){
cur_item++;
if(cur_item > 4)
cur_item = 1;
}else{
if(cur_item == 1){
menu_dd--;
if(menu_dd < 1)
menu_dd = 31;
}
if(cur_item == 2){
menu_mm--;
if(menu_mm < 1)
menu_mm = 12;
}
if(cur_item == 3){
menu_yyyy--;
menu_yyyy = max(menu_yyyy,2013);
}
if(cur_item == 4){
menu_dow--;
if(menu_dow < 1)
menu_dow = 7;
}
}
break;
case BUTTON_OK:
if(cur_item_edit){
switch(cur_item){
case 1:
rtc.setDate(menu_dd, time.mon, time.year); // Set the date
break;
case 2:
rtc.setDate(time.date, menu_mm, time.year); // Set the date
break;
case 3:
rtc.setDate(time.date, time.mon, menu_yyyy); // Set the date
break;
case 4:
rtc.setDOW(menu_dow); // Set Day-of-Week
break;
}
cur_item_edit = false;
}else
cur_item_edit = true;
break;
case BUTTON_CANCEL:
cur_item_edit = false;
cur_menu = 131;
cur_item = 2;
break;
}
myGLCD.update();
break;
}
case 1313: // swet kontrast -----------------------------------------------------------------
{
drawIntMenu("displ kontrast",45,80,ledContrast);
switch(key){
case BUTTON_UP:
ledContrast++;
ledContrast = min(ledContrast, 80);
break;
case BUTTON_DOWN:
ledContrast--;
ledContrast = max(ledContrast, 45);
break;
case BUTTON_OK:
EEPROM.write(0,ledContrast);
cur_menu = 131;
cur_item = 3;
break;
case BUTTON_CANCEL:
ledContrast = EEPROM.read(0);
cur_menu = 131;
cur_item = 3;
break;
}
myGLCD.setContrast(ledContrast);
break;
}
case 1314: // swet qrkostx -----------------------------------------------------------------
{
drawIntMenu("displ qrkostx",0,255,ledLight);
switch(key){
case BUTTON_UP:
ledLight++;
ledLight = min(ledLight, 255);
break;
case BUTTON_DOWN:
ledLight--;
ledLight = max(ledLight, 0);
break;
case BUTTON_OK:
EEPROM.write(1,ledLight);
cur_menu = 131;
cur_item = 4;
break;
case BUTTON_CANCEL:
ledLight = EEPROM.read(1);
cur_menu = 131;
cur_item = 4;
break;
}
analogWrite(LED_LIGHT_PIN,ledLight);
break;
}
default:
cur_menu = 0;
cur_item = 0;
}
loopTime = currentTime;
}
}
сидел две недели и питалсся
ничего не хочется
Так, не хочется - не делайте. Это что, по приговору суда делается?
Сообственно нужно из скетча удалить все что связано с:
Не знаю, где Вы стырили этот код, но, если я правильно понимаю, то оригинал живёт вот здесь, а с изменёнными буквами - вот здесь.
Лучше бы Вам обратиться к автору. Он, может и поможет.
Обращался к автору, он уже этим не занимаеться и даже за деньги не хочет помогать
Сделать нужно, но если честно после двух недель проб и ошибок уже не хочется
afiks_corp, данный раздел предназначен, чтобы авторы описывали в нем свои проекты. И отвечали на вопросы читателей.
Для задавать вопросы и жаловаться на жизнь есть другие разделы.