меню и управление прошивками на флешке

maksim
Offline
Зарегистрирован: 12.02.2012

Попробуйте так

#include <LiquidCrystalRus.h>
LiquidCrystalRus lcd(12, 11, 5, 4, 3, 2);

int mode = 0;

void setup() {
  lcd.begin(16, 2); 
  lcd.print("Привет, мир!"); 
  SETUP();

  switch(mode){
  case 1:
    setup1();
    break;

  case 2:
    setup2();
    break;

  case 3:
    setup3();
    break;
  }   
}

void loop() {
  switch(mode){
  case 1:
    loop1();
    break;

  case 2:
    loop2();
    break;

  case 3:
    loop3();
    break;
  }   
}


void SETUP(){
  boolean setup_end = 0;
  int button, buttonState = 0;
  while(!setup_end){
    int buttonRead = analogRead(A0);
    delay(100);
    if(buttonRead == analogRead(A0)){
      if(buttonRead > 255 && buttonRead < 511){
        button = 1;
      }
      else if(buttonRead > 511 && buttonRead < 767){
        button = 2;
      }
      else if(buttonRead > 767 && buttonRead < 1023){
        button = 3;
      }
      else{
        button = 0;
      }
    }
    if(button != buttonState){
      switch(button){
      case 1:
        mode++;
        break;

      case 2:
        mode--;
        break;

      case 3:
        setup_end = 1;
        break;
      }
      mode = constrain(mode, 0, 3);
      switch(mode){
      case 1:
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Blink");
        break;

      case 2:
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("DigitalReadSerial");
        break;

      case 3:
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Button");
        break;
      }   
      buttonState = button;
    }
  }
}


//--------------------- Скейтч  Blink  ------------------------

void setup1() {
  pinMode(13, OUTPUT);
}

void loop1() {
  digitalWrite(13, HIGH);   // set the LED on
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // set the LED off
  delay(1000);              // wait for a second
}
//--------------------------------------------------------------




//------------------ Скейтч DigitalReadSerial ------------------

void setup2() {
  Serial.begin(9600);
  pinMode(6, INPUT);
}

void loop2() {
  int sensorValue = digitalRead(6);
  Serial.println(sensorValue, DEC);
}
//--------------------------------------------------------------




//------------------ Скейтч Button ------------------

const int buttonPin = 6;  
const int ledPin =  13;     

int buttonState = 0;   

void setup3() {
  pinMode(ledPin, OUTPUT);      
  pinMode(buttonPin, INPUT);     
}

void loop3(){
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {       
    digitalWrite(ledPin, HIGH);  
  } 
  else {
    digitalWrite(ledPin, LOW); 
  }
}
//--------------------------------------------------------------









 

maksim
Offline
Зарегистрирован: 12.02.2012

Кнопки как подключены? 

dronsoft
Offline
Зарегистрирован: 02.06.2011

на аналоговом порту а4

maksim
Offline
Зарегистрирован: 12.02.2012

А как вы их подключаете? 

maksim
Offline
Зарегистрирован: 12.02.2012
#include <LiquidCrystalRus.h>
LiquidCrystalRus lcd(12, 11, 5, 4, 3, 2);

int mode = 0;

void setup() {
  lcd.begin(16, 2); 
  lcd.print("Привет, мир!"); 
  SETUP();

  switch(mode){
  case 1:
    setup1();
    break;

  case 2:
    setup2();
    break;

  case 3:
    setup3();
    break;
  }   
}

void loop() {
  switch(mode){
  case 1:
    loop1();
    break;

  case 2:
    loop2();
    break;

  case 3:
    loop3();
    break;
  }   
}


void SETUP(){
  boolean setup_end = 0;
  int button, buttonState = 0;
  while(!setup_end){
    int buttonRead = analogRead(A0);
    delay(100);
    if(buttonRead == analogRead(A0)){
      if(buttonRead > 290 && buttonRead < 390){
        button = 1;
      }
      else if(buttonRead > 460 && buttonRead < 560){
        button = 2;
      }
      else if(buttonRead > 950 && buttonRead < 1023){
        button = 3;
      }
      else{
        button = 0;
      }
    }
    if(button != buttonState){
      switch(button){
      case 1:
        mode++;
        break;

      case 2:
        mode--;
        break;

      case 3:
        setup_end = 1;
        break;
      }
      mode = constrain(mode, 0, 3);
      switch(mode){
      case 1:
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Blink");
        break;

      case 2:
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("DigitalReadSerial");
        break;

      case 3:
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Button");
        break;
      }   
      buttonState = button;
    }
  }
}


