Добрый день!.
Подскажите.
на 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); } */
}
}