Тепличка, понимаю что непервая на форуме :)

Thorn
Offline
Зарегистрирован: 07.11.2014

Здрасте форумчане и форумчанки. Вслед за удачнейшим проекттом АкваКонтроллера и мелочами в виде блутусигрушек :) пришла весна и решил сделать я в парничок АвтоПолив, взял помпу от омывателя лобового нашего ВОЛГАРЯ, 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(); //Если убрать, не работает подсветка уст.позиции

Выручайте братцы - осталось чуть (до конца недели обещал супружнице вкорячить это дело в коробочку).

nevkon
Offline
Зарегистрирован: 20.01.2015

Абсолютно правильно думаете. Вы сами делаете в цикле не равно 1, а чтобы был выход из цикла butLongState должен стать 1.

Thorn
Offline
Зарегистрирован: 07.11.2014

Пробовал делать:

    while(butLongState==1){                                   //Крутим цикл пока не будет Setup
      butLongState=0;
    buttonPS();

в serial вижу: 0 | Z: 521 и как только я вошел в подменю тутже SAVE и вовзврат в меню :(

Ежели делаю:

    while(butLongState==1){                                   //Крутим цикл пока не будет Setup
//      butLongState=0;
    buttonPS();

в serial получаю:

1 | Z: 521
1 | Z: 521

и т.п. и УДЕРЖАНИЕ никак необрабатывается :(

nevkon
Offline
Зарегистрирован: 20.01.2015
Скажите, у вас функция когда-нибудь сработает?
 
16     if(pressTime&&(millis()-pressTime>1000)){       //Если с момента нажатия прошло более 1- секунды
17     butLongState=1;                                 //Поднимаем флаг "удержания" кнопки
18     tone(BeepPin, 7040, 100);                       //Попискиваем при этом
19     pressTime=0;}                                   //Останавливаем отсчет

Или спрошу иначе: millis()-pressTime будет когда-нибудь больше 1000?

Thorn
Offline
Зарегистрирован: 07.11.2014

ммм, время нажатия И сек(милисек) минус время нажатия БОЛЬШЕ 1 сек тогда.... верно?

Иначе сек(милисек) минус время нажатия неМОЖЕТ быть любым и болеше 1 сек оно всегда РАВНО :) верное?

nevkon
Offline
Зарегистрирован: 20.01.2015

Я не могу проследить все изменения переменной pressTime.

Вернее могу, но для этого нужен весь код и много времени. А именно эта переменная отвечает за выход из того цикла.

Thorn
Offline
Зарегистрирован: 07.11.2014

Вот жеж блин, тоетсь стоит попробовать ПРИНЯТИЕ и СОХРАНЕНИЕ изменений в подменю полжить на другую кнопку (к примеру кнайнее правое  положение ..

по аналогии с выходом БЕЗ сохранения:

if (val_X>923 && pos==3){                                //Выход из подменю без сохранения       
      tft.fillScreen(ST7735_BLACK);                       //Clear screen
    return; winMe=pos;} 

сделать:

while(val_X<123 && pos==11){                                   //Крутим цикл пока не будет Setup
      butLongState=1;
    buttonPS();

 

Thorn
Offline
Зарегистрирован: 07.11.2014

Неа, такой метод "тыка" непрошёл. Решил пойти саааамым коротким путем и сделать принятие изменение и сохранение (с выходом из while) по прстому нажатию.... Так:

    while(buttonState==LOW){                                   //Крутим цикл пока не будет Setup
//      butLongState=0;
    buttonPS();

Вывел в serial что только можно:

Serial.print(butLongState);    
Serial.print(" | X: ");
Serial.print(val_X);
Serial.print(" | Y: ");
Serial.print(val_Y);
Serial.print(" | T: ");
Serial.print(pressTime);
Serial.print(" | B: ");
Serial.println(buttonState);

И что вы думаете? Вот кусочек лога при отсутствии нажатия чего бы то нибыло: 1 | X: 521 | Y: 519 | T: 0 | B: 0 - тоесть У меня ЯКОБЫ УДЕРЖАНИЕ имеется !!! (его само собой нет), далее координаты джоя, далее ВРЕМЯ нажатия (ну слава С++ оно равно 0, нажатия то нет) и состояния центральной кнопки (оно само собой также равно0).

Далее жмакаем один раз или удерживаем, и вот лог: 1 | X: 521 | Y: 519 | T: 177178 | B: 0 - и картина МЯГКО говря удручающая. УДЕРЖАНИЕ осталось, изменилось время нажатия а вот самое то главное СОСТОЯНИЕ нажатой кнопки НЕИЗМЕНИЛОСЬ вообще, потому  в подменю как был да так там и остался....)

Выручайте на сей раз братцы.

nevkon
Offline
Зарегистрирован: 20.01.2015

Вот этот ужас в buttonPS():

bool buttonState=digitalRead(axis_Z)==LOW;        //Читаем кнопку

меняем на 2 строки:

bool buttonState;

buttonState=(digitalRead(axis_Z)==LOW);

Знатоки языка если что подправят правильно ли так делать.

Да, обратил внимание на номер пина - 53. У вас мега 2560? Не советую использовать последние 4 цифровых пина - они для SPI используются.

Thorn
Offline
Зарегистрирован: 07.11.2014

Угу сибки, чичас попробую-поправлю. Угу 53 так как я ка кобычно отлаживаю на Mega а потом запихиваю в Nano :) . У меня счас tft spi затянут на последние возможные:

//=====Tft*
#include <Adafruit_GFX.h>            //Core graphics library
#include <Adafruit_ST7735.h>         //Hardware-specific library
#include <SPI.h>                     //6346кб, разница между tft & lcd
#define sclk 52
#define mosi 50
#define cs   44
#define dc   48
#define rst  46                      //You can also connect this to the Arduino reset
Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, mosi, sclk, rst);

 

Thorn
Offline
Зарегистрирован: 07.11.2014

Не, невыходит каменный цветок - такое ощущение что ТОЛЬКО val_X и val_Y работают в цикле подменю, тоесть их serial что то возвращает при взаимодействии с джоем. Однако звуковое сопровождение tone ..... кстати забыл упомянуть и светик нахождения в меню\подменю и действие с центральной кнопкой #define pushLED 9 РАБОТАЕТ, тоетсь всё пищщит и светится (но невыходит и несохраняется)... и да, на всякий случай перекинул цнтрульную кнопку на 39 пин подальше...

nevkon
Offline
Зарегистрирован: 20.01.2015

Сразу еще в объявлении переменных:

bool prevButtonState = FALSE;

И собственно сам обработчик кнопки:

//========== Обработка нажатия кнопки и джойстика 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;
  buttonState=val_Z==HIGH;        //Читаем кнопку (сменил на высокий по причине инверсного сигнала - см. выше по коду)

    if (!buttonState){
      digitalWrite(pushLED,LOW);  tone(BeepPin, 540, 100);
    } else {
      digitalWrite(pushLED,HIGH);
    }

    if (!prevButtonState && buttonState){            //Была не нажата, стала нажата
     pressTime=millis();
    }

    if (!buttonState){
      pressTime=0;                    //При отпускании кнопки - сразу останавливаем отсчет
    }

    if (buttonState && (millis()-pressTime>1000) ){       //Если с момента нажатия прошло более 1- секунды
      butLongState=1;                                 //Поднимаем флаг "удержания" кнопки
      tone(BeepPin, 7040, 100);                       //Попискиваем при этом
      pressTime=0;
    }                                   //Останавливаем отсчет что-бы не переключить несколько раз по одному нажатию 

    prevButtonState=buttonState;                  //Запомнили "прошлое" состояние кнопки
}

Попробуйте заменить функцию кнопки - я ее немного подправил

Thorn
Offline
Зарегистрирован: 07.11.2014

К сожалению ничего. Стало чуть иначе обрабатываться НАЖАТИЕ (не УДЕРЖАНИЕ), тоесть может потому чт оу меня кнопка подтянута к +5В резистором при запуске сразу писк нажатой кнопки, удержание сопровождается ТИШИНОЙ :), но все равно выхода из подменю по нажатию нет. Знаете что, я тут подумал.... Странно что 

Serial.print(" | B: ");
Serial.println(buttonState); - ничего невозвращает.....

И вот решил я while заменить как и в меню, так:

  while(1){ 
//    while(buttonState==LOW){                                   //Крутим цикл пока не будет Setup
      butLongState=0;
    buttonPS();

и теперь при отсутсвии активности джоя 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, но УДЕРЖАНИЕ стало возвращаться. 

Плохо что как был в подменю так там и сижу.... Я иссяк

Thorn
Offline
Зарегистрирован: 07.11.2014

Вобщем сделал так подменю:



//=========== Обработка Меню, параметры и настройка
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(buttonState==LOW){                                   //Крутим цикл пока не будет 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.print(val_X);
//Serial.print(" | Y: ");
//Serial.print(val_Y);
//Serial.print(" | T: ");
//Serial.print(pressTime);
//Serial.print(" | B: ");
//Serial.println(buttonState);
    
    if (setHorClockOn>23) setHorClockOn=0;                  //Ограничиваем значения
    else if (setMinClockOn>59) setMinClockOn=0;
    else if (setHorClockOff>23) setHorClockOff=0;
    else if (setMinClockOff>59) setMinClockOff=0;
                                               //Выход из меню с проверкой и установкой блокировки от возврата       
if (butLongState==1){
      tone(BeepPin, 2040, 100);
    tft.fillScreen(ST7735_BLACK);                                //Clear screen
     break;} 
  }                                                         //Конец цикла

   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[4]);
}