//--------------------- Скейтч  Blink  ------------------------

void setup1() {
  pinMode(13, OUTPUT);
}

void loop1() {
  digitalWrite(13, HIGH);   // set the LED on
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // set the LED off
  delay(1000);              // wait for a second
}
//--------------------------------------------------------------




//------------------ Скейтч DigitalReadSerial ------------------

void setup2() {
  Serial.begin(9600);
  pinMode(6, INPUT);
}

void loop2() {
  int sensorValue = digitalRead(6);
  Serial.println(sensorValue, DEC);
}
//--------------------------------------------------------------




//------------------ Скейтч Button ------------------

const int buttonPin = 6;  
const int ledPin =  13;     

int buttonState = 0;   

void setup3() {
  pinMode(ledPin, OUTPUT);      
  pinMode(buttonPin, INPUT);     
}

void loop3(){
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {       
    digitalWrite(ledPin, HIGH);  
  } 
  else {
    digitalWrite(ledPin, LOW); 
  }
}
//--------------------------------------------------------------








подключать так

 

dronsoft
Offline
Зарегистрирован: 02.06.2011

 понял я только подключал без сопротивления на землю

 

dronsoft
Offline
Зарегистрирован: 02.06.2011

А для чего А0 использовать для кнопок

я к А4 вроде цеплялся или есть разница?

dronsoft
Offline
Зарегистрирован: 02.06.2011

 и номинал сопротивлений чет не понял 

maksim
Offline
Зарегистрирован: 12.02.2012

К какому аналоговому входу не важно, главное в скейтче в двух местах поменять с А0 на А4. Номиналы от 1 кОм до 5 кОм только что бы все три резистора были одинакого номинала.

dronsoft
Offline
Зарегистрирован: 02.06.2011

Ок я понял спасибо как проверю отпишусь

 

dronsoft
Offline
Зарегистрирован: 02.06.2011

подключил но что то не так включился только блинк и то не понял от какой кнопки

dronsoft
Offline
Зарегистрирован: 02.06.2011

 сопротивления нашел по 3.3 кО

 

maksim
Offline
Зарегистрирован: 12.02.2012

Режимы не от кнопок включаются, а кнопками из меню выбирается нужный режим. Опишите подробнее, что не так? дисплей работает? названия режимов выводится? режимы переключаются? выбираются?

dronsoft
Offline
Зарегистрирован: 02.06.2011

 дисплей работает. в начале пишет привет мир потом блинк при нажатии кнопок тишина пишет блинк и все и ни каких действий

dronsoft
Offline
Зарегистрирован: 02.06.2011

 через какоето время вкючается режим буттон

 

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

dronsoft пишет:

А не кто не пробывал с меню использовать LCD 1202 от Nokia&&&&?????

 

dronsoft
Offline
Зарегистрирован: 02.06.2011

Phreaker Chernie пишет:

dronsoft пишет:

А не кто не пробывал с меню использовать LCD 1202 от Nokia&&&&?????

 

Я такого не писал!!!

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

Ой ссорри это у меня чет опера глючит!!! Эт мой вопрос=) 

maksim
Offline
Зарегистрирован: 12.02.2012

Скорее всего , что то не так с кнопками.

В стандартных примерех есть скейтч AnalogReadSerial, меняете А0 на свой вход (А4) заливаете скейтч в дуину, запускаете сериал монитор и смотрите - при нажатии на кнопки значения в сериал мониторе должно меняться, составляете такую табличку:

ничего не нажато - 0

нажата 1 кнопка - 340

нажата 2 кнопка - 510

нажата 3 кнопка - 1020

 

dronsoft
Offline
Зарегистрирован: 02.06.2011

 ок ща попробуем

 

dronsoft
Offline
Зарегистрирован: 02.06.2011

maksim пишет:

ничего не нажато - 0

нажата 1 кнопка - 340

нажата 2 кнопка - 510

нажата 3 кнопка - 1020

 

Почему именно эти цифры я так понимаю они дожны меняться от номинала сопротивления

maksim
Offline
Зарегистрирован: 12.02.2012

Как вы подключаете кнопки?

dronsoft
Offline
Зарегистрирован: 02.06.2011

 полсе создания новых значений на кнопке нажал сработала кнопка "DigitalReadSerial" и все потом ни каких действий переделал на пин А0 без разницы ни каких событий первая надпись висит и все привет  мир

dronsoft
Offline
Зарегистрирован: 02.06.2011

 как по схеме нарисовано

 

dronsoft
Offline
Зарегистрирован: 02.06.2011

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

maksim
Offline
Зарегистрирован: 12.02.2012

 Так какие значения? Где таблица с вашими значениями?

dronsoft
Offline
Зарегистрирован: 02.06.2011

 

#include <LiquidCrystalRus.h>
LiquidCrystalRus lcd(12, 11, 5, 4, 3, 2);

int mode = 0;

void setup() {
  lcd.begin(16, 2); 
  lcd.print("привет!"); 
  SETUP();

  switch(mode){
  case 1:
    setup1();
    break;

  case 2:
    setup2();
    break;

  case 3:
    setup3();
    break;
  }   
}

void loop() {
  switch(mode){
  case 1:
    loop1();
    break;

  case 2:
    loop2();
    break;

  case 3:
    loop3();
    break;
  }   
}


void SETUP(){
  boolean setup_end = 0;
  int button, buttonState = 0;
  while(!setup_end){
    int buttonRead = analogRead(A0);
    delay(1);
    if(buttonRead == analogRead(A0)){
      if(buttonRead > 60 && buttonRead < 80){
        button = 1;
      }
      else if(buttonRead > 100 && buttonRead < 125){
        button = 2;
      }
      else if(buttonRead > 150 && buttonRead < 250){
        button = 3;
      }
      else{
        button = 0;
      }
    }
    if(button != buttonState){
      switch(button){
      case 1:
        mode++;
        break;

      case 2:
        mode--;
        break;

      case 3:
        setup_end = 1;
        break;
      }
      mode = constrain(mode, 0, 3);
      switch(mode){
      case 1:
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Blink");
        break;

      case 2:
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("DigitalReadSerial");
        break;

      case 3:
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Button");
        break;
      }   
      buttonState = button;
    }
  }
}


//--------------------- Скейтч  Blink  ------------------------

void setup1() {
  pinMode(13, OUTPUT);
}

void loop1() {
  digitalWrite(13, HIGH);   // set the LED on
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // set the LED off
  delay(1000);              // wait for a second
}
//--------------------------------------------------------------




//------------------ Скейтч DigitalReadSerial ------------------

void setup2() {
  Serial.begin(9600);
  pinMode(6, INPUT);
}

void loop2() {
  int sensorValue = digitalRead(6);
  Serial.println(sensorValue, DEC);
}
//--------------------------------------------------------------




//------------------ Скейтч Button ------------------

const int buttonPin = 6;  
const int ledPin =  13;     

int buttonState = 0;   

void setup3() {
  pinMode(ledPin, OUTPUT);      
  pinMode(buttonPin, INPUT);     
}

void loop3(){
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {       
    digitalWrite(ledPin, HIGH);  
  } 
  else {
    digitalWrite(ledPin, LOW); 
  }
}
//--------------------------------------------------------------







вот код я немного подправил делай с 100 на 1 и поставил значения от до какго срабатывания

maksim
Offline
Зарегистрирован: 12.02.2012

Я вас не понимаю. 

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

И еще раз:

1. Подключаете дуину к компу;

2. Запускаете Arduino IDE;

3. Выбираете File --> Examples --> 1.Basics --> AnalogReadSerial;

4. Меняете A0 на свой вход или не меняете если подключились к А0;

5. Нажимаете Upload;

7. Ждете пока прошьется:

7. Нажимаете Sirial Monitor;

8. Поочередно нажимаете кнопки и записываете в таблицу как у меня;

9. Выкладываете результаты сюда на форум.

Что не понятного???

dronsoft
Offline
Зарегистрирован: 02.06.2011

 У меня резисторы 3.3 кОм значение меняются найду 1к резюки отпишусь что да как

 

maksim
Offline
Зарегистрирован: 12.02.2012

Не надо искать резисторы на 1 кОм, я вам написал, что нужно сделать выше! 

dronsoft пишет:

У меня резисторы 3.3 кОм значение меняются найду 1к резюки отпишусь что да как

maksim пишет:

Номиналы от 1 кОм до 5 кОм только что бы все три резистора были одинакого номинала.

maksim
Offline
Зарегистрирован: 12.02.2012

Мне нужна таблица, которая должна выглядеть вот так!!!! только с вашими значениями!!!

ничего не нажато - 0

нажата 1 кнопка - 340

нажата 2 кнопка - 510

нажата 3 кнопка - 1020

Что не понятного??????????

 

dronsoft
Offline
Зарегистрирован: 02.06.2011

 ок будет

 

dronsoft
Offline
Зарегистрирован: 02.06.2011

maksim пишет:

Мне нужна таблица, которая должна выглядеть вот так!!!! только с вашими значениями!!!

ничего не нажато - 0

нажата 1 кнопка - 340

нажата 2 кнопка - 510

нажата 3 кнопка - 1020

Что не понятного??????????

ты прав так и получается только значение идет не стабильное оно колеблится "+"" -" 5

 

dronsoft
Offline
Зарегистрирован: 02.06.2011

 а если не нажато то 0-1 иногда до 5 поднимается

 

dronsoft
Offline
Зарегистрирован: 02.06.2011

 данный код повисает

dronsoft
Offline
Зарегистрирован: 02.06.2011

 Описываю.

перезагружаю дуино нано 

нажимаю кнопку 1 ею выбераю режим 

нажимаю кнопку 3 режим включатся 

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

если выбрать DigitalReadSerial тогда включаю монитор дуина перегружается

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

при последующих режимах  как его включил так и выключить  не можешь

dronsoft
Offline
Зарегистрирован: 02.06.2011

 кнопка 2 это возврат меню в начальное положение

maksim
Offline
Зарегистрирован: 12.02.2012

Так естественно, именно так и должно работать. Выбираешь режим и дуина работает по заданной программе пока ее не перезагрузишь. Кнопка 2 не возвращает меню в начальное состояние, кнопка 2 листает режимы обратно. То что когда вы запускаете сериал монитор и дуина перезагружается и переходит в выбор режимов это тоже естественно - ведь скейтч  DigitalReadSerial там только для примера, но вы ведь сами писали, что дуина не будет подключаться к компу.

Так как значения у вас колеблятся я подправил код, что бы кнопки постабильнее работали:

#include <LiquidCrystalRus.h>
LiquidCrystalRus lcd(12, 11, 5, 4, 3, 2);

int mode = 0;

void setup() {
  lcd.begin(16, 2); 
  lcd.print("Привет, мир!"); 
  SETUP();

  switch(mode){
  case 1:
    setup1();
    break;

  case 2:
    setup2();
    break;

  case 3:
    setup3();
    break;
  }   
}

void loop() {
  switch(mode){
  case 1:
    loop1();
    break;

  case 2:
    loop2();
    break;

  case 3:
    loop3();
    break;
  }   
}


void SETUP(){
  boolean setup_end = 0;
  int button, buttonState = 0;
  while(!setup_end){
    int buttonRead = analogRead(A4);
    delay(100);
    if(analogRead(A4) > buttonRead-10 && analogRead(A4) < buttonRead+10){
      if(buttonRead > 290 && buttonRead < 390){
        button = 1;
      }
      else if(buttonRead > 460 && buttonRead < 560){
        button = 2;
      }
      else if(buttonRead > 950 && buttonRead < 1024){
        button = 3;
      }
      else{
        button = 0;
      }
    }
    if(button != buttonState){
      switch(button){
      case 1:
        mode++;
        break;

      case 2:
        mode--;
        break;

      case 3:
        setup_end = 1;
        break;
      }
      mode = constrain(mode, 0, 3);
      switch(mode){
      case 1:
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Blink");
        break;

      case 2:
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Analog Input");
        break;

      case 3:
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Button");
        break;
      }   
      buttonState = button;
    }
  }
}


//--------------------- Скейтч  Blink  ------------------------

void setup1() {
  pinMode(13, OUTPUT);
}

void loop1() {
  digitalWrite(13, HIGH);   // set the LED on
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // set the LED off
  delay(1000);              // wait for a second
}
//--------------------------------------------------------------




//------------------ Скейтч Analog Input ------------------

int sensorPin = A0;   
int led = 13;     
int sensorValue = 0; 

void setup() {
  pinMode(led, OUTPUT);  
}

void loop() {
  sensorValue = analogRead(sensorPin);    
  digitalWrite(led, HIGH);  
  delay(sensorValue);                
  digitalWrite(led, LOW);   
  delay(sensorValue);                  
}
//--------------------------------------------------------------




//------------------ Скейтч Button ------------------

const int buttonPin = 6;  
const int ledPin =  13;     

int buttonState = 0;   

void setup3() {
  pinMode(ledPin, OUTPUT);      
  pinMode(buttonPin, INPUT);     
}

void loop3(){
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {       
    digitalWrite(ledPin, HIGH);  
  } 
  else {
    digitalWrite(ledPin, LOW); 
  }
}
//--------------------------------------------------------------







 

dronsoft
Offline
Зарегистрирован: 02.06.2011

Спасибо за пример теперь начну собирать далее. да Вы правы кнопка перелистывает обратно не правильно отписал