помогите с акваконтроллером
- Войдите на сайт для отправки комментариев
Ср, 15/04/2015 - 01:31
помогите я вдруг поня что я чего то не понимаю имееться arduino uno, lsd1602 с кнопками, часы ds3231, термодатчик Ds18b20, два шим irf520n и Y82 - L298N
была задумка плавное включение и затухание светодиодов по времени и плавный запуск охлаждения. окружающая температура будет браться с часов а внутренняя с датчика.
И какая часть кода не работает как задумано?
Если весь холивар осилите, посмотрите здесь . Код не шедевр, но летает. Пережевано очень тщательно. Нет плавного запуска охлаждения, но это уже детали. Брать наружную температура с часов, которые наверняка стоят рядом с тепловыделяющими элементами в закрытым корпусе, не самое лучшее решение.
дело в том что я даже скетчи объединять не могу. я надеялся что может у кого то есть такой скетч с такими комплектующими. я находил похожее но при заливке выдавало ошибку компиляции. а в исправление я тоже новечёк
дело в том что я даже скетчи объединять не могу. я надеялся что может у кого то есть такой скетч с такими комплектующими. я находил похожее но при заливке выдавало ошибку компиляции. а в исправление я тоже новечёк
помогите соеденить два скетча
Для начала, почитайте как вставлять код.
На мой взгляд, чем это вместе складывать, проще новый на их основе написать.
И главное, что вы хотите? Потратить время (месяца 1,5-2) научится немного программить написать код под себя, или получить сразу работающий результат?
я не предполагал что будет так. я думал закажу платку к ней комплектующие, соберу их скачаю скетч подходящий и всё будет работать. да ни тут то было, я расчитывал на готовый скетч. а учится время не позволяет. жаль. теперь будет просто валяться ардуинка.
задарите её пионерам тогда....
я не предполагал что будет так. я думал закажу платку к ней комплектующие, соберу их скачаю скетч подходящий и всё будет работать. да ни тут то было, я расчитывал на готовый скетч. а учится время не позволяет. жаль. теперь будет просто валяться ардуинка.
Так возьмите тот скетч на который я давал ссылку, он вроде делает почти как вам нужно. Комплектуха которая понадобится кроме вашей - LCD2004 под I2C, IR сенсор и шилд с релюшками.
нашёл то что мне нужно. полностью рабочий скетч, но опять же нужна помощь по написанию самой простой менюшки, чтобы можно было кнопками изменить время вкл и выкл. и как продублировать ещё три выхода (11,12,13) один из них можно сделать шим. Не оставте мою беду в стороне пожалуйста
/*Подключаем библиотеки*/ #include <Wire.h> //необходимо для работы с часами #include <OneWire.h> // подключаем библиотеку для работы с 1-Wire #include <DS1307.h> // подключаем библиотеку для работы с часами DS1307 #include <LiquidCrystal.h> // подключаем библиотеку для работы с LCD текстовыми экранами #include <DallasTemperature.h> // подключаем библиотеку для работы с термометром 18B20 #define TempPin 2 // pin для датчика температуры int ledPin = 3; // управление светодиодами, присоединён к pin 3 LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //инициализируем дисплей OneWire oneWire(TempPin); // указываем, что через этот пин будем мониторить температуру DallasTemperature tempSensor(&oneWire); // создаем объект для работы с термометром long tmIntv = 1000; //интервал для обновления времени на экране каждую секунду long tempIntv = 30000; //интервал для обновления температуры, хватит и пол минуты long prvMlsTm = 0; //предыдущее показание миллисекунд для обновления показания часов long prvMlsTemp = 0; //предыдущее показание миллисекунд для обновления показания температуы long prvMlsLght = 0; //предыдущее показание миллисекунд для проверки временного интервала long lghtIntv = 60000; //интервал для проверки включения/выключения освещения аквариума, 1 минута int lghtStat = 0; //если подсветка включена, то в 1 int upLghtTime = 8; //включаем в 8 утра int downLghtTime = 17; //выключаем в 17 вевера int isNight = 0; //если включаем на ночь, т.е. начальное время больше конечного int prevSec = 0; //предыдущее показание секунд для перезапуска если остановились byte key(){ //// для кнопок ЛСДшилда int val = analogRead(0); if (val < 50) return 5; else if (val < 150) return 3; else if (val < 350) return 4; else if (val < 500) return 2; else if (val < 800) return 1; else return 0; //отрабатывает при включении Arduino void setup() { pinMode(ledPin, OUTPUT); // режим порта устанавливаем на вывод (запись) tempSensor.begin(); //инициализируем термометр lcd.begin(16, 2); //указываем, что индикатор 16 символов в две строки lcd.print("Time:"); //выводим "Time" if (upLghtTime > downLghtTime) { //если ночное время isNight = 1; } } void printTemp () { //отображаем температуру на экране float aTemp; //температура аквариума float rTemp; //температура комнаты tempSensor.requestTemperatures(); // отправляем запрос на получение температуры rTemp = tempSensor.getTempCByIndex(0); //у нас термометр в комнате с индексом 0 aTemp = tempSensor.getTempCByIndex(1); //у нас термометр в аквариуме с индексом 1 lcd.setCursor(0, 1); //перемещаем позицию вывода lcd.print("R: "); lcd.print(rTemp); //выводим температуру комнаты lcd.setCursor(7, 1); lcd.print(" A: "); lcd.print(aTemp); //выводим температуру аквариума lcd.setCursor(15, 1); lcd.print(" "); lcd.home(); //если экранированный кабель, то можно подключать до 32 термометров } void light () { //включаем/выключаем освещение аквариума int hr; int isLght = 0; hr = RTC.get(DS1307_HR, true); //получаем значение часов if (isNight == 0) { //если день if (hr >= upLghtTime && hr < downLghtTime) { //проверяем интервал isLght = 1; //если необходимо включить свет } else { isLght = 0; } } else { //если ночь if (hr - upLghtTime >= 0) { //если больше или равно верхнему значению, то необходимо включить свет isLght = 1; //если необходимо включить свет } else { if (hr < downLghtTime) { //если меньше нижнего значения, то необходимо включить свет isLght = 1; //если необходимо включить свет } else { isLght = 0; } } } //закончился цикл выбора: день или ночь? if ((isLght == 1) && (lghtStat == 0)) { //если свет еще не включен и выставлен флаг необходимости включить lghtStat = 1; digitalWrite(ledPin, HIGH); //собственно, включаем подавая высокий уровень на вывод } else { if (isLght == 0 && lghtStat == 1) { lghtStat = 0; digitalWrite(ledPin, LOW); //собственно, выключаем снимая высокий уровень на выводе } } } void printTime () { //ф-ция вывода времения на экран int hr; int minut; int sec; lcd.setCursor(7, 0); hr = RTC.get(DS1307_HR, true); //получаем часы if ( hr < 10) { lcd.print('0'); //выводим недостающий 0 если знаков меньше 10 } lcd.print(hr); lcd.print(":"); minut = RTC.get(DS1307_MIN, false); //получаем минуты if ( minut < 10) { lcd.print('0'); //выводим недостающий 0 если знаков меньше 10 } lcd.print(minut); lcd.print(":"); sec = RTC.get(DS1307_SEC, false); //получаем секунды if ( sec < 10) { lcd.print('0'); //выводим недостающий 0 если знаков меньше 10 } //дело в том, что иногода часы останавливаются, поэтому если предыдущая и текущая секунды совпадают - перезапускаем часы if (prevSec == sec) { RTC.start(); } prevSec = sec; lcd.print(sec); } void loop() //постоянно отрабатывает в цикле { unsigned long currentMillis = millis(); //миллисекунд прошло со старта //дело в том, что если делать через delay(), то система в это время простаивает, //а нам постоянно необходимо чего-нить обрабатывать //поэтому просто считаем прошедшее время и сверяем его с интервалами //проверяем не прошел ли нужный интервал для обновления часов, если прошел то if (currentMillis - prvMlsTm > tmIntv) { prvMlsTm = currentMillis; printTime(); //вызываем ф-цию вывода времени на экран если } //проверяем не прошел ли нужный интервал для обновления температуры, если прошел то if (currentMillis - prvMlsTemp > tempIntv) { prvMlsTemp = currentMillis; printTemp(); // } //проверяем не прошел ли нужный интервал для включения/выключения освещения, если прошел то if (currentMillis - prvMlsLght > lghtIntv) { prvMlsLght = currentMillis; light(); //вызываем ф-цию проверки необходимости включения/выключения освещения } }<strong>помогите найти ошибку. такое дело скачал скетч рабочий, в ардуино заливаеться но на на экран инфа не отображаеться </strong> #include <Wire.h> #include <DS1307new.h> #include <LiquidCrystal.h> #include <OneWire.h> #include <EEPROM.h> uint16_t startAddr = 0x0000; // Начальный адрес для хранения в NV-RAM uint16_t lastAddr; // новый адрес для хранения в NV-RAM uint16_t TimeIsSet = 0xaa55; // ПОМОЩНИК, что время не должно установить снова LiquidCrystal lcd(8, 9, 4, 5, 6, 7); OneWire ds (11); // on pin 11 int hotpin = 0; int feedpin = 1; int lightpin = 3; int comppin = 13; int fanpin = 2; int timer = 0; int ledpin = 10; int fadeAmount = 15; // шаг приращения/убывания яркости int brightness = 120; // уставливаем начально значение яркости int lcd_key = 0; int adc_key_in = 0; int value= EEPROM.read(0); int fadevalue = 5; #define btnRIGHT 0 #define btnUP 1 #define btnDOWN 2 #define btnLEFT 3 #define btnSELECT 4 #define btnNONE 5 char* Message[]={"Enter Day", "Enter Month", "Enter Year", "Enter Hour", "Enter Minutes"}; int myTime[] = {10,9,2013,0,0}; int i = 0; // опрос клавиатуры int read_LCD_buttons() { adc_key_in = analogRead(0); // прочитать значение от датчика if (adc_key_in < 1015) { delay(100); adc_key_in = analogRead(0); } // my buttons when read are centered at these valies: 0, 144, 329, 504, 741 // we add approx 50 to those values and check to see if we are close if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result if (adc_key_in < 50) return btnRIGHT; if (adc_key_in < 195) return btnUP; if (adc_key_in < 380) return btnDOWN; if (adc_key_in < 555) return btnLEFT; if (adc_key_in < 790) return btnSELECT; return btnNONE; // when all others fail, return this... } void setup() { // Test of the SQW pin, D2 = Pullup on lcd.begin(16, 2); // start the library pinMode(feedpin, OUTPUT); pinMode(lightpin, OUTPUT); pinMode(comppin, OUTPUT); pinMode(fanpin, OUTPUT); pinMode(hotpin, OUTPUT); pinMode(ledpin, OUTPUT); digitalWrite(feedpin, HIGH); digitalWrite(comppin, HIGH); /* PLEASE NOTICE: WE HAVE MADE AN ADDRESS SHIFT FOR THE NV-RAM!!! NV-RAM ADDRESS 0x08 HAS TO ADDRESSED WITH ADDRESS 0x00=0 TO AVOID OVERWRITING THE CLOCK REGISTERS IN CASE OF ERRORS IN YOUR CODE. SO THE LAST ADDRESS IS 0x38=56! */ RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));// Store startAddr in NV-RAM address 0x08 /* Uncomment the next 2 lines if you want to SET the clock Comment them out if the clock is set. DON'T ASK ME WHY: YOU MUST UPLOAD THE CODE TWICE TO LET HIM WORK AFTER SETTING THE CLOCK ONCE. */ //TimeIsSet = 0xffff; // RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t)); /* Control the clock. Clock will only be set if NV-RAM Address does not contain 0xaa. DS1307 should have a battery backup. */ RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t)); if (TimeIsSet != 0xaa55) { RTC.stopClock(); while(i<5){ lcd.setCursor(0,0); lcd.print(Message[i]); lcd.setCursor(0,1); lcd.print(myTime[i]); lcd_key = read_LCD_buttons(); switch (lcd_key) // depending on which button was pushed, we perform an action { case btnRIGHT: { break; } case btnLEFT: { break; } case btnUP: { myTime[i] = myTime[i]++; if (i == 0 && myTime[i] > 31) myTime[i] = 1; else if (i == 1 && myTime[i] > 12) myTime[i] = 1; else if (i == 3 && myTime[i] > 23) myTime[i] = 0; else if (i == 4 && myTime[i] > 59) myTime[i] = 0; lcd.clear(); break; } case btnDOWN: { myTime[i] = myTime[i]--; if (i == 0 && myTime[i] < 1) myTime[i] = 31; else if (i == 1 && myTime[i] < 1) myTime[i] = 12; else if (i == 3 && myTime[i] < 0) myTime[i] = 23; else if (i == 4 && myTime[i] < 0) myTime[i] = 59; lcd.clear(); break; } case btnSELECT: { i = i++; lcd.clear(); break; } case btnNONE: { break; } } } RTC.fillByYMD(myTime[2],myTime[1],myTime[0]); RTC.fillByHMS(myTime[3],myTime[4],0); RTC.setTime(); TimeIsSet = 0xaa55; RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t)); RTC.startClock(); } else { RTC.getTime(); } /* Control Register for SQW pin which can be used as an interrupt. */ RTC.ctrl = 0x00; // 0x00=disable SQW pin, 0x10=1Hz, // 0x11=4096Hz, 0x12=8192Hz, 0x13=32768Hz RTC.setCTRL(); uint8_t MESZ; MESZ = RTC.isMEZSummerTime(); } void loop() { byte i; byte present = 0; byte type_s; byte data[12]; byte addr[8]; float celsius, fahrenheit; lcd_key = read_LCD_buttons(); switch (lcd_key) // depending on which button was pushed, we perform an action { case btnRIGHT: {if (brightness >= 0 && brightness < 255) {brightness = brightness + fadeAmount; break;} else {break;} } case btnLEFT: {if (brightness > 0 && brightness <= 255) {brightness = brightness - fadeAmount; break;} else {break;} } case btnUP: {if (value >= 0 && value < 255) {value = value + fadevalue; analogWrite(lightpin, value); break;} else {break;} } case btnDOWN: {if (value > 0 && value <= 255) {value = value - fadevalue; analogWrite(lightpin, value); break;} else {break;} } case btnSELECT: { EEPROM.write(0, value); break;} case btnNONE: { break; } } analogWrite(ledpin, brightness); if (! ds.search (addr)) { ds.reset_search (); delay (250); return; } ds.reset (); ds.select (addr); ds.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. present = ds.reset (); ds.select (addr); ds.write (0xBE); // Read Scratchpad for (i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read (); } // convert the data to actual temperature unsigned int raw = (data[1] << 8) | data[0]; if (type_s) { raw = raw << 3; // 9 bit resolution default if (data[7] == 0x10) { // count remain gives full 12 bit resolution raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60); if (cfg == 0x00) raw = raw << 3; // 9 bit resolution, 93.75 ms else if (cfg == 0x20) raw = raw << 2; // 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 } celsius = (float)raw / 16.0; fahrenheit = celsius * 1.8 + 32.0; lcd.clear(); lcd.setCursor(10,0); lcd.print (celsius); //Вывод времени на дисплей RTC.getTime(); lcd.setCursor(0,0); if (RTC.hour < 10) // correct hour if necessary { lcd.print("0"); lcd.print(RTC.hour, DEC); } else { lcd.print(RTC.hour, DEC); } lcd.print(":"); if (RTC.minute < 10) // correct minute if necessary { lcd.print("0"); lcd.print(RTC.minute, DEC); } else { lcd.print(RTC.minute, DEC); } lcd.print(":"); if (RTC.second < 10) // correct second if necessary { lcd.print("0"); lcd.print(RTC.second, DEC); } else { lcd.print(RTC.second, DEC); } lcd.setCursor(0,1); if (RTC.day < 10) // correct date if necessary { lcd.print("0"); lcd.print(RTC.day, DEC); } else { lcd.print(RTC.day, DEC); } lcd.print("-"); if (RTC.month < 10) // correct month if necessary { lcd.print("0"); lcd.print(RTC.month, DEC); } else { lcd.print(RTC.month, DEC); } lcd.print("-"); lcd.print(RTC.year, DEC); // Year need not to be changed; lcd.print(" "); lcd.print(value/5); // Сверка времени и управление освещением if (RTC.hour == 9 && RTC.minute == 1 && RTC.second == 0)//кормление { digitalWrite(feedpin, LOW); delay (5000); digitalWrite(feedpin, HIGH); } if (RTC.hour >= 10 && RTC.hour < 20)// включение компрессора { digitalWrite(comppin, LOW); } else { digitalWrite(comppin, HIGH); } if (RTC.hour >= 9 && RTC.hour < 21)//включение освещения { analogWrite(lightpin, value); } else { analogWrite(lightpin, 0); } // Проверка температуры и запуск охлаждения или обогрева if (celsius >= 27.1) digitalWrite(fanpin, LOW); else if (celsius <= 26.9)digitalWrite(fanpin, HIGH); if (celsius <= 25.9) digitalWrite(hotpin, LOW); else if (celsius >= 26.1) digitalWrite(hotpin, HIGH); }serega.gram, в данный момент, вы впустую тратите время. Чем тратить его без пользы, пытаясь впихать невпихуемое, прочитайте здесь .
Далее, начните препарировать ваш код. Для начала выведите через Serial.print стандартный "HELLO", затем тоже самое на LCD, в позицию которая вам нравится, потом туда же считанное значение кнопки.
После этого можно будет двигаться дальше. Поверьте, это не так сложно, как кажется. Основной геммор у вас будет с меню (работа нудная и кропотливая), но имея предыдущий опыт отладки вполне решаемая.
Если хотите кавалерийским наскоком, то лучше в "ищу исполнителя".
всё ясно. последний вопрос, последний скетч что я выложил 19.04 вы не можете проверить на ошибку. потому что он компилируеться загружаеться но на дисплей ни чего выводиться
Если не выводится вообще ничего, крутим подстроечник до появления прямоугольников или проверяем соответствие ног строке 12.
по словам автора скетч рабочий, и соответствие ног совпадает. потому что любой другой скетч заливаю с такой распиновкой и всё работает. у меня подозрение что в нём что то не дописано.
Глазами ничего крамольного не видно, будет время, попробую загрузить.
спасибо
Я вас не обрадую, у меня отказывается компилится. Ругается на OneWire. Возможно разные с вами библиотеки((((
жаль. у меня были большие надежды на этот скетч
Покопаться самому совсем нет желания?
да я даже незнаю с чего начать с моими знаниями . соотношение подключения ног экрана совпадает. меня смущают другие выходы подключения в скетчи
здраствуйте. в долгих поисках, нашёл подходящий мне скетч. но есть один нюанс почему то не срабатывает пин термостата и их там два выхода . я хочу один из них использовать для охлаждения. изначально они идут 40 . 41 я переписываю на 13 температура опускаеться и вроде должно сработать на включение а не хочет. а так меня всё устраивает плавное включение -затухание. Сможете помочь?
#include <Wire.h>//Подключаем библиотеку для использования I2C интерфейса с модулем RTC #include "RTClib.h"//Подключаем библиотеку для использования модуля часов реального времени RTC #include <OneWire.h> #include <DallasTemperature.h> #include "LiquidCrystal.h" // библиотека экрана LiquidCrystal lcd(8, 9, 4, 5, 6, 7); OneWire ds(2); // Подключаем датчик к 53 цифровому пину int lcd_key = 0; int adc_key_in = 0; int reg=0;// вводим флаг для автоматического (при значении-0) или ручного регулирования -1 #define btnRIGHT 0 #define btnUP 1 #define btnDOWN 2 #define btnLEFT 3 #define btnSELECT 4 #define btnNONE 5 // read the buttons int read_LCD_buttons() { adc_key_in = analogRead(0); // read the value from the sensor // my buttons when read are centered at these valies: 0, 142, 328, 504, 741 // we add approx 50 to those values and check to see if we are close if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result if (adc_key_in < 0) return btnRIGHT; if (adc_key_in < 99) return btnUP; if (adc_key_in < 255) return btnDOWN; if (adc_key_in < 409) return btnLEFT; if (adc_key_in < 639) return btnSELECT; return btnNONE; // when all others fail, return this... } #define PWM_LW_MIN 0 //Если необходим ток покоя на LED - изменить эту константу #define PWM_LW_MAX 128//Если необходимо ограничить максимальную яркость - уменьшить значение #define PWM_LW_PIN 11 //Пин порта, где будет ШИМ LW #define PWM_LR_MIN 0 //Если необходим ток покоя на LED - изменить эту константу #define PWM_LR_MAX 200//Если необходимо ограничить максимальную яркость - уменьшить значение #define PWM_LR_PIN 3 //Пин порта, где будет ШИМ LR #define PWM_LB_MIN 0 //Если необходим ток покоя на LED - изменить эту константу #define PWM_LB_MAX 235 //Если необходимо ограничить максимальную яркость - уменьшить значение #define PWM_LB_PIN 12 //Пин порта, где будет ШИМ LB #define mn 60UL //Дополнительные константы для удобства #define hr 3600UL //Отражают соответствующие количества секунд #define d 86400UL // Переменные для плавного ручного регулирования света long ti=0; // время последнего изменения яркости int tp=100;// период изменения ярокости на одно значение в миллисекундах unsigned long LUD=0;// флаг изменения яркости: 0 -не менять, 1 увеличить, 2 уменьшить int Relay_Off = HIGH; int Relay_On = LOW; RTC_DS1307 RTC; long sunrise_start = 17*hr+00*mn; //Начало восхода в 9 - 45 long sunrise_duration = 3*mn; //Длительность восхода 30 минут long sunset_start = 22*hr+00*mn; //начало заката в 21-15 long sunset_duration = 3*mn; //Длительность заката 30 минут long moonrise_start = 22*hr+00*mn ;//Начало луны в 9 - 45 long moonrise_duration = 3*mn;//Длительность восхода long moonset_start = 23*hr+00*mn;//Конец луны в 11 long moonset_duration = 3*mn; //Длительность заката луны //******************************************************************************************** void setup(){ Serial.begin(9600); lcd.begin(16, 2); // запускаем библиотеку экрана pinMode(40, OUTPUT); // Включаем кипятильник pinMode(41, OUTPUT); digitalWrite(40, Relay_On); digitalWrite(41, Relay_On); Wire.begin(); //Инициируем I2C интерфейс RTC.begin(); //Инициирум RTC модуль analogWrite(PWM_LW_PIN, PWM_LW_MIN); //Пишем в порт минимальное значение analogWrite(PWM_LR_PIN, PWM_LR_MIN); analogWrite(PWM_LB_PIN, PWM_LB_MIN); if (! RTC.isrunning()) { Serial.println("RTC is NOT running!"); RTC.adjust(DateTime(2014, 7, 12, 22, 48, 1)); }//RTC.adjust(DateTime(__DATE__, __TIME__)); } // КОНЕЦ ИНИЦИАЛИЗАЦИИ //******************************************************************************************** void loop() // ПРОГРАММЫй безусловный ЦИКЛ { analogWrite(10, 100); lcd.setCursor(0, 1); long pwm_LW; long pwm_LR; long pwm_LB; DateTime myTime = RTC.now(); //Читаем данные времени из RTC при каждом выполнении цикла long Day_time = myTime.unixtime() % 86400; //сохраняем в переменную - время в формате UNIX lcd.setCursor(11,0); if(myTime.hour()<10)lcd.print(0); lcd.print(myTime.hour(),DEC); lcd.print(":"); if(myTime.minute()<10)lcd.print(0); lcd.print(myTime.minute(),DEC); if (reg==0){ //********************************************************************************************* // обработка интервала до восхода и после заката //********************************************************************************************* if ((Day_time<sunrise_start) ||//Если с начала суток меньше чем начало восхода (Day_time>=sunset_start+sunset_duration)) { //Или больше чем начало заката + длительность pwm_LW = PWM_LW_MIN; //Величина для записи в порт равна минимуму pwm_LR = PWM_LR_MIN; //********************************************************************************************* // обработка интервала восхода //********************************************************************************************* }else if ((Day_time>=sunrise_start) && //Если с начала суток больше чем начало восхода (Day_time<sunrise_start+sunrise_duration)){ //И меньше чем начало восхода + длительность pwm_LW = ((Day_time - sunrise_start)*(PWM_LW_MAX-PWM_LW_MIN)) / sunrise_duration; //Вычисляем для рассвета величину для записи в порт ШИМ pwm_LR = ((Day_time - sunrise_start)*(PWM_LR_MAX-PWM_LR_MIN)) / sunrise_duration; //********************************************************************************************* // обработка интервала заката //********************************************************************************************* }else if ((Day_time>=sunset_start) && //Если начала суток больше чем начало заката и меньше чем (Day_time<sunset_start+sunset_duration)){//начало заката плюс длительность pwm_LW = ((sunset_start+sunset_duration - Day_time)*(PWM_LW_MAX-PWM_LW_MIN)) / sunrise_duration; //Вычисляем для заката величину для записи в порт ШИМ pwm_LR = ((sunset_start+sunset_duration - Day_time)*(PWM_LR_MAX-PWM_LR_MIN)) / sunrise_duration; //******************************************************************************************** // обработка интервала от конца рассвета и до начала заката, // когда свет должен быть включен на максимальную яркость //******************************************************************************************** }else { pwm_LW = PWM_LW_MAX; //Устанавливаем максимальную величину для записи в порт ШИМ pwm_LR = PWM_LR_MAX; } analogWrite(PWM_LW_PIN, pwm_LW);//Пишем в порт вычисленное значение analogWrite(PWM_LR_PIN, pwm_LR); // обработка интервала до восхода луны и после заката //********************************************************************************************* if ((Day_time<moonrise_start) || //Если с начала суток меньше чем начало восхода (Day_time>=moonset_start+moonset_duration)) {//Или больше чем начало заката + длительность pwm_LB = PWM_LB_MIN; //Величина для записи в порт равна минимуму //********************************************************************************************* // обработка интервала восхода луны //********************************************************************************************* }else if ((Day_time>=moonrise_start) &&//Если с начала суток больше чем начало восхода (Day_time<moonrise_start+moonrise_duration)){ //И меньше чем начало восхода + длительность pwm_LB = ((Day_time - moonrise_start)*(PWM_LB_MAX-PWM_LB_MIN)) / moonrise_duration; //Вычисляем для рассвета величину для записи в порт ШИМ //********************************************************************************************* // обработка интервала заката луны //********************************************************************************************* }else if ((Day_time>=moonset_start) && //Если начала суток больше чем начало заката и меньше чем (Day_time<moonset_start+moonset_duration)){//начало заката плюс длительность pwm_LB = ((moonset_start+moonset_duration - Day_time)*(PWM_LB_MAX-PWM_LB_MIN)) / moonrise_duration; //Вычисляем для заката величину для записи в порт ШИМ //******************************************************************************************** // обработка интервала от конца рассвета и до начала заката луны, // когда свет должен быть включен на максимальную яркость //******************************************************************************************** }else { pwm_LB = PWM_LB_MAX; //Устанавливаем максимальную величину для записи в порт ШИМ } analogWrite(PWM_LB_PIN, pwm_LB); //Пишем в порт вычисленное значение } byte i; byte type_s; byte data[12]; byte addr[8]; float celsius, fahrenheit; // Ищем алрес датчика if ( !ds.search(addr)) { Serial.println("No more addresses."); Serial.println(); ds.reset_search(); delay(250); return; } // Проверяем не было ли помех при передаче if (OneWire::crc8(addr, 7) != addr[7]) { Serial.println("CRC is not valid!"); return; } Serial.println(); // Определяем серию датчика switch (addr[0]) { case 0x10: Serial.println(" Chip = DS18S20"); type_s = 1; break; case 0x28: Serial.println(" Chip = DS18B20"); type_s = 0; break; case 0x22: Serial.println(" Chip = DS1822"); type_s = 0; break; default: Serial.println("Device is not a DS18x20 family device."); return; } ds.reset(); ds.select(addr); // Выбираем адрес ds.write(0x44, 1); // Производим замер, в режиме паразитного питания delay(750); ds.reset(); ds.select(addr); ds.write(0xBE); // Считываем оперативную память датчика for ( i = 0; i < 9; i++) { data[i] = ds.read(); // Заполняем массив считанными данными } // Данные о температуре содержатся в первых двух байтах, переведем их в одно значение и преобразуем в шестнадцатиразрядное число unsigned int raw = (data[1] << 8) | data[0]; // Переводим температуру в шкалы по Цельсию и Фаренгейту if (type_s) { raw = raw << 3; } if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; } else { byte cfg = (data[4] & 0x60); if (cfg == 0x00) raw = raw << 3; else if (cfg == 0x20) raw = raw << 2; else if (cfg == 0x40) \ raw = raw << 1; } // Вывод текущего значения температуры на дисплей celsius = (float)raw / 16.0; lcd.setCursor(0, 0); lcd.print("T="); lcd.setCursor(2, 0); lcd.print(celsius); delay (10); celsius = (float)raw / 16.0; fahrenheit = celsius * 1.8 + 32.0; Serial.print("Temp = "); Serial.print(celsius); Serial.print(" C, "); Serial.print(fahrenheit); Serial.println(" F"); if (reg==0){ // Если регулирование автоматическое -регулируем по температуре lcd.setCursor(15, 1); lcd.print("A"); // Если температура достигает 28,3 (с погрешностью), отключаем кипятильник Н1 if (celsius > 28.3) { digitalWrite(40, Relay_Off); lcd.setCursor(0, 1); lcd.print("H1-Off"); } // Если температура достигает 28,5 (с погрешностью), отключаем кипятильник Н2 if (celsius > 28.5) { digitalWrite(41, Relay_Off); lcd.setCursor(7, 1); lcd.print("H2-Off"); } // Если температура падает до 28 (с погрешностью), включаем оба кипятильника if (celsius < 28.0) { digitalWrite(40, Relay_On); lcd.setCursor(0, 1); lcd.print("H1-On "); digitalWrite(41, Relay_On); lcd.setCursor(7, 1); lcd.print("H2-On "); } } lcd_key = read_LCD_buttons(); // read the buttons switch (lcd_key) // depending on which button was pushed, we perform an action { case btnRIGHT: { digitalWrite(41, Relay_Off); lcd.setCursor(7, 1); lcd.print("H2-Off"); break; } case btnLEFT: { digitalWrite(41, Relay_On); lcd.setCursor(7, 1); lcd.print("H2-On "); break; } case btnUP: { LUD=1; ti=millis(); break; } case btnDOWN: { LUD=2; ti=millis(); break; } case btnSELECT: { if(reg==1) {reg=0; lcd.setCursor(15, 1); lcd.print("A");} else {reg=1; lcd.setCursor(15, 1); lcd.print("M");} break; } case btnNONE: { break; } } // Подпрограмма плавного включения и гашения ламп в ручном режиме if (reg==1)// если режим ручной {if(LUD==1)// если плавное включение света { if(millis()-ti>tp) {int valW = analogRead(PWM_LW_PIN); int valR = analogRead(PWM_LR_PIN); if (valW<PWM_LW_MAX) {analogWrite(PWM_LW_PIN, valW+1); }; if (valR<PWM_LR_MAX) {analogWrite(PWM_LR_PIN, valR+1); }; ti=millis(); if(valW+1>=PWM_LW_MAX && valR+1>=PWM_LR_MAX){LUD=0;}; }; }; if(LUD==2)// если плавное включение света { if(millis()-ti>tp) {int valW = analogRead(PWM_LW_PIN); int valR = analogRead(PWM_LR_PIN); if (valW>PWM_LW_MIN) {analogWrite(PWM_LW_PIN, valW-1); }; if (valR>PWM_LR_MIN) {analogWrite(PWM_LR_PIN, valR-1); }; ti=millis(); if(valW-1<=PWM_LW_MIN && valR-1<=PWM_LR_MIN){LUD=0;}; }; }; }; } //------------Конец ЦИКЛА---да я даже незнаю с чего начать с моими знаниями . соотношение подключения ног экрана совпадает. меня смущают другие выходы подключения в скетчи
надо начать с создания новой темы... рекомендации на сайте есть... и про вставку кода в сообщение тоже есть...
всё выяснил всё работает. это я тупанул
и снова здраствуйте. не поможете прописать библиотеку LiquidCrystal_I2C. практически везде получалось а тут не могу. в том виде код работает а c i2c не хочет
Здравствуйте не подскажите как правильно прописать под i2c. С обычной распиновкой код работает. Обычно получалось подменит строки.
0400 if(bstate == 99) {0401 Serial.print("ERROR: ");Serial.println(button);0402 }0403 0404 if(blast != bstate) {0405 // state has changed0406 if(bstate >=1 && bstate <= 5) {0407 Serial.print("BUTTON: ");Serial.println(bstate); 0408 return(bstate);0409 }0410 }0411 return(0);0412}А как читать такой код с бесконечными
  ?Может Вы его лучше скопируете из текстового редактора или ардуино IDE?
Да и вообще потратили уже целый месяц на поиск, за это время даже человек никогда не видивший кода сможет написать программку, которая моргает диодами и даже сделает их плавное затухание. И всё это не дёрганьем непонятного кода из разных мест, а вдумчивым чтением документации или одной из множества статей по тому как программировать ардуино. Освоив базу уже легко смогли бы написать необходимый код в нсчастных 100-200 строк.
И я думаю, Вам уже стоит понять, что люди тут потратили кучу времени на то что бы понять как это всё работает. И что Вы думаете, Вам вот так за бесплатно просто кто-то отдаст ещё несколько часов своей жизни на то что бы изучить Ваш не малый код и понять что имено Вам в нём нужно поменять? Это наивно.
Если не хотите думать, платите тем, кто готов думать. Если хотите всё и на халяву, то так не будет.
#include <Wire.h> // include the I2C library #include "RTClib.h"// #include <OneWire.h> #include <EEPROM.h> // Fro read and write EEPROM #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display // include the library code: // used for RTC const int dayspermonth[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; RTC_DS1307 RTC; DateTime now; // 126: -> 127: <- byte up[8] = { B00100, B01110, B10101, B00100, B00100, B00100, B00100, }; byte down[8] = { B00100, B00100, B00100, B00100, B10101, B01110, B00100, }; // For Temperature sensor TMP36 on A0 // Change values depending on your real measurements #define aref_voltage 4.91 // real voltage #define amplifier 3.58 // 3.27 -> amplifier = (R8+R10)/R8 = (220+500)/220, exact=(216+558)/216=3.58 const int sensorPin = A0; const float baselineTemp = 20.0; float temperatureC; // For Averaging // Define the number of samples to keep track of. The higher the number, // the more the readings will be smoothed, but the slower the output will // respond to the input. Using a constant rather than a normal variable lets // use this value to determine the size of the readings array. #define numReadings 10 int readings[numReadings]; // the readings from the analog input int index = 0; // the index of the current reading int total = 0; // the running total int average = 0; // the average int full = 0; // boolean in order to know if we have enoungh measurements // For buttons const int buttonsPin = A1; int bstate = 1024, blast = 1024; // button state and button last state // change value depending on your measurements const int button1max = 75; // reading should be 0, 75 threshold const int button2min = 76; // reading should be 151, from 76 to 250 const int button2max = 250; const int button3min = 251; // reading should be 347, from 251 to 430 const int button3max = 430; const int button4min = 431; // reading should be 515, from 431 to 606 const int button4max = 606; const int button5min = 607; // reading should be 700, from 607 to 850 const int button5max = 850; const int buttonNONE = 900; // reading should be 1023 // button types #define BT_NONE 0 #define BT_SET 1 #define BT_LEFT 2 #define BT_RIGHT 3 #define BT_UP 4 #define BT_DOWN 5 // For looping display by interval unsigned long previousDisplayMillis = 0; unsigned long displayInterval = 1000; // For looping calculation by interval unsigned long previousCalculationMillis = 0; unsigned long calculationInterval = 250; // screen size const byte cols = 16, lines = 2; // menu of status const int menumin = 0; const int menumax = 5; char* menu_entry[] = { "1. Set Date/Time", "2. Light 1 setup", "3. Light 2 setup", "4. Switch 1 set ", "5. Switch 2 set ", "6. Menu entry 6 " }; // status of programm #define ST_DISPLAY 0 #define ST_MENU 1 int status = ST_DISPLAY; /* * function prototypes */ void set_function(byte lnb, byte wpower = 1); /* * Define the devices */ #define Light_1 11 #define Light_2 10 #define Switch_1 9 #define Switch_2 8 #define Status_Led 7 struct AQTIME { byte h1; byte m1; byte h2; byte m2; byte power; }; // number of setups in memory #define NBSETS 4 AQTIME ti[NBSETS]; byte out[NBSETS]; // statuses of outputs #define OFF 0 #define AUTO 1 #define ON 2 #define MAX 3 byte out_m[NBSETS]; // for nice transition const unsigned long transitionDuration = 10000; unsigned int transitionSteps; byte asked_l[NBSETS]; // new asked level byte last_l[NBSETS]; // last asked level unsigned int current_l[NBSETS]; // current level multiplied by 256 in order to avoid floating calculations int incr_l[NBSETS]; // step increment level multiplied by 256 in order to avoid floating calcultations #define LightSet 0 #define SwitchSet 2 // EEPROM signature for aquarium: they are stored in 0 and 1 const byte AQ_SIG1 = 45, AQ_SIG2 = 899; // Initial setup void setup(){ Serial.begin(57600); lcd.init(); //Инициализируем ЖК дисплей lcd.setBacklight(1); //Включаем на ЖК дисплее подсветкуздраствуйте. я не прошу мне написать код, мне было интересно почему не получаеться переписать с аналогово подключения дисплея на цифровое. столько раз получалось а с этим скетчем ни как. я пытаюсь найти более подходящий для меня программу. тем более что люди их выкладывают в свободный доступ. выше будет кусок кода как я обычно прописываю под i2c . какая моя ошибка, подскажите.
Из того что было в предыдущих постах, выходило, что Вы именно хотите, что бы кто-то всё сделал за Вас.
Возможно надо яснее излагать мысли. Но впечатление именно такое, что всё и на халяву, дай дай...
Если это не так, то стоит задать вопрос по новой. И желательно что бы код был спрятан в нужные тэга, а пробелы были пробелами, иначе никто это читать не будет.