+1 голос

Добрый день!.

Подскажите.

на arduino UNO есть программа, где многие пины хорошо работают,

но столкнулся с проблемой.... 

На PIN 0, PIN 1 ( они нужны как INPUT ) через физически подтянутые к земле 10кОм, стоят кнопки подающие +5v.

если в коде программе ставлю пин0, пин1 как INPUT, программа работает, как будто кнопки постоянно нажаты!!!!!!!!! хотя их никто не нажимает.

( причем только на этим пинах глючит ) пин 0 (RX), пин 1 (TX).

Если ставлю их как OUTPUT - программа работает, но при нажатии кнопки видно просаживание напряжения ( экран тусклеет ).

То есть надо писать INPUT но прога не работает, а работает как вход 

на этих пинах только если их ставить - OUTPUT

pinMode(0, OUTPUT);  - хотя должня стоять INPUT //Пин 0 кнопка обнуления счетчика угля 
pinMode(1, OUTPUT);  - хотя должня стоять INPUT //Мин 1 кнопка автоматической сигнализации 
pinMode(6, INPUT);    //кнопка на пин 6 ввод увеличиваем температуру на градус
pinMode(7, INPUT);    //кнопка на пин 7 ввод уменьшаем температуру на градус
pinMode(14, OUTPUT);  //Пин 14 реле на продувку
pinMode(15, OUTPUT);  //Пин 15 реле на подача угля

Код большой ставить нет смысла. 

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

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

#include <OneWire.h>

/*
* Описание взаимодействия с цифровым датчиком ds18b20 
* Подключение ds18b20 к ардуино через пин 8  
*/
OneWire ds(8); // Создаем объект OneWire для шины 1-Wire, с помощью которого будет осуществляться работа с датчиком

#include "Wire.h" 
#include "LiquidCrystal_I2C.h"
LiquidCrystal_I2C lcd(0x27, 20, 4); //i2c-адрес, кол-во символов, кол-во строк
unsigned long timing;     // переменная для счетчика времени - задержка цикла опроса датчика температуры
int ugolraz;              // переменная для счетчика кол-ва раз подачи угля
unsigned long ugol;       // переменная для счетчика времени - задержка цикла подачи угля  ) 
float shnektime = 8.0;    // время оборота шнека ( задаем временем 1 оборот )
unsigned long ugoltime = 240;   // время между подачей угля



float verh = 0;      // верх темп.
float  niz = 0;      // низ темп.
int avariatem = 0; // температура аварийного отключени котла


#define OBNULUGOLRAZ 0              //обнуление счетчика угля
#define SSSI 1                   //автоматический режим с примением сигнализации по нижней температуре
#define KNOPKA_PLUS_TIMEUGOL 2      //кнопка плюс время между подачами угля
#define KNOPKA_MINUS_TIMEUGOL 3     //кнопка минус время между подачами угля
#define KNOPKA_PLUS_TIMESHNEK 4     //кнопка плюс время вращения шнека угля
#define KNOPKA_MINUS_TIMESHNEK 5    //кнопка минус время вращения шнека угля
#define PIN_PLUS 6                  //кнопка плюс температура устоновочная 
#define PIN_MINUS 7                 //кнопка минус температура устоновочная 


int tonePin = 16;                    //пин 16_(A2) подключен зуммер ( пищалка )



int pere = 30;         //переменная хранящая установочную температуру 


void setup(){



//pinMode(analogPin, INPUT);
pinMode(0, OUTPUT);  //ВОТ ЭТА ПРОБЛЕМНАЯ СТРОКА ---------Пин 0 кнопка обнуления счетчика угля
pinMode(1, OUTPUT);  //ВОТ ЭТА ПРОБЛЕМНАЯ СТРОКА ---------Мин 1 кнопка автоматической сигнализации по нижнему порогу
pinMode(6, INPUT);    //кнопка на пин 6 ввод увеличиваем температуру на градус
pinMode(7, INPUT);    //кнопка на пин 7 ввод уменьшаем температуру на градус
pinMode(14, OUTPUT);  //Пин 14 реле на продувку
pinMode(15, OUTPUT);  //Пин 15 реле на подача угля

//Serial.begin(9600);   //Выводим в монитор порта в случае необходимости фактическую температуру
lcd.begin();
lcd.backlight();
 


unsigned long ugol = 0;   // переменная для счетчика времени - задержка цикла подачи угля ( первый цикл 8 сек, через 30 чек, через 120 сек. каждые последующие ) 


}




