Arduino зависает на самой ПРОСТОМ СКЕТЧЕ
- Войдите на сайт для отправки комментариев
Чт, 25/08/2016 - 05:16
Доброго времени суток! Помогите пожалуйста, делаю САМЫЙ простой счетчик импульсов с 7-ми сегментным дисплеем(tm1637). Вот код: http://paste.ubuntu.com/23084999/ или http://paste.ubuntu.com/23085005/ вот фото блока питания http://radikal.ru/lfp/i057.radikal.ru/1608/e3/9102e46d595e.jpg/htm
Проблема заключается в том, что переменная перестает изменяться на 62, 188, 189, 288, 267 и вообще на любых числах примерно 3 раза за 20 минут. (подключаю через резистор 10 кОм к GND)
Пишу с телефона поэтому не получилось код вставить.
Вот, когда получится, тогда и поговорим.
Я не знаю, что за код Вы привели и какую именно библиотеку использовали.
Более того, Вы привели два РАЗНЫХ кода. И который из них не работает? Второй, так даже и не компилируется.
Заниматься расследованием никому нафиг не нужно. Нужна помощь - давайте полный код в нормальном виде.
Спасибо, что откликнулись! Подскажите в каком направлении искать причину... Вот с этим кодом зависает, если подключить к 7-ми сегментному дисплею. А если выводить значение переменной через Serial., то не виснет, перепробывал все библиотеки и различные значения delay(x); Может беда в коде?
#include "TM1637.h" #define CLK 3 #define DIO 2 TM1637 disp(CLK,DIO); int s=0; void setup() { pinMode(7, INPUT); digitalWrite(7,LOW); disp.set(5); disp.init(D4056A); } void lcd () { disp.display(s); } void loop() { if (digitalRead(7)==HIGH) { s=s+1; delay(2000); } lcd(); }А также пробывал все делать в ОДИН цикл, все равно зависает на числах до 300., причем значение выводилось на дисплей без задержки 2000мс. При таком скетче:
if (digitalRead(7)==HIGH) { s=s+1; delay(2000); disp.display(s); }Использую вот такую библиотеку: http://www.arduino.md/wp-content/uploads/library/TM1637-4-digit-display-tube.zip
Попробуйте поставить небольшую задержку (ну, там 3-5 миллисекунд) между строками 27 и 28. Отпишитесь, что получилось.
не в коде дело,у Вас "импульсник",поставьте блок - кондёры по питанию сразу возле платы,и провода не больше 20 см,и всё у Вас должно получиться
Спасибо попробую. А как именно конденсатор ставить и какой емкости?
по питанию ,между "общим" и "+",ёмкость (0,1 мкФ керамика)+(4,7мкФ электролит) паралельно друг-другу, и перед платой!!!!
Я, конечно, не очень программист..., но мне кажется что в скетче считывается HIGH. Сколько раз его посчитают ни кому не известно. Должно быть как-то HIGH, LOW, ...короче, фиксировать пару.
Мне кажется пока выполняется Delay, много чего может произойти, тех же импульсов может проскочить туева хуча, а их ни кто и не защитает.
вы давайте не тупите. обявили s как int, переполняется и все. ардуина перезагружается.
вы давайте не тупите. обявили s как int, переполняется и все. ардуина перезагружается.
А как ее по другому объявить? Виснет при s до 300, а потом не разу не зависало, необходим подсчет максимум до 9000. Так почему же не int?
если вам не надо более 9000 то нужно описывать это в коде.
делей я бы вообще не использовал. millis тогда уж.
нужно оставить что то вроде этого если конечно дисплей при этом не гаснет..
if(digitalRead(7)==HIGH)2{3s=s+1;45disp.display(s);6}если вам не надо более 9000 то нужно описывать это в коде.
делей я бы вообще не использовал. millis тогда уж.
нужно оставить что то вроде этого если конечно дисплей при этом не гаснет..
if(digitalRead(7)==HIGH)2{3s=s+1;45disp.display(s);6}Большое спасибо за совет. Просто ситуация такая, что импульс появляется один раз в 5-10 секунд. Сейчас попробую с внешним прерыванием.
здравстуйте. удлиннил провода до 3 метров на датчик и экран, и ардуино начало виснуть. Нашел, пришлось отдельное питание на экран дать.
#include <OLED_I2C.h> OLED myOLED(A4, A5, A4); // A4 - SDA , A5 - SCL extern uint8_t RusFont[]; // Русский шрифт extern uint8_t MegaNumbers[]; // Подключение больших шрифтов extern uint8_t SmallFont[]; // Базовый шрифт без поддержки русскийх символов. #include <OneWire.h> #include <Wire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 8 // номер пина к которому подключен DS18B20 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); unsigned long last_time; unsigned long last_press; int ledPin1 = 4; int ledPin2 = 13; int ledPin3 = A0; int ledPin4 = A1; int ledPin5 = A2; int ledPin6 = A3; int switchPin1 = 2; int switchPin2 = 3; int heatPin1 = 5; int heatPin2 = 6; int val1; int val2; int state1; int state2; int c; int d; void setup() { sensors.begin(); myOLED.begin(); pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); pinMode(ledPin3, OUTPUT); pinMode(ledPin4, OUTPUT); pinMode(ledPin5, OUTPUT); pinMode(ledPin6, OUTPUT); pinMode(heatPin1, OUTPUT); pinMode(heatPin2, OUTPUT); pinMode(switchPin1, INPUT); pinMode(switchPin2, INPUT); digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, LOW); digitalWrite(ledPin3, LOW); digitalWrite(ledPin4, LOW); digitalWrite(ledPin5, LOW); digitalWrite(ledPin6, LOW); } void loop() { if(millis() - last_time > 2000) { last_time = millis(); sensors.requestTemperatures(); myOLED.clrScr(); // очищаем экран myOLED.setFont(RusFont); // Устанавливаем русский шрифт myOLED.print("Ntvgthfnehf", CENTER, 0); // Выводим надпись "Температура" myOLED.setFont(SmallFont); myOLED.print("CHERY A13", CENTER, 55); // вывод текста myOLED.setFont(MegaNumbers); myOLED.print(String(sensors.getTempCByIndex(0) , 1), CENTER, 11); // Отображение температуры myOLED.update(); } state1 = digitalRead(switchPin1); state2 = digitalRead(switchPin2); if (state1 == HIGH && c == 0 && millis() - last_press > 50) // нажали кнопку { c = 1; last_press = millis(); } if (state1 == LOW && c == 1 ) // отпустили кнопку { val1 = ++val1; if (val1 == 4) { val1 = 0; } c = 0; } if (state2 == HIGH && d == 0) // нажали кнопку { d = 1; } if (state2 == LOW && d == 1) // отпустили кнопку { val2 = ++val2; if (val2 == 4) { val2 = 0; } d = 0; } if (val1 == 0) // выключаем светодиоды { digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, LOW); digitalWrite(ledPin3, LOW); analogWrite(heatPin1, LOW); } if (val2 == 0) // выключаем светодиоды { digitalWrite(ledPin4, LOW); digitalWrite(ledPin5, LOW); digitalWrite(ledPin6, LOW); analogWrite(heatPin2, LOW); } if (val1 == 1) // Если мы кнопку 1 раз нажали и отпустили { digitalWrite(ledPin1, HIGH); digitalWrite(ledPin2, LOW); digitalWrite(ledPin3, LOW); analogWrite(heatPin1, 85); } if (val2 == 1) // Если мы кнопку 1 раз нажали и отпустили { digitalWrite(ledPin4, HIGH); digitalWrite(ledPin5, LOW); digitalWrite(ledPin6, LOW); analogWrite(heatPin2, 85); } if (val1 == 2) // Если мы кнопку 2 раз нажали и отпустили { digitalWrite(ledPin1, HIGH); digitalWrite(ledPin2, HIGH); digitalWrite(ledPin3, LOW); analogWrite(heatPin1, 170); } if (val2 == 2) // Если мы кнопку 2 раз нажали и отпустили { digitalWrite(ledPin4, HIGH); digitalWrite(ledPin5, HIGH); digitalWrite(ledPin6, LOW); analogWrite(heatPin2, 170); } if (val1 == 3) // Если мы кнопку 3 раз нажали и отпустили { digitalWrite(ledPin1, HIGH); digitalWrite(ledPin2, HIGH); digitalWrite(ledPin3, HIGH); analogWrite(heatPin1, 255); } if (val2 == 3) // Если мы кнопку 3 раз нажали и отпустили { digitalWrite(ledPin4, HIGH); digitalWrite(ledPin5, HIGH); digitalWrite(ledPin6, HIGH); analogWrite(heatPin2, 255); } delay(10); }здравстуйте. удлиннил провода до 3 метров на датчик и экран, и ардуино начало виснуть.
Так его, этот I2C! Мало удлинил, надо удлинить ВНУТРИСХЕМНЫЙ интерфейс ещё больше - вытаскивай сразу метров на двадцать.
надо экранированный провод подключать и экран этого провода надо на землю подключать, и это действительно внутрисхемный интерфейс