тоесть... я вход в подменю сделал:



  while(1){ 
//    while(buttonState==LOW){                                   //Крутим цикл пока не будет Setup
      butLongState=0;
    buttonPS();

выход так:



if (butLongState==1){
      tone(BeepPin, 2040, 100);
    tft.fillScreen(ST7735_BLACK);                                //Clear screen
     break;} 

наверное это говнокод, но работает все ЕПроМчике сохраняется а это главное.

И всё рано почему в акваконтроллере с ИК кнопками это работало а тут с механикой простейшей (не непринимая в расчет удержание) и нет.

Thorn
Offline
Зарегистрирован: 07.11.2014

Снова небольшой косячок, без помощи второй день бьюся:

Алгоритм следующий. В меня 4-ре параметра полива.

Влажность (если ниже, то....), интервал между ВКЛЮЧЕНИЯМИ датчика (чтобы не так быстро изнашивался химически), интервал ПОЛИВА (время работы помпы) и собственно необходимсоть полива (флаг в меню).

Вот алгоритм сделал, работает исправно (оптимизировать можно СТО процентов%) так-же буду признателен, строк немного.

Итак. Если в ЕПРОМ флаг необходмости полива поднят, то сверяем интервал и если он пройдет - включаем реле датчика влажности почвы. Поднимаем флаг что датчик включен и можно собственно измерять его значени , выводить на мониторчик и если значения НИЖЕ то поднимаем флаг необходимости полива. Далее как тольок интервал пройден и датчик отключен флаг опускаем. Сверяем флаг необходимости полива со значением интервала работы помпы и если автополив нужен включаем его на это время (секунды, минуты). Вот тут и затык - как обыграть этот самый интервал полива в коде. Пробовал поиграть с миллис неполучилось. Выручайте.

Вот код, строк - кот наплакал и коментарии есть :)



//========== Обработка таймера включения датчика Влажности почвы, измерение и автополив
//    byte autoIrrig=0;                   //Флаг состояния автополива(необходимо поднять при включении помпы)
//    byte tIrrig=0;                      //Переменная интервала влючения датчика влажности грунта

void irrigation(){
  if (EEPROM.read(12)==1){          //Если установен флаг необходимости автоплива ВООБЩЕ (в меню)
if (seconds<EEPROM.read(10)){       //Сверяем значение текущего времени с интервалом вклчюения датчика
digitalWrite(OUT0,LOW); tIrrig=1; } //Включаем реле датчика измерения влажности почвы, поднимаем флаг интервала
else if                             //Ежели время непришло, реле разомкнуто и некорродирует :) флаг низкий
(seconds>EEPROM.read(10)){
  digitalWrite(OUT0,HIGH); tIrrig=0;}

//========== Считывание Влажности почвы
  if (tIrrig==1){                                  //Если датчик влажности включен
//  if (millis()-prvMlsMoist>zadTime[0]){          //Проверяем интервал для обновления 
//     prvMlsMoist=millis();
  moistTmp=analogRead(moistIn);                    //Считываем показатели влажности почвы
  moistAO=map(moistTmp,0,1023,99.9,0);}            //Преобразуя в процентное соотношение :)
}

//========== Обработка помпы автополива
  if (moistAO<EEPROM.read(9)&&tIrrig==0){           //Если показания влажности почвы МЕНЬШЕ сохраненных и датчик влажности отключен
if (millis()-prvMlsIrrig>(EEPROM.read(11)*50)){     //Проверяем интервал со значением (в меню также)
      prvMlsIrrig=millis();  
//  tone(A9, 9040, 100);                            //Пискиваем чуток
autoIrrig=1;}  }                                    //И поднимаем флаг необходимости полива
      else if (moistAO>EEPROM.read(9)){             //Ежели показания ВЫШЕ то ничего неделаем и флаг держим низким
//  tone(A9, 2040, 200);
autoIrrig=0;}

if (autoIrrig==1){                                 //Если автоплив нужен - включаем помпочку
  digitalWrite(OUT1,LOW);}
if (autoIrrig==0){                                 //Если нет, то и невключаем
  digitalWrite(OUT1,HIGH);}
//} 
}

 

nevkon
Offline
Зарегистрирован: 20.01.2015

Датчик влажности я так понимаю опрашивается раз в минуту. Тогда лучше сделать так:

if (seconds=EEPROM.read(10)){       //Сверяем значение текущего времени с интервалом вклчюения датчика
  digitalWrite(OUT0,LOW); tIrrig=1;
  moistTmp=analogRead(moistIn);                    //Считываем показатели влажности почвы
  moistAO=map(moistTmp,0,1023,99.9,0);            //Преобразуя в процентное соотношение :)
  digitalWrite(OUT0,HIGH); tIrrig=0;
} //Включаем реле датчика измерения влажности почвы, поднимаем флаг интервала

Эту часть убрать совсем *****************************************************************************************
//========== Считывание Влажности почвы
  if (tIrrig==1){                                  //Если датчик влажности включен
//  if (millis()-prvMlsMoist>zadTime[0]){          //Проверяем интервал для обновления 
//     prvMlsMoist=millis();
  moistTmp=analogRead(moistIn);                    //Считываем показатели влажности почвы
  moistAO=map(moistTmp,0,1023,99.9,0);}            //Преобразуя в процентное соотношение :)
}
********************************************************************************************************************
tIrrig в этом случае не нужен.
Thorn
Offline
Зарегистрирован: 07.11.2014

Всё супер. Только мне-бы время (интервал) работы помпы и его значение в ЕПРОМ - EEPROM.read(11) приделать и поливать именно это время. Тоесть включили датчик, измерили - если нужен полив (вклбючаем помочку на 15 сек к примеру) эти 15 сек я задаю в меню и сохраняю в ЕПРОМчике. А то счас у меня получается ..

Включили датчик, измерили, выключили датчки и если нужен был полив то помпа маслает до следующей проверки(прикиньте если опрашивать раз в час или даже в 10 минут? вот для того и нужно коротенькое время на полив :))

Thorn
Offline
Зарегистрирован: 07.11.2014

Попробовал так:

    if (moistAO<EEPROM.read(9)&&tIrrig==0){autoIrrig=1;}  //Если показания влажности почвы МЕНЬШЕ сохраненных 
//  tone(A9, 9040, 100);                                  //И датчик влажности отключен, поднимаем флаг необходимости полива
    else if (moistAO>EEPROM.read(9)){autoIrrig=0;}        //Ежели показания ВЫШЕ то ничего неделаем и флаг держим низким
    
    if (autoIrrig==1){                                    //Если флажок необходимости автополива поднят
  digitalWrite(OUT1,LOW);                                 //Включаем помпочку на время из заданного в меню
      if (millis()-prvMlsIrrig>EEPROM.read(11)*1000){      //Проверяем интервал для обновления 
     prvMlsIrrig=millis();
     autoIrrig=0;}}
    if (autoIrrig==0){
  digitalWrite(OUT1,HIGH);}

Логика, сверили полученное значение влажности со значением из ЕПРОМ И таймер включения датчика низки (замер непроизводится) и если влажность ниже - поднимаем флаг автополива.

Если автополив необходим включаем (инверсно) реле помпы и если интервал сохранённый в меню (из ЕПРОМ) прошёл - отключаем помпу.

Беда в том что после выключения помпы она су...ко снова включается и тактует циклически, пока ненаступит время для проведения замера и включения реле датчкиа влажности. Тоетс mgjkexbkb некий blink без delay , как то так :) 

bwn
Offline
Зарегистрирован: 25.08.2014

Тогда наверно надо после autoIrrig=0; сделать, чтобы moistAO стало больше EEPROM.read(9)
 

Thorn
Offline
Зарегистрирован: 07.11.2014

Приветствую Вадим. Все гениальное просто, увы и снова вы меня выручаете :).

 К сожалению сделать БОЛЬШЕ неполучается всеравно тактует, сделал РАВНО.

Вот лууп именно патополива и всего чт ос ним связано:

//========== Обработка таймера включения датчика Влажности почвы, измерение и автополив
void irrigation(){
    if (EEPROM.read(12)==1){            //Если установен флаг необходимости проверки датчика влажности почвы (в меню)
  if (seconds<EEPROM.read(10)){         //Сверяем значение текущего времени с интервалом вклчюения датчика
    digitalWrite(OUT0,LOW); tIrrig=1;}  //Включаем реле датчика измерения влажности почвы, поднимаем флаг интервала
  else if (seconds>EEPROM.read(10)){    //Ежели время непришло, реле разомкнуто и некорродирует :) флаг низкий
    digitalWrite(OUT0,HIGH); tIrrig=0;}

//========== Считывание Влажности почвы
  if (tIrrig==1){                                        //Если датчик влажности включен
  if (millis()-prvMlsIrrig>zadTime[1]){                  //Проверяем интервал для обновления 
     prvMlsIrrig=millis();
  moistTmp=analogRead(moistIn);                          //Считываем показатели влажности почвы
  moistAO=map(moistTmp,0,1023,99.9,0);}                  //Преобразуя в процентное соотношение :)
  }
}
//========== Обработка помпы автополива
    if (moistAO<EEPROM.read(9)&&tIrrig==0){autoIrrig=1;}  //Если показания влажности почвы МЕНЬШЕ сохраненных 
//  tone(A9, 9040, 100);                                  //И датчик влажности отключен, поднимаем флаг необходимости полива
    else if (moistAO>EEPROM.read(9)){autoIrrig=0;}        //Ежели показания ВЫШЕ то ничего неделаем и флаг держим низким
    
    if (autoIrrig==1){                                    //Если флажок необходимости автополива поднят
  digitalWrite(OUT1,LOW); tone(A9, 5040, 800);            //Включаем помпочку на время из заданного в меню и попискиваем
      if (millis()-prvMlsIrrig>EEPROM.read(11)*1000){     //Проверяем интервал для обновления 
     prvMlsIrrig=millis();
     autoIrrig=0; moistAO=EEPROM.read(9);}}
    if (autoIrrig==0){
  digitalWrite(OUT1,HIGH);}
}

Заметил чт опри входе в меню можно нарваться на косячок, а именно если помпа работала то они и работает пока висиш в меню, ровн окак и с реле датчика влажности (ну с ним то можно хотя износ контактов остается). Добавил отключаение релюшек (принудительное) если входиш в меню.

Осталось немного запихнуть в коробочку как минимум IP55 - распаячная такая, фотки и результат тоже выложу.

Thorn
Offline
Зарегистрирован: 07.11.2014

Немного освежу проект.  .... вкорячивать (самое сложное оказалось tft - её нужно аккуратненько. Итак распаячная коробочка с высокой степенью водооталкивания :).

Внутри реле 4-х канальное 5-ти вольтовое, ардуинка Nano 30Кб памяти, пьезопищалка, часики на самом простом DS1307 (отстают за пару есяцев на 2-3 минутки), кнопочка-джойстик (замена 5-ти кнопок!!!!) и стабилизатор напряжения для питания всего хозяйства от 5-ти вольт. Стаб на LM2596. Питать всё буду от аккума 12В 12Ач (от ИБП) необслуживаемый.

Чуть фоток предварительного монтажа, осталось добавить клемные колодки для внешних тадчиков температурки и влажности, а также Gnd и Vcc сделать паралельными шинками (с болтиками такие как гусеничка)

 и  и 

 

bwn
Offline
Зарегистрирован: 25.08.2014

А помпа не шустро этот аккум будет убивать?

Thorn
Offline
Зарегистрирован: 07.11.2014

Помпочка насколько помню 25Вт. Это плучается минимум 2А !!! Что довольно много, но учитывая её время работы и производительность, кстти шланг что на фото примерное 6мм (внутр. диаметр), длинна 15м, струя воды на выходе если незажимать порядка 2м!!!, снчала проколол отверстия в ней иголкой, так напором шланг срывало :) и 2 литровая бутылка уткала за 20-30секунд  гдето. Если проект пойдёт посталю туда стаарый аккум от машины. Совсем нехочется делать питание от 220В, очень хочется автономности.

  и 

Вот думаю сделать "подвесной" вариант распыления, через самые дешовые разбрызгиватели из FixPrice которые по 42 руб, однако самое сложное и дорогое это все соединить, в идеале без быстросъемов просто хомутами но на каждый разбрызгиватель идет всего один быстросъёмный штуцер второй нужно докупать (если включать разбрызгиватели последовательно).

bwn
Offline
Зарегистрирован: 25.08.2014

Для подвесной брызгалки часы трэба. Сгорит вся травка без них.((((  Супруга не одобрит)))

Thorn
Offline
Зарегистрирован: 07.11.2014

Всё есть... Алгоритм простой. Два тайймера (оба через меню конечно-же :) ) в них время включения и выключения (часы и минуты) для АВТОПОЛИВА и ВЕНТИЛЯЦИИ. Чтобы ночью нелить и непроветривать, солнышка то нет. Каждый таймер поднимает\опускает флаг (я кстати их очень полюбил применять) который и проверяется уже функцией полива и вентиляции. А потом уже проверяется влажность и прочее.

Thorn
Offline
Зарегистрирован: 07.11.2014

Прошу совета, совета по измерению и контролю напряжения. Измерение - делителем из двух резисторов в R2=10кОм и R1=20кОм.

Определение переменных так:





//=====VoltMeter*
int voltInput=A3;                     //Определяем Аналоговый вход A3 для измерения напряжения
float vout=0.0;
float vin=0.0;
float R1=22200.0;                    //Resistance of R1 (22K) - see text!
float R2=9570.0;                    //Resistance of R2 (12K) - see text!
int valueVo=0;

В setup так:





pinMode(voltInput,INPUT);                        //Определяем вход вольтметра

В функции так:



//========== Считывание напряжения АКБ
void voltM(){
  valueVo=analogRead(voltInput);                         //Read the value at analog input
    vout=(valueVo*5.0)/1023.0;                           //See text
    vin=vout/(R2/(R1+R2)); 
      if (vin<0.09) {vin=0.0;}                           //Statement to quash undesired reading
    if (EEPROM.read(18)==1){                             //Если установен флаг необходимости контроля напряжения батареи (в меню)
    if (vin<EEPROM.read(17)){tone(BeepPin, 2540, 10);}   //Пищщим как угорелые и просим заменить батарейку!!!
    }                             
}

Так вот, при таком раскладе напряжение показывает аж 15В, при том что питаю через стабилизаотор и подаю на вход всего 6,5В. Как быть?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а не проще формулу переписать сразу. должно быть что то вроде

//========== Считывание напряжения АКБ
void voltM(){
  vout=(analogRead(voltInput)*16.6)/1023.0;           //See text
  if (vout<0.09) vout=0.0;                             //Statement to quash undesired reading
  if (EEPROM.read(18)==1){                             //Если установен флаг необходимости контроля напряжения батареи (в меню)
    if (vout<EEPROM.read(17)){
      tone(BeepPin, 2540, 10);   //Пищщим как угорелые и просим заменить батарейку!!!
    }
  }
}

 

Thorn
Offline
Зарегистрирован: 07.11.2014

Да я думал уже о том - незачем постоянно проделывать математические операции с константами да есчо и в функции. однако приходилось "чутку" менять номиналы ПРОГРАМНО потмоу и оставил пока. Тут другое дело, в измерении. При изменении напряжений от +5,9 до 9,1 Вольт (к примеру) показания ардуинки меняются всего на 0,7В !!!!!

Thorn
Offline
Зарегистрирован: 07.11.2014

Схематично выглядит так:

                                                 R1               R2
Vin(входное измеряемое) ----/\/\/\----*----/\/\/\---- GND
                                                           |
                                                           | Vout
                                                           |
                                                            ANALOG PIN (А3)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

измерь для начала питание ардуинки. есть подозрение что там не 5В

Thorn
Offline
Зарегистрирован: 07.11.2014

Питание ровно 5,01В (по МасТечу :) ) - кстати "на всякий случай" запитал дуинку на 30-ую ножку (UIN - которая) это критично? что не на 27-ую (которая +5В)!!

И странное дело, если питаю от USИ то напряжение (vin) возвращается мне ровно 7,08....7,38В) в зависимости горит ли какой светик или нет.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

измерь несколько значений вольтметром и что выдает ардуина чтобы понять что происходит

и для начала попробуй на другой аналоговый вход подать. может попалил ты чего, или сопля какая нибудь висит

да и защиту входа желательно сделать, и конденсатор между входом и землей

конечно. у тебя просадка питания небольшая вот и скачет

Thorn
Offline
Зарегистрирован: 07.11.2014

Все померил - ничего непонимаю.... Питание на стабилизатор (т очто и замеряет дуинка) 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В Чудес небывает - согласен. Но непохоже ни на пробитый аналоговый вход, ниначто такое....

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

нифига почти не понял

Thorn
Offline
Зарегистрирован: 07.11.2014

А что будет если: int voltInput=A3; //Определяем Аналоговый вход A3 для измерения напряжения - и к нему ничего неподключать для измерения? Вот я сейчас залил код в Mega256 подключил просто к USB и вижу в serial.print показания от 3,76В до 4,02В (небольшая просадка светиков да и порт недает 5,0В конечное-же.

Иными словами, нет ни каких резисторов. нет ничего кроме кода и serial - может дело в коде всеже?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

пин в воздухе висит? не подключен? к земле не подтянут?

Thorn
Offline
Зарегистрирован: 07.11.2014

Именно в воздухе :) Если коснуться его то можно увидеть показания до 12,3В!!! даже - я понимаю что наводки от организма.....

Ув. jeka - выручай. ве уже запихнуто в коробочку и работает - неработает именно вольт контроль...... подумал что может попутал номиналы. поменял местаим вормулу R1 и R2 - теперь вообще при изменении измеряемого кнапряжения - показания вообсче неменяются.... 

И вот есчо малюсенький вопрос- у меня писчалка на ЦИФРОВОМ пине за номером 12 - там нет PWM (на nano) и вт в setup - писк типа:

tone(BeepPin, 5040, 1000);

ну прост оИзумителен, а вот в любом месте кода - это су...ко хрип умирающей овцы, тоесть хрипит но неписчит никак - в чём могут быть грабельки? проверял на mega256 этот код и такой-же пин - все писчи кристально читсо а тут как будто напряжения нехватает (повторюсь - именно в коде функции к примеру кнопок или вольтконтроля или флага...)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

перепроверяй: питание, контакты и т.д. и когда во всем будешь уверен можно продолжать. когда слишком много возможных ошибок, проблему тяжело выявить

art100
Offline
Зарегистрирован: 09.03.2014

Урааа. Тепличек много не бывает. Бывает огурки помидорки перчики быстро заканчиваются.

Thorn
Offline
Зарегистрирован: 07.11.2014

Хехе последний пост поднял настроение....

В итогесмутило ЧТО - неменяется напряжение измеренное-оказывается суко припаял н к "Нулю" а к "+" vcc. Сейчас Снивелировал номиналы резисторов с точностью - скока смог - остальное пофиксил в коде. Ну и само собой попутал R1 и R2 поместу пайки. Счас сё пучком и работает. так что....осталось небольшое грабелько

- с ПИСЧАЛКОЙ- у кого какие мысли а то жека походу несталкивался с подобным а опыт в ардуиновском деле - 99% кк у спеху :)

Ну неможет быть виной питание ардуинки когда в setup писчит кристально а в коде шумит и грязно. может какие мои секундомеры в коде..

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

может кто нибудь тебе поможет сделать пищалку на прерываниях. у тебя же пищит потом код исполняется. потом снова пищит

Thorn
Offline
Зарегистрирован: 07.11.2014

Эммм несовсем. Просто в сетап добавил писк при загрузке ардуинки. Потом пищщит если УДЕРЖАНИЕ кнопки, вход в меню, сохранение в епром, аварии. Вов сех случаях отличается тональность и длительность.... Так вот, тольк ов setup писк приятный а во всех остальных случая при любых тонах и длительности писк ГРЯЗНЫЙ (нечёткий) - больше похож на dual-up модем :) кто помнит

Стандарный скетч из набора http://www.arduino.cc/en/Tutorial/Tone - отличненько отрабатывается прям мелодия денди...

Thorn
Offline
Зарегистрирован: 07.11.2014

Смотрите что получилось выснить... вот setup():

void setup() {
  Wire.begin();
//  Serial.begin(9600);                                //Инициализация Serial-порта
  dht.begin();                                       //Инициализация датчика влажности DHT-11
    pinMode(voltInput,INPUT);                        //Определяем вход вольтметра
    pinMode(moistIn, INPUT);                         //Определяем вход измерителя влажности почвы
    pinMode(axis_Z, INPUT);                          //Задаем как вход нажатия кнопки джойстика
    digitalWrite(axis_Z,HIGH);                       //ПОдтягиваем внутреннее сопротивнление ардуинки
    pinMode(pushLED,OUTPUT);                         //Определяем светик нажатия и нахождения в меню
    pinMode(OUT0,OUTPUT);                            //Определяем инверсные выходы реле датчика влажности почвы
    pinMode(OUT1,OUTPUT);                            //Определяем инверсные выходы реле помпы автополива
//    pinMode(bLink,OUTPUT);
    digitalWrite(OUT0,HIGH);                         //Определяем инверсный выход в HIGH реле сенсора почвы
    digitalWrite(OUT1,HIGH);                         //Определяем инверсный выход в HIGH реле помпы полива
    digitalWrite(pushLED,LOW);                         //Определяем инверсный выход в HIGH реле помпы полива
//    digitalWrite(bLink,HIGH);
    tft.initR(INITR_BLACKTAB);                       //Initialize a ST7735S chip, black tab
    tft.fillScreen(ST7735_BLACK);                    //Clear screen
    tone(BeepPin, 5040, 1000);
}  

Если tone(BeepPin, 5040, 1000); в самом конце как сейчас то ХРИПИТ несщадно при загрузке ардуинки, а если tone(BeepPin, 5040, 1000); вставить сразу после Wire.begin(); - то писк КРИСТАЛЬНЫЙ - говорил же что дело в прерываниях.... верно:) а как победить? На Mega такого небыло.....

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

http://robocraft.ru/blog/arduino/614.html

или жди появления максима или dimax они умеют, и при этом помогают

 

Thorn
Offline
Зарегистрирован: 07.11.2014

Жека вы-же тоже помогли - ничегшо себе столько участия и результат ПОЛУЧЕН....

Попробовал библу (чтобы заменить аварийныую индикацию) с таким видом:



//=========== Обработка Аврийного индикатора
void bLinkLed(){
  if (millis()-prvMlsbLink>zadTime[1]){                  //Проверяем интервал для обновления 
    prvMlsbLink=millis();                             //Установка задержки
      digitalWrite(pushLED,!digitalRead(pushLED));}    //Инверсия значения
}

в итоге код стал чутку больше :) но вот tft мой погас напрочь :( - так что либо пока руки кривые либо мирится с такми писком.... 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

вообще есть пищалки со встроенным генератором. просто подаешь питание пищит. посмотри может у тебя завалялась такая

Thorn
Offline
Зарегистрирован: 07.11.2014

Вот, что то подобноя я уже и думал - в игрушках иногда попадались вместе с "соплёй" микросхемкой :)

art100
Offline
Зарегистрирован: 09.03.2014

Thorn пишет:

Вот, что то подобноя я уже и думал - в игрушках иногда попадались вместе с "соплёй" микросхемкой :)

Я в свое время на мелкой атмелке328 ардуинке уно робота сделал а на голосовоую ругань вообще ресурсов никаких. Я тогда из мусорки достал атмел8-ых никому уже не нужных и оцифрованные мои полусекундные голоса ОК Cancel всовывал. Помню на пульте кнопку нажимал робот на колесах бурчал моим 16-битным моно ОК и ехал по новому маршруту. Поищи здесь тема называлась COVOX

bwn
Offline
Зарегистрирован: 25.08.2014

Thorn пишет:

Вот, что то подобноя я уже и думал - в игрушках иногда попадались вместе с "соплёй" микросхемкой :)

Зовется активный буззер, там мелкосхема уже встроенная. На вид они одинаковые совершенно. Ток напругу подавать.

Thorn
Offline
Зарегистрирован: 07.11.2014

Пока исчется такаой бузззер решил кардинально, заметил чт охрипит при

-очистке экрана (заливка в чёрное) к примеру

-перерисовке экрана (через очистку)

Когда удержание кнопки (на неё повешен писк) и вход в меню или смена подменю я вынес писк за break; и всё, прсото ранее пищало при удержании а теперь после смены экрана и сохранении. 

В случае аварии и прочее - писк чистый. Очень странно что в Mega256 с темиже экранчиками и буззерами таких граблей небыло - слабовата Nano :(

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

может дело в количестве таймеров? в меге их больше вроде