Тепличка, понимаю что непервая на форуме :)
- Войдите на сайт для отправки комментариев
Здрасте форумчане и форумчанки. Вслед за удачнейшим проекттом АкваКонтроллера и мелочами в виде блутусигрушек :) пришла весна и решил сделать я в парничок АвтоПолив, взял помпу от омывателя лобового нашего ВОЛГАРЯ, 15 метров шланга (гидроуровень), наделал дырорчек проложил между кустами помидорок. Все это дело жена включала тумблером, в качестве источника питания одна из запасных батарей 12В 12А*Ч (батарея ИБП) и мобильно и удобно.
Вот решил я собрать все это дело и автоматизировать. Определился с задачами:
-Полив (в определенное время, ночью то незачем :) ) по датчику влажности почвы (чтоб неизнашивать электроды решено опрашивать его по таймеру, к примеру раз в минуту, и соответсвенно поавать питание на него также);
-Вентиляция парничка (по датчикам темперетуры и влажности , ds18b20 и DHT-11);
Вроде все и написалось как всегда довольно быстро (за неделю :) ) но дошёл до своего любимого пункта - МЕНЮ), потмоу как незавиимо чтоб совсем.
Да забыл упомянуть, в качестве конnроллера Nano, управление ручное и меню - джойстик PS (он заменил мне сразу ПЯТЬ кнопок). Блок реле (четырёхканальное) для управления моторчиком полива и сервой окошек.
В качестве дисплейчика свой тестовый запасной 1,8" SPI самый су...ко медленный элемент в системе :)
Итак, спасибо кто дочитал. На сейчас все уперлось в применение значений в ПОДменю. Вот как выглядит работа кнопок:
в пределении пинов:
//=====Button PS* #define axis_X 13 //Ось Х подключена к Analog 13 #define axis_Y 12 //Ось Y подключена к Analog 12 #define axis_Z 53 //Ось Z (кнопка джойстика) подключена к Digital 53 #define pushLED 9 //Индикаторный светик нахожения в меню и нажатия кнопки unsigned long pressTime=0; //Запоминаем, когда произошло нажатие кнопки bool prevButtonState; int val_X, val_Y, val_Z=0; //Переменные для хранения значений осей byte buttonState=0; //Флаг состояния нажатия кнопки byte butLongState=0; //Флаг "удержания" кнопки, longClick
в setup() только нажатие кнопки описал:
pinMode(axis_Z, INPUT); //Задаем как вход нажатия кнопки джойстика digitalWrite(axis_Z,HIGH); //ПОдтягиваем внутреннее сопротивнление ардуинки
ну и сам loop() кнопок:
//========== Обработка нажатия кнопки и джойстика PS void buttonPS(){ val_X=analogRead(axis_X); //Считываем аналоговое значение оси Х val_Y=analogRead(axis_Y); //Считываем аналоговое значение оси Y val_Z=digitalRead(axis_Z); //Считываем цифровое значение оси Z (кнопка) val_Z=val_Z^1; //Инвертируем значение bool buttonState=digitalRead(axis_Z)==LOW; //Читаем кнопку if (buttonState==HIGH){ digitalWrite(pushLED,LOW); tone(BeepPin, 540, 100); } else { digitalWrite(pushLED,HIGH);} if(!prevButtonState && buttonState){ //Была не нажата, стала нажата pressTime=millis();} if(!buttonState)pressTime=0; //При отпускании кнопки - сразу останавливаем осчет if(pressTime&&(millis()-pressTime>1000)){ //Если с момента нажатия прошло более 1- секунды butLongState=1; //Поднимаем флаг "удержания" кнопки tone(BeepPin, 7040, 100); //Попискиваем при этом pressTime=0;} //Останавливаем отсчет что-бы не переключить несколько раз по одному нажатию prevButtonState=buttonState; //Запомнили "прошлое" состояние кнопки }
Наверное "моветон" использовать АНАЛОГОВЫЙ джой для дискреных функций - ну несудите строго:)
Вот, в меню и подменю вхожу так:
//========== Обработка Входа в Меню void setUp(){ if (butLongState==1){ //ВХОД В МЕНЮ и проверка блокировки от возврата. Принимаем код клавиши menu();} //Если флаг longClick идем в меню } //=========== Обработка Меню, выбор экрана void menu(){ tft.fillScreen(ST7735_BLUE); //Clear screen tft.setTextSize(1); tft.setTextColor(ST7735_WHITE, ST7735_BLUE); byte pos=0; while(1){ //Бесконечный цикл butLongState=0; buttonPS(); // butLongState=0; digitalWrite(pushLED,LOW); tft.setCursor(5,55); tft.print(pos+1); //Печатаем номер tft.print(". "); tft.print(menuTxt[pos]); //Печатаем название if (val_Y>923 && pos<5) {pos++;} if (val_Y<123 && pos>0) {pos--;} //Уменьшить/увеличить позицию окна меню winMe=pos; //Переменная номера таймера if (butLongState==1 && pos==0) setOnOff(); //"set Timer Soil >" 0 if (butLongState==1 && pos==1) setOnOff(); //"set Timer Temp >" 1 if (butLongState==1 && pos==2) setIrrigation(); //"set Irrigation >" 2 if (butLongState==1 && pos==3) setTermoRele(); //"set TermoRele >>" 3 if (butLongState==1 && pos==4) setVoltControl(); //"set VoltControl>" 4 if (butLongState==1 && pos==5) setClock(); //"set Clock >>>>>>" 5 //Serial.println(value_Y); //Serial.println(butLongState); //Serial.println(val_X); //Serial.println(val_Z); if (val_X>923){ //Выход из меню с проверкой и установкой блокировки от возврата tone(BeepPin, 4040, 500); tft.fillScreen(ST7735_BLACK); //Clear screen break;} } }
Тоесть по УДЕРЖАНИЮ кнопки джоя я попадаю в меню, ВЛЕВО - выхожу из меню без входа в подменю, ВВЕРХ ВНИЗ по пунктам меню. Снова УДЕРЖАНИЕ и вход в подменю.
Всё чётко (только дисплей сабака дикая тупит и медлит работу)
Далее к примеру таймер-1 и его подменю:
//=========== Обработка Меню, параметры и настройка void setOnOff(){ byte pos=0; setHorClockOn= EEPROM.read(winMe*4+1); //Считываем записанные значения таймеров setMinClockOn= EEPROM.read(winMe*4+2); //Адрес определяется как номер таймера*4 + четыре ячейки setHorClockOff= EEPROM.read(winMe*4+3); setMinClockOff= EEPROM.read(winMe*4+4); tft.fillScreen(ST7735_RED); //Clear screen // while(1){ while(butLongState==1){ //Крутим цикл пока не будет Setup butLongState=0; buttonPS(); //Если убрать, не работает подсветка уст.позиции tft.setCursor(45,40); tft.setTextColor(ST7735_YELLOW,ST7735_RED); tft.setTextSize(1); tft.print(" On Off"); tft.setCursor(5,70); tft.setTextColor(ST7735_GREEN, ST7735_RED); tft.print("=== set to save ==="); tft.setCursor(5,55); tft.print(winMe+1,DEC); //Печатаем номер программы таймера tft.print("|"); tft.print(pos/3,DEC); //Печатаем позицию настройки параметра (замена blink) tft.print(" ->"); tft.setCursor(45,55); //Выводим инфу о часах и минутах if (setHorClockOn<10) tft.print("0"); tft.print(setHorClockOn,DEC); tft.print(":"); if (setMinClockOn<10) tft.print("0"); tft.print(setMinClockOn,DEC); tft.print(" "); if (setHorClockOff<10) tft.print("0"); tft.print(setHorClockOff,DEC); tft.print(":"); if (setMinClockOff<10) tft.print("0"); tft.print(setMinClockOff,DEC); tft.setCursor(pos,0); //Устанавливаем курсор согласно позиции if (val_X>923 && pos==3){ //Выход из подменю без сохранения tft.fillScreen(ST7735_BLACK); //Clear screen return; winMe=pos;} //Serial.print(butLongState); //Serial.print(" | Z: "); //Serial.println(buttonState); if (pos<3) pos=3; if (val_X<123 && pos<11) pos += 3; //Крутим позицию право-лево else if (val_X>923 && pos>3) pos -= 3; else if (pos==3 && val_Y>1020) setHorClockOn++; //Крутим значения else if (pos==3 && val_Y<10) setHorClockOn--; else if (pos==6 && val_Y>1020) setMinClockOn++; else if (pos==6 && val_Y<10) setMinClockOn--; else if (pos==9 && val_Y>1020) setHorClockOff++; else if (pos==9 && val_Y<10) setHorClockOff--; else if (pos==12 && val_Y>1020) setMinClockOff++; else if (pos==12 && val_Y<10) setMinClockOff--; Serial.print(butLongState); Serial.print(" | X: "); Serial.println(val_X); if (setHorClockOn>23) setHorClockOn=0; //Ограничиваем значения else if (setMinClockOn>59) setMinClockOn=0; else if (setHorClockOff>23) setHorClockOff=0; else if (setMinClockOff>59) setMinClockOff=0; } //Конец цикла // lcd.noBlink(); tft.fillScreen(ST7735_BLACK); // Clear screen EEPROM.write(winMe*4+1, setHorClockOn); //Записываем НОВЫЕ значения EEPROM.write(winMe*4+2, setMinClockOn); EEPROM.write(winMe*4+3, setHorClockOff); EEPROM.write(winMe*4+4, setMinClockOff); tft.setCursor(25,105); tft.setTextColor(ST7735_WHITE,ST7735_BLACK); tft.setTextSize(1); tft.print("== Saved =="); delay(zadTime[5]); } void setIrrigation(){ byte pos=0; setMoistIn= EEPROM.read(winMe*2+1); //Считываем записанные значения таймеров setSoiltIn= EEPROM.read(winMe*2+2); //Адрес определяется как номер таймера*4 + четыре ячейки tft.setCursor(25,105); tft.setTextColor(ST7735_WHITE,ST7735_BLACK); tft.setTextSize(1); tft.print("== Saved =="); delay(zadTime[4]); }
И ничего ... тоест ья спокойно перемещаюсь по
if (pos<3) pos=3; if (val_X<123 && pos<11) pos += 3; //Крутим позицию право-лево else if (val_X>923 && pos>3) pos -= 3; else if (pos==3 && val_Y>1020) setHorClockOn++; //Крутим значения else if (pos==3 && val_Y<10) setHorClockOn--; else if (pos==6 && val_Y>1020) setMinClockOn++; else if (pos==6 && val_Y<10) setMinClockOn--; else if (pos==9 && val_Y>1020) setHorClockOff++; else if (pos==9 && val_Y<10) setHorClockOff--; else if (pos==12 && val_Y>1020) setMinClockOff++; else if (pos==12 && val_Y<10) setMinClockOff--;
и даже в serial мониторю положения джоя и центральной кнопки
Serial.print(butLongState);
Serial.print(" | X: ");
Serial.println(val_X);
но как я был в нем так и остаюсь :( (горько плакаю), ХОТЯ без сохранения могу выти преспокойно
if (val_X>923 && pos==3){ //Выход из подменю без сохранения
tft.fillScreen(ST7735_BLACK); //Clear screen
return; winMe=pos;}
Здаётся мне что намудрил я гдето тут:
while(butLongState!=1){ //Крутим цикл пока не будет Setup
butLongState=0;
buttonPS(); //Если убрать, не работает подсветка уст.позиции
Выручайте братцы - осталось чуть (до конца недели обещал супружнице вкорячить это дело в коробочку).
Абсолютно правильно думаете. Вы сами делаете в цикле не равно 1, а чтобы был выход из цикла butLongState должен стать 1.
Пробовал делать:
в serial вижу: 0 | Z: 521 и как только я вошел в подменю тутже SAVE и вовзврат в меню :(
Ежели делаю:
в serial получаю:
1 | Z: 521
1 | Z: 521
и т.п. и УДЕРЖАНИЕ никак необрабатывается :(
16
if
(pressTime&&(millis()-pressTime>1000)){
//Если с момента нажатия прошло более 1- секунды
17
butLongState=1;
//Поднимаем флаг "удержания" кнопки
18
tone(BeepPin, 7040, 100);
//Попискиваем при этом
19
pressTime=0;}
//Останавливаем отсчет
Или спрошу иначе: millis()-pressTime будет когда-нибудь больше 1000?
ммм, время нажатия И сек(милисек) минус время нажатия БОЛЬШЕ 1 сек тогда.... верно?
Иначе сек(милисек) минус время нажатия неМОЖЕТ быть любым и болеше 1 сек оно всегда РАВНО :) верное?
Я не могу проследить все изменения переменной pressTime.
Вернее могу, но для этого нужен весь код и много времени. А именно эта переменная отвечает за выход из того цикла.
Вот жеж блин, тоетсь стоит попробовать ПРИНЯТИЕ и СОХРАНЕНИЕ изменений в подменю полжить на другую кнопку (к примеру кнайнее правое положение ..
по аналогии с выходом БЕЗ сохранения:
сделать:
Неа, такой метод "тыка" непрошёл. Решил пойти саааамым коротким путем и сделать принятие изменение и сохранение (с выходом из while) по прстому нажатию.... Так:
Вывел в serial что только можно:
И что вы думаете? Вот кусочек лога при отсутствии нажатия чего бы то нибыло: 1 | X: 521 | Y: 519 | T: 0 | B: 0 - тоесть У меня ЯКОБЫ УДЕРЖАНИЕ имеется !!! (его само собой нет), далее координаты джоя, далее ВРЕМЯ нажатия (ну слава С++ оно равно 0, нажатия то нет) и состояния центральной кнопки (оно само собой также равно0).
Далее жмакаем один раз или удерживаем, и вот лог: 1 | X: 521 | Y: 519 | T: 177178 | B: 0 - и картина МЯГКО говря удручающая. УДЕРЖАНИЕ осталось, изменилось время нажатия а вот самое то главное СОСТОЯНИЕ нажатой кнопки НЕИЗМЕНИЛОСЬ вообще, потому в подменю как был да так там и остался....)
Выручайте на сей раз братцы.
Вот этот ужас в buttonPS():
bool
buttonState=digitalRead(axis_Z)==LOW;
//Читаем кнопку
меняем на 2 строки:
bool
buttonState;
buttonState=(digitalRead(axis_Z)==LOW);
Знатоки языка если что подправят правильно ли так делать.
Да, обратил внимание на номер пина - 53. У вас мега 2560? Не советую использовать последние 4 цифровых пина - они для SPI используются.
Угу сибки, чичас попробую-поправлю. Угу 53 так как я ка кобычно отлаживаю на Mega а потом запихиваю в Nano :) . У меня счас tft spi затянут на последние возможные:
Не, невыходит каменный цветок - такое ощущение что ТОЛЬКО val_X и val_Y работают в цикле подменю, тоесть их serial что то возвращает при взаимодействии с джоем. Однако звуковое сопровождение tone ..... кстати забыл упомянуть и светик нахождения в меню\подменю и действие с центральной кнопкой #define pushLED 9 РАБОТАЕТ, тоетсь всё пищщит и светится (но невыходит и несохраняется)... и да, на всякий случай перекинул цнтрульную кнопку на 39 пин подальше...
Сразу еще в объявлении переменных:
bool
prevButtonState = FALSE;
И собственно сам обработчик кнопки:
Попробуйте заменить функцию кнопки - я ее немного подправил
К сожалению ничего. Стало чуть иначе обрабатываться НАЖАТИЕ (не УДЕРЖАНИЕ), тоесть может потому чт оу меня кнопка подтянута к +5В резистором при запуске сразу писк нажатой кнопки, удержание сопровождается ТИШИНОЙ :), но все равно выхода из подменю по нажатию нет. Знаете что, я тут подумал.... Странно что
Serial.print(" | B: ");
Serial.println(buttonState); - ничего невозвращает.....
И вот решил я while заменить как и в меню, так:
и теперь при отсутсвии активности джоя serial выводит: 0 | X: 521 | Y: 519 | T: 0 | B: 0
а при УДЕРЖАНИИ видим:
0 | X: 521 | Y: 518 | T: 16571 | B: 0
1 | X: 520 | Y: 518 | T: 0 | B: 0
тоетсь вроде все есть (только состояние нажатия как небыло так и нет | B: 0, но УДЕРЖАНИЕ стало возвращаться.
Плохо что как был в подменю так там и сижу.... Я иссяк
Вобщем сделал так подменю:
тоесть... я вход в подменю сделал:
выход так:
наверное это говнокод, но работает все ЕПроМчике сохраняется а это главное.
И всё рано почему в акваконтроллере с ИК кнопками это работало а тут с механикой простейшей (не непринимая в расчет удержание) и нет.
Снова небольшой косячок, без помощи второй день бьюся:
Алгоритм следующий. В меня 4-ре параметра полива.
Влажность (если ниже, то....), интервал между ВКЛЮЧЕНИЯМИ датчика (чтобы не так быстро изнашивался химически), интервал ПОЛИВА (время работы помпы) и собственно необходимсоть полива (флаг в меню).
Вот алгоритм сделал, работает исправно (оптимизировать можно СТО процентов%) так-же буду признателен, строк немного.
Итак. Если в ЕПРОМ флаг необходмости полива поднят, то сверяем интервал и если он пройдет - включаем реле датчика влажности почвы. Поднимаем флаг что датчик включен и можно собственно измерять его значени , выводить на мониторчик и если значения НИЖЕ то поднимаем флаг необходимости полива. Далее как тольок интервал пройден и датчик отключен флаг опускаем. Сверяем флаг необходимости полива со значением интервала работы помпы и если автополив нужен включаем его на это время (секунды, минуты). Вот тут и затык - как обыграть этот самый интервал полива в коде. Пробовал поиграть с миллис неполучилось. Выручайте.
Вот код, строк - кот наплакал и коментарии есть :)
Датчик влажности я так понимаю опрашивается раз в минуту. Тогда лучше сделать так:
Всё супер. Только мне-бы время (интервал) работы помпы и его значение в ЕПРОМ - EEPROM.read(11) приделать и поливать именно это время. Тоесть включили датчик, измерили - если нужен полив (вклбючаем помочку на 15 сек к примеру) эти 15 сек я задаю в меню и сохраняю в ЕПРОМчике. А то счас у меня получается ..
Включили датчик, измерили, выключили датчки и если нужен был полив то помпа маслает до следующей проверки(прикиньте если опрашивать раз в час или даже в 10 минут? вот для того и нужно коротенькое время на полив :))
Попробовал так:
Логика, сверили полученное значение влажности со значением из ЕПРОМ И таймер включения датчика низки (замер непроизводится) и если влажность ниже - поднимаем флаг автополива.
Если автополив необходим включаем (инверсно) реле помпы и если интервал сохранённый в меню (из ЕПРОМ) прошёл - отключаем помпу.
Беда в том что после выключения помпы она су...ко снова включается и тактует циклически, пока ненаступит время для проведения замера и включения реле датчкиа влажности. Тоетс mgjkexbkb некий blink без delay , как то так :)
Тогда наверно надо после autoIrrig=0; сделать, чтобы moistAO стало больше EEPROM.read(9)
Приветствую Вадим. Все гениальное просто, увы и снова вы меня выручаете :).
К сожалению сделать БОЛЬШЕ неполучается всеравно тактует, сделал РАВНО.
Вот лууп именно патополива и всего чт ос ним связано:
Заметил чт опри входе в меню можно нарваться на косячок, а именно если помпа работала то они и работает пока висиш в меню, ровн окак и с реле датчика влажности (ну с ним то можно хотя износ контактов остается). Добавил отключаение релюшек (принудительное) если входиш в меню.
Осталось немного запихнуть в коробочку как минимум IP55 - распаячная такая, фотки и результат тоже выложу.
Немного освежу проект. .... вкорячивать (самое сложное оказалось tft - её нужно аккуратненько. Итак распаячная коробочка с высокой степенью водооталкивания :).
Внутри реле 4-х канальное 5-ти вольтовое, ардуинка Nano 30Кб памяти, пьезопищалка, часики на самом простом DS1307 (отстают за пару есяцев на 2-3 минутки), кнопочка-джойстик (замена 5-ти кнопок!!!!) и стабилизатор напряжения для питания всего хозяйства от 5-ти вольт. Стаб на LM2596. Питать всё буду от аккума 12В 12Ач (от ИБП) необслуживаемый.
Чуть фоток предварительного монтажа, осталось добавить клемные колодки для внешних тадчиков температурки и влажности, а также Gnd и Vcc сделать паралельными шинками (с болтиками такие как гусеничка)
А помпа не шустро этот аккум будет убивать?
Помпочка насколько помню 25Вт. Это плучается минимум 2А !!! Что довольно много, но учитывая её время работы и производительность, кстти шланг что на фото примерное 6мм (внутр. диаметр), длинна 15м, струя воды на выходе если незажимать порядка 2м!!!, снчала проколол отверстия в ней иголкой, так напором шланг срывало :) и 2 литровая бутылка уткала за 20-30секунд гдето. Если проект пойдёт посталю туда стаарый аккум от машины. Совсем нехочется делать питание от 220В, очень хочется автономности.
Вот думаю сделать "подвесной" вариант распыления, через самые дешовые разбрызгиватели из FixPrice которые по 42 руб, однако самое сложное и дорогое это все соединить, в идеале без быстросъемов просто хомутами но на каждый разбрызгиватель идет всего один быстросъёмный штуцер второй нужно докупать (если включать разбрызгиватели последовательно).
Для подвесной брызгалки часы трэба. Сгорит вся травка без них.(((( Супруга не одобрит)))
Всё есть... Алгоритм простой. Два тайймера (оба через меню конечно-же :) ) в них время включения и выключения (часы и минуты) для АВТОПОЛИВА и ВЕНТИЛЯЦИИ. Чтобы ночью нелить и непроветривать, солнышка то нет. Каждый таймер поднимает\опускает флаг (я кстати их очень полюбил применять) который и проверяется уже функцией полива и вентиляции. А потом уже проверяется влажность и прочее.
Прошу совета, совета по измерению и контролю напряжения. Измерение - делителем из двух резисторов в R2=10кОм и R1=20кОм.
Определение переменных так:
В setup так:
В функции так:
Так вот, при таком раскладе напряжение показывает аж 15В, при том что питаю через стабилизаотор и подаю на вход всего 6,5В. Как быть?
а не проще формулу переписать сразу. должно быть что то вроде
Да я думал уже о том - незачем постоянно проделывать математические операции с константами да есчо и в функции. однако приходилось "чутку" менять номиналы ПРОГРАМНО потмоу и оставил пока. Тут другое дело, в измерении. При изменении напряжений от +5,9 до 9,1 Вольт (к примеру) показания ардуинки меняются всего на 0,7В !!!!!
Схематично выглядит так:
R1 R2
Vin(входное измеряемое) ----/\/\/\----*----/\/\/\---- GND
|
| Vout
|
ANALOG PIN (А3)
измерь для начала питание ардуинки. есть подозрение что там не 5В
Питание ровно 5,01В (по МасТечу :) ) - кстати "на всякий случай" запитал дуинку на 30-ую ножку (UIN - которая) это критично? что не на 27-ую (которая +5В)!!
И странное дело, если питаю от USИ то напряжение (vin) возвращается мне ровно 7,08....7,38В) в зависимости горит ли какой светик или нет.
измерь несколько значений вольтметром и что выдает ардуина чтобы понять что происходит
и для начала попробуй на другой аналоговый вход подать. может попалил ты чего, или сопля какая нибудь висит
да и защиту входа желательно сделать, и конденсатор между входом и землей
конечно. у тебя просадка питания небольшая вот и скачет
Все померил - ничего непонимаю.... Питание на стабилизатор (т очто и замеряет дуинка) 6,18В. Питание на ардуинке - 5,05В. Показания при питании от USB - 6.34В, при питании от стабилизатора (6,18В) - 13,4В. Тоесть "нулевое" значение у дуинки считаем 6,34В. Ладно хрен с ним - отниму если что. Однако повышение напряжения до 11,1В (измеряемое) вызывает изменение измеренного (того что возвращает нам vin) всего 15,0В. Тоесть повышение напряжения с 6,18 до 11,1 В на 4,92В в реале, а ардуинка считает что изменение было всего с 13,4 до 15,0 на 1,6В Чудес небывает - согласен. Но непохоже ни на пробитый аналоговый вход, ниначто такое....
нифига почти не понял
А что будет если: int voltInput=A3; //Определяем Аналоговый вход A3 для измерения напряжения - и к нему ничего неподключать для измерения? Вот я сейчас залил код в Mega256 подключил просто к USB и вижу в serial.print показания от 3,76В до 4,02В (небольшая просадка светиков да и порт недает 5,0В конечное-же.
Иными словами, нет ни каких резисторов. нет ничего кроме кода и serial - может дело в коде всеже?
пин в воздухе висит? не подключен? к земле не подтянут?
Именно в воздухе :) Если коснуться его то можно увидеть показания до 12,3В!!! даже - я понимаю что наводки от организма.....
Ув. jeka - выручай. ве уже запихнуто в коробочку и работает - неработает именно вольт контроль...... подумал что может попутал номиналы. поменял местаим вормулу R1 и R2 - теперь вообще при изменении измеряемого кнапряжения - показания вообсче неменяются....
И вот есчо малюсенький вопрос- у меня писчалка на ЦИФРОВОМ пине за номером 12 - там нет PWM (на nano) и вт в setup - писк типа:
tone(BeepPin, 5040, 1000);
ну прост оИзумителен, а вот в любом месте кода - это су...ко хрип умирающей овцы, тоесть хрипит но неписчит никак - в чём могут быть грабельки? проверял на mega256 этот код и такой-же пин - все писчи кристально читсо а тут как будто напряжения нехватает (повторюсь - именно в коде функции к примеру кнопок или вольтконтроля или флага...)
перепроверяй: питание, контакты и т.д. и когда во всем будешь уверен можно продолжать. когда слишком много возможных ошибок, проблему тяжело выявить
Урааа. Тепличек много не бывает. Бывает огурки помидорки перчики быстро заканчиваются.
Хехе последний пост поднял настроение....
В итогесмутило ЧТО - неменяется напряжение измеренное-оказывается суко припаял н к "Нулю" а к "+" vcc. Сейчас Снивелировал номиналы резисторов с точностью - скока смог - остальное пофиксил в коде. Ну и само собой попутал R1 и R2 поместу пайки. Счас сё пучком и работает. так что....осталось небольшое грабелько
- с ПИСЧАЛКОЙ- у кого какие мысли а то жека походу несталкивался с подобным а опыт в ардуиновском деле - 99% кк у спеху :)
Ну неможет быть виной питание ардуинки когда в setup писчит кристально а в коде шумит и грязно. может какие мои секундомеры в коде..
может кто нибудь тебе поможет сделать пищалку на прерываниях. у тебя же пищит потом код исполняется. потом снова пищит
Эммм несовсем. Просто в сетап добавил писк при загрузке ардуинки. Потом пищщит если УДЕРЖАНИЕ кнопки, вход в меню, сохранение в епром, аварии. Вов сех случаях отличается тональность и длительность.... Так вот, тольк ов setup писк приятный а во всех остальных случая при любых тонах и длительности писк ГРЯЗНЫЙ (нечёткий) - больше похож на dual-up модем :) кто помнит
Стандарный скетч из набора http://www.arduino.cc/en/Tutorial/Tone - отличненько отрабатывается прям мелодия денди...
Смотрите что получилось выснить... вот setup():
Если tone(BeepPin, 5040, 1000); в самом конце как сейчас то ХРИПИТ несщадно при загрузке ардуинки, а если tone(BeepPin, 5040, 1000); вставить сразу после Wire.begin(); - то писк КРИСТАЛЬНЫЙ - говорил же что дело в прерываниях.... верно:) а как победить? На Mega такого небыло.....
http://robocraft.ru/blog/arduino/614.html
или жди появления максима или dimax они умеют, и при этом помогают
Жека вы-же тоже помогли - ничегшо себе столько участия и результат ПОЛУЧЕН....
Попробовал библу (чтобы заменить аварийныую индикацию) с таким видом:
в итоге код стал чутку больше :) но вот tft мой погас напрочь :( - так что либо пока руки кривые либо мирится с такми писком....
вообще есть пищалки со встроенным генератором. просто подаешь питание пищит. посмотри может у тебя завалялась такая
Вот, что то подобноя я уже и думал - в игрушках иногда попадались вместе с "соплёй" микросхемкой :)
Вот, что то подобноя я уже и думал - в игрушках иногда попадались вместе с "соплёй" микросхемкой :)
Я в свое время на мелкой атмелке328 ардуинке уно робота сделал а на голосовоую ругань вообще ресурсов никаких. Я тогда из мусорки достал атмел8-ых никому уже не нужных и оцифрованные мои полусекундные голоса ОК Cancel всовывал. Помню на пульте кнопку нажимал робот на колесах бурчал моим 16-битным моно ОК и ехал по новому маршруту. Поищи здесь тема называлась COVOX
Вот, что то подобноя я уже и думал - в игрушках иногда попадались вместе с "соплёй" микросхемкой :)
Зовется активный буззер, там мелкосхема уже встроенная. На вид они одинаковые совершенно. Ток напругу подавать.
Пока исчется такаой бузззер решил кардинально, заметил чт охрипит при
-очистке экрана (заливка в чёрное) к примеру
-перерисовке экрана (через очистку)
Когда удержание кнопки (на неё повешен писк) и вход в меню или смена подменю я вынес писк за break; и всё, прсото ранее пищало при удержании а теперь после смены экрана и сохранении.
В случае аварии и прочее - писк чистый. Очень странно что в Mega256 с темиже экранчиками и буззерами таких граблей небыло - слабовата Nano :(
может дело в количестве таймеров? в меге их больше вроде