void loop(){





  //Serial.println(millis());
  if (millis() - timing > 1000){ //1000-время паузы выполнения программы
     timing = millis();


  // Определяем температуру от датчика DS18b20
  byte data[2]; // Место для значения температуры
  
  ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров
  ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство 
  ds.write(0x44); // Даем датчику DS18b20 команду измерить температуру. Само значение температуры мы еще не получаем - датчик его положит во внутреннюю память
  
 // delay(1000); // Микросхема измеряет температуру, а мы ждем.  
  
  ds.reset(); // Теперь готовимся получить значение измеренной температуры
  ds.write(0xCC); 
  ds.write(0xBE); // Просим передать нам значение регистров со значением температуры
  // Получаем и считываем ответ
  data[0] = ds.read(); // Читаем младший байт значения температуры
  data[1] = ds.read(); // А теперь старший
  // Формируем итоговое значение: 
  //    - сперва "склеиваем" значение, 
  //    - затем умножаем его на коэффициент, соответсвующий разрешающей способности (для 12 бит по умолчанию - это 0,0625)
  float temperature =  ((data[1] << 8) | data[0]) * 0.0625;
  
  // Выводим полученное значение температуры в монитор порта
  //Serial.println(temperature); //Выводим в монитор порта в случае необходимости фактическую температуру
  
  
  //lcd.clear();  // очищаем экран LED дисплея


 int sensorVal = digitalRead(PIN_PLUS);       //кнопка пин-6 плюс температура устоновочная 
 int sensorVall = digitalRead(PIN_MINUS);     //кнопка пин-7 минус температура устоновочная 

 if (sensorVal == HIGH)  {pere=pere+50; lcd.setCursor(12,1); lcd.print("   "); } // pere +1
 if (sensorVall == HIGH) {pere=pere-50; lcd.setCursor(12,1); lcd.print("   "); } // pere -1
 if (pere > 90 ) {pere = 90; tone(tonePin, 600, 100); delay (150);tone(tonePin, 600, 100);delay (150);tone(tonePin, 600, 100);delay (500);
                              lcd.setCursor(12,1); lcd.print("MAX"); delay(300);lcd.setCursor(12,1); lcd.print("___"); delay(300);
                              lcd.setCursor(12,1); lcd.print("MAX"); delay(300);lcd.setCursor(12,1); lcd.print("   "); delay(300);} //если установили температуру больше 90С градусов, троекратный писк и ограничение повышения. 
 if (pere < 30 ) {pere = 30; tone(tonePin, 600, 100); delay (150);tone(tonePin, 600, 100);delay (150);tone(tonePin, 600, 100);delay (500);
                              lcd.setCursor(12,1); lcd.print("MIN"); delay(300);lcd.setCursor(12,1); lcd.print("___"); delay(300);
                              lcd.setCursor(12,1); lcd.print("MIN"); delay(300);lcd.setCursor(12,1); lcd.print("   "); delay(300);} //если установили температуру меньше 30С градусов, троекратный писк и ограничение понижения. 

 int obn = digitalRead(OBNULUGOLRAZ);                             
 if (obn == HIGH ) {tone(tonePin, 600, 100); delay (150); ugolraz=0; lcd.setCursor(16,3); lcd.print("    "); lcd.setCursor(16,3); lcd.print(ugolraz); } //если нажата кнопка 0 то обнуляем кол-во угля и делаем 1 писк зумером.

 int sign = digitalRead(SSSI);   
 if (sign == HIGH ) {lcd.setCursor(3,0); lcd.print("ON-SIGN"); }
 if (sign == LOW )  {lcd.setCursor(3,0); lcd.print("       "); }

 int timesh1 = digitalRead(KNOPKA_MINUS_TIMESHNEK);     // читаем и отрабатываем корректировку переменной по времени вращения поршня подачи угля
 int timesh2 = digitalRead(KNOPKA_PLUS_TIMESHNEK);

 if (timesh2 == HIGH) {shnektime=shnektime+0.5; lcd.setCursor(0,2); lcd.print("    ");} // shnektime +100
 if (timesh1 == HIGH) {shnektime=shnektime-0.5; lcd.setCursor(0,2); lcd.print("    "); } // shnektime -100
 if (shnektime > 10.0 ) {shnektime = 10.0; tone(tonePin, 600, 100); delay (150);tone(tonePin, 600, 100);delay (150);tone(tonePin, 600, 100);delay (500);
                                             lcd.setCursor(0,2); lcd.print("MAX"); delay(300);lcd.setCursor(0,2); lcd.print("___"); delay(300);
                                             lcd.setCursor(0,2); lcd.print("MAX"); delay(300);lcd.setCursor(0,2); lcd.print("   "); delay(300); }    //ограничение переменной и писк 3 раза
 if (shnektime < 4.0 )  {shnektime = 4.0; tone(tonePin, 600, 100); delay (150);tone(tonePin, 600, 100);delay (150);tone(tonePin, 600, 100);delay (500);
                                             lcd.setCursor(0,2); lcd.print("MIN"); delay(300);lcd.setCursor(0,2); lcd.print("___"); delay(300);
                                             lcd.setCursor(0,2); lcd.print("MIN"); delay(300);lcd.setCursor(0,2); lcd.print("   "); delay(300); } //ограничение переменной и писк 3 раза

lcd.setCursor(0,2); lcd.print(shnektime,1);



 int timeugl1 = digitalRead(KNOPKA_PLUS_TIMEUGOL);   // кнопка увеличения времени между подачами угля
 int timeugl2 = digitalRead(KNOPKA_MINUS_TIMEUGOL);  // кнопка уменьшения времени между подачами угля

 if (timeugl1 == HIGH) {ugoltime=ugoltime+100; lcd.setCursor(12,2); lcd.print("   "); lcd.setCursor(6,2); lcd.print("   ");} // shnektime +5000
 if (timeugl2 == HIGH) {ugoltime=ugoltime-100; lcd.setCursor(12,2); lcd.print("   "); lcd.setCursor(6,2); lcd.print("   ");} // shnektime -5000
 if (ugoltime > 600 ) {ugoltime = 600; tone(tonePin, 600, 100); delay (150);tone(tonePin, 600, 100);delay (150);tone(tonePin, 600, 100);delay (500);
                                              lcd.setCursor(12,2); lcd.print("MAX"); delay(300);lcd.setCursor(12,2); lcd.print("___"); delay(300);
                                              lcd.setCursor(12,2); lcd.print("MAX"); delay(300);lcd.setCursor(12,2); lcd.print("   "); delay(300);} //ограничение переменной и писк 3 раза
 if (ugoltime < 50 ) {ugoltime = 50; tone(tonePin, 600, 100); delay (150);tone(tonePin, 600, 100);delay (150);tone(tonePin, 600, 100);delay (500);
                                              lcd.setCursor(12,2); lcd.print("MIN"); delay(300);lcd.setCursor(12,2); lcd.print("___"); delay(300);
                                              lcd.setCursor(12,2); lcd.print("MIN"); delay(300);lcd.setCursor(12,2); lcd.print("   "); delay(300);} //ограничение переменной и писк 3 раза

lcd.setCursor(12,2); lcd.print(ugoltime);



verh = pere + 1.5;              //верх темп. продувка выключается
niz = pere - 1.5;               //низ темп.  продувка включается
avariatem = pere - 8;

lcd.setCursor(10,0); lcd.print(temperature);
lcd.setCursor(0,1); lcd.print(niz-2,1);lcd.setCursor(6,1); lcd.print(niz,1); lcd.setCursor(12,1); lcd.print(pere); lcd.setCursor(16,1); lcd.print(verh,1);
lcd.setCursor(0,0); lcd.print(avariatem);

if (temperature < niz )  {digitalWrite(14, HIGH); lcd.setCursor(0,3); lcd.print("Produvka");}
if (temperature > verh ) {digitalWrite(14, LOW);  lcd.setCursor(0,3); lcd.print("        ");}



if (temperature < niz-1,5 && millis() - ugol > ugoltime*1000){ugol = millis(); digitalWrite(15, HIGH); lcd.setCursor(10,3); lcd.print("+ Ugol"); delay(shnektime*1000); digitalWrite(15, LOW); lcd.setCursor(10,3); lcd.print("       "); ugolraz=ugolraz+1; lcd.setCursor(16,3); lcd.print(ugolraz);  } 



lcd.setCursor(6,2); lcd.print("   "); lcd.setCursor(6,2); lcd.print( ugoltime - (millis() - ugol) /1000);

/*if (temperature < avariatem ) {lcd.setCursor(0,3); lcd.print("EROR - 001"); tone(tonePin, 600, 100); delay (150);tone(tonePin, 600, 100);delay (150);tone(tonePin, 600, 100);delay (500);lcd.clear(); delay (500); lcd.setCursor(0,3); lcd.print("EROR - 001");delay (1000);  } */ 


}

}

(47 баллов) 2 8 14

1 Ответ

+4 голосов
 
Лучший ответ
Из документации на плату:
Набор функций Serial служит для связи устройства Ардуино с компьютером или другими устройствами, поддерживающими последовательный интерфейс обмена данными. Все платы Arduino имеют хотя бы один последовательный порт (UART, иногда называют USART). Для обмена данными Serial используют цифровые порты ввод/вывода 0 (RX) и 1 (TX), а также USB порт. Важно учитывать, что если вы используете функции Serial, то нельзя одновременно с этим использовать порты 0 и 1 для других целей.
А вообще нежелательно использовать данные пины в личных целях кроме подключения устройств с интерфейсом UART так как нужно помнить, что пины 0 (RX) и 1 (TX) используются для программирования микроконтроллера). Можно например назначить 0 пину режим OUTPUT, (через регистры напрямую) но тогда вы уже не сможете заливать скетчи в вашу плату.
(1.2 тыс. баллов) 8 26 51
выбран
Привет.
Как бы да.... ответ правильный, по смыслу )
А можно проще ответить, так как вроде на OUTPUT ( плата работает как INPUT ) PIN 0,1
Чем это грозит? и откуда просадка появляется,

на данные пины настроены кнопки нажатие на которые происходит крайне редко, но
оно нужно ( так как кончились пины и терпение дальше усовершенствовать прибор )
И аналоговые кончились?
Найдите схему на свою плату и посмотрите как подключены пины. Как правило эти пины подключены через килоомные резисторы к конвертеру и кроме этого,  в зависимости от конвертера USB-UART, к ним еще могут быть подключены светодиоды индицирующие процесс работы UART. Из-за этого и происходит просадка напряжения и "постоянно нажатые кнопки". Попробуйте отпаять эти элементы или перерезать дорожки и посмотрите что поменяется. Правда, при этом потеряете возможность прошивки платы через USB.
Добро пожаловать на Бредборд! Сайт вопросов и ответов на тему Arduino, Raspberry Pi и хоббийной электроники в целом. Цель Бредборда — быть максимально полезным. Поэтому мы строго следим за соблюдением правил, боремся с холиворами и оффтопиком.

    За этот месяц ещё никого.

    ...