Может кто помочь с зависанием ардуники? Вот схема: Invite - EasyEDA - Online PCB design & circuit simulator
В схеме весь код и фото через ссылки
Может кто помочь с зависанием ардуники? Вот схема: Invite - EasyEDA - Online PCB design & circuit simulator
В схеме весь код и фото через ссылки
И кому оно будет интересно - лезть на сторонний сайт, который требует авторизации? ![]()
@droffet
Выложите код и схему сюда, иначе и обсуждать нечего. Не выкладывайте код картинкой.
#include <avr/wdt.h>
#define _LCD_TYPE 1 // для работы с I2C дисплеями
#include <LCD_1602_RUS_ALL.h>
LCD_1602_RUS lcd(0x27, 16, 2);
#include <GyverNTC.h>
//#include <SoftwareSerial.h>
#include <Ch376msc.h>
#define NTC_PIN 0 // пин A0
#define RES_RES 4700 // резистор делителя 10 кОм
#define NTC_B 3950 // Бета коэф. термистора
#define kupPin 3
#define InhiBit 4
#define monPin 7
unsigned long timeMonPulse=1000; // макс. время приема монеты
float nominalsMon[4]={1, 2, 5, 10};
int monPulse;
int monState;
int monLastState;
unsigned long monPulseDuration;
unsigned long monPulseBegin;
unsigned long monTime;
unsigned long monTime_count;
unsigned long curtime_cout;
int const minWidthPulse = 40;
int const maxWidthPulse = 60;
int debounce = 4;
int pulseCount = 0;
unsigned long pulseDuration;
unsigned long pulseBegin = 0;
unsigned long pulseEnd = 0;
unsigned long curtime;
int pulseState;
int lastState = 1;
int status;
unsigned long balance, balance_old;
unsigned long kup_time;
unsigned long time_status;
int progress;
short timeTraget;
short stak;
unsigned long stak_time;
void setup() {
wdt_enable(WDTO_8S);
pinMode(kupPin, INPUT);
pinMode(InhiBit, OUTPUT);
pinMode(monPin, INPUT);
digitalWrite(InhiBit,HIGH);
Serial.begin(9600);
lcd.init();
lcd.backlight();
pinMode(5, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP);
pinMode(37, INPUT_PULLUP);
pinMode(36, INPUT_PULLUP);
pinMode(35, INPUT_PULLUP);
pinMode(34, INPUT_PULLUP);
pinMode(33, INPUT_PULLUP);
pinMode(32, INPUT_PULLUP);
pinMode(8, INPUT_PULLUP);
pinMode(9, INPUT_PULLUP);
for(int i = 38; i <= 53; i++) {
pinMode(i, OUTPUT);
digitalWrite(i, 1);
}
}
unsigned long cretime;
float filtTemp;
unsigned long filtTime;
short buttonSelect;
void create_coffe() {
if(buttonSelect != 0) {
if(stak == 0) {
digitalWrite(39, 0); // моторчик стакана
if(digitalRead(8) == 1) {
stak_time = millis();
stak = 1;
}
} else if((millis() - stak_time) > 500 && stak == 1) {
if(digitalRead(8) == 0) {
digitalWrite(39, 1); // моторчик стакана
stak = 2;
cretime = millis();
}
}
if(stak == 2) {
switch(buttonSelect) {
case 37: { // кофе с сахаром
if((millis() - cretime) >= 0 && (millis() - cretime) < 3000) digitalWrite(50, 0); // синий клапан
if((millis() - cretime) > 1400) digitalWrite(45, 0); // миксер 1 ЖУЖИТ
if((millis() - cretime) > 1800) digitalWrite(44, 0); // coffe
if((millis() - cretime) > 2100) digitalWrite(40, 0); // suga
if((millis() - cretime) > 3250) digitalWrite(44, 1); // coffe
if((millis() - cretime) > 3500) digitalWrite(40, 1); // suga
if((millis() - cretime) > 3000) digitalWrite(45, 1); // миксер 1 ЖУЖИТ
if((millis() - cretime) > 3500) digitalWrite(50, 1); // синий клапан
if((millis() - cretime) > 4000) digitalWrite(50, 0); // синий клапан
if((millis() - cretime) > 4300) digitalWrite(44, 0); // coffe
if((millis() - cretime) > 4900) digitalWrite(44, 1); // coffe
if((millis() - cretime) > 5800) digitalWrite(45, 0); // миксер 1 ЖУЖИТ
if((millis() - cretime) > 6200) digitalWrite(50, 1); // синий клапан
if((millis() - cretime) > 8000) digitalWrite(45, 1); // миксер 1 ЖУЖИТ
if((millis() - cretime) > 8000) {
status = 0;
cretime = 0;
buttonSelect = 0;
stak = 0;
stak_time = 0;
}
break;
}
case 36: { // кофе без сахара
if((millis() - cretime) >= 0 && (millis() - cretime) < 3000) digitalWrite(50, 0); // синий клапан
if((millis() - cretime) > 1400) digitalWrite(45, 0); // миксер 1 ЖУЖИТ
if((millis() - cretime) > 1800) digitalWrite(44, 0); // coffe
if((millis() - cretime) > 3250) digitalWrite(44, 1); // coffe
if((millis() - cretime) > 3000) digitalWrite(45, 1); // миксер 1 ЖУЖИТ
if((millis() - cretime) > 3500) digitalWrite(50, 1); // синий клапан
if((millis() - cretime) > 4000) digitalWrite(50, 0); // синий клапан
if((millis() - cretime) > 4300) digitalWrite(44, 0); // coffe
if((millis() - cretime) > 4900) digitalWrite(44, 1); // coffe
if((millis() - cretime) > 5800) digitalWrite(45, 0); // миксер 1 ЖУЖИТ
if((millis() - cretime) > 6200) digitalWrite(50, 1); // синий клапан
if((millis() - cretime) > 8000) digitalWrite(45, 1); // миксер 1 ЖУЖИТ
if((millis() - cretime) > 8000) {
status = 0;
cretime = 0;
buttonSelect = 0;
stak = 0;
stak_time = 0;
}
break;
}
case 34: { // раф банановый
if((millis() - cretime) >= 0 && (millis() - cretime) < 3000) digitalWrite(50, 0); // синий клапан
if((millis() - cretime) > 1400) digitalWrite(45, 0); // миксер 1 ЖУЖИТ
if((millis() - cretime) > 1800) digitalWrite(53, 0); // 4-ый
if((millis() - cretime) > 3250) digitalWrite(53, 1); // 4-ый
if((millis() - cretime) > 3000) digitalWrite(45, 1); // миксер 1 ЖУЖИТ
if((millis() - cretime) > 3500) digitalWrite(50, 1); // синий клапан
if((millis() - cretime) > 4000) digitalWrite(50, 0); // синий клапан
if((millis() - cretime) > 4300) digitalWrite(53, 0); // 4-ый
if((millis() - cretime) > 4900) digitalWrite(53, 1); // 4-ый
if((millis() - cretime) > 5800) digitalWrite(45, 0); // миксер 1 ЖУЖИТ
if((millis() - cretime) > 6200) digitalWrite(50, 1); // синий клапан
if((millis() - cretime) > 8000) digitalWrite(45, 1); // миксер 1 ЖУЖИТ
if((millis() - cretime) > 8000) {
status = 0;
cretime = 0;
buttonSelect = 0;
stak = 0;
stak_time = 0;
}
break;
}
case 35: { // капучино
if((millis() - cretime) >= 0 && (millis() - cretime) < 3000) digitalWrite(50, 0); // синий клапан
if((millis() - cretime) > 1400) digitalWrite(45, 0); // миксер 1 ЖУЖИТ
if((millis() - cretime) > 1800) digitalWrite(51, 0); // 3-ий
if((millis() - cretime) > 3250) digitalWrite(51, 1); // 3-ий
if((millis() - cretime) > 3000) digitalWrite(45, 1); // миксер 1 ЖУЖИТ
if((millis() - cretime) > 3500) digitalWrite(50, 1); // синий клапан
if((millis() - cretime) > 4000) digitalWrite(50, 0); // синий клапан
if((millis() - cretime) > 4300) digitalWrite(51, 0); // 3-ий
if((millis() - cretime) > 4900) digitalWrite(51, 1); // 3-ий
if((millis() - cretime) > 5800) digitalWrite(45, 0); // миксер 1 ЖУЖИТ
if((millis() - cretime) > 6200) digitalWrite(50, 1); // синий клапан
if((millis() - cretime) > 8000) digitalWrite(45, 1); // миксер 1 ЖУЖИТ
if((millis() - cretime) > 8000) {
status = 0;
cretime = 0;
buttonSelect = 0;
stak = 0;
stak_time = 0;
}
break;
}
}
}
}
}
unsigned long water_rele_time;
void loop() {
wdt_reset();
if(status <= 2 || status == 4 || status == 5) {
digitalWrite(48, 1); // красный клапан
digitalWrite(49, 1); // желтый клапан
digitalWrite(50, 1); // синий клапан
digitalWrite(51, 1); // 3-ий
digitalWrite(52, 1); // миксер 2 ЖУЖИТ
digitalWrite(53, 1); // 4-ый
digitalWrite(45, 1); // миксер 1 ЖУЖИТ
digitalWrite(44, 1); // coffe
digitalWrite(43, 1); // миксер 3
digitalWrite(42, 1); // tea 2
digitalWrite(41, 1); // tea 1
digitalWrite(40, 1); // suga
digitalWrite(39, 1); // моторчик стаканчика
digitalWrite(38, 1); // моторчик отсека стаканчиков
}
//Serial.println(" 8:" + String(digitalRead(8)) + " 9:" + String(digitalRead(9)));
// 8 датчик на моторчике 0
// 9 датчик стаканчика 1
if(status <= 2) {
for(int i = 32; i <= 37; i++) {
if(digitalRead(i) == 0) {
if(digitalRead(6) == 0) {
status = 5;
time_status = millis();
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Идет набор воды");
} else {
switch(i) {
case 37: {
if(balance < 100) {
if(balance != 0) {
status = 4;
time_status = millis();
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Не хватает: " + String(100 - balance) + " руб.");
}
} else if(balance >= 100) {
balance -= 100;
buttonSelect = i;
status = 3;
progress = 0;
//cretime = millis();
time_status = millis();
timeTraget = 93;
}
break;
}
case 36: {
if(balance < 80) {
if(balance != 0) {
status = 4;
time_status = millis();
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Не хватает: " + String(80 - balance) + " руб.");
}
} else if(balance >= 80) {
balance -= 80;
buttonSelect = i;
status = 3;
progress = 0;
//cretime = millis();
time_status = millis();
timeTraget = 93 + 40;
}
break;
}
case 35: {
if(balance < 80) {
if(balance != 0) {
status = 4;
time_status = millis();
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Не хватает: " + String(80 - balance) + " руб.");
}
} else if(balance >= 80) {
balance -= 80;
buttonSelect = i;
status = 3;
progress = 0;
//cretime = millis();
time_status = millis();
timeTraget = 93 + 40;
}
break;
}
case 34: {
if(balance < 80) {
if(balance != 0) {
status = 4;
time_status = millis();
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Не хватает: " + String(80 - balance) + " руб.");
}
} else if(balance >= 80) {
balance -= 80;
buttonSelect = i;
status = 3;
progress = 0;
//cretime = millis();
time_status = millis();
timeTraget = 93 + 40;
}
break;
}
case 32: {
balance += 100;
break;
}
}
}
}
}
}
if(status == 3) create_coffe();
main_n();
filtTemp += (NTC_compute(analogRead(NTC_PIN), RES_RES, NTC_B) - filtTemp) * 0.2;
if(digitalRead(5) == 0) {
/*if(filtTemp > 85) digitalWrite(47, 1);
else if(filtTemp < 75) digitalWrite(47, 0);*/
} else {
digitalWrite(47, 1);
}
if(digitalRead(6) == 0) {
if((millis() - water_rele_time) > 1000 && status <= 2) {
//digitalWrite(46, 0);
water_rele_time = millis();
}
} else {
if((millis() - water_rele_time) > 1000) {
digitalWrite(46, 1);
water_rele_time = millis();
}
}
pulseState = digitalRead(kupPin);
curtime = millis();
if((pulseState == 0) && (lastState == 1)) {
pulseBegin = curtime;
lastState = 0;
} else if((pulseState == 1) && (lastState == 0)) {
pulseDuration = curtime - pulseBegin;
if(pulseDuration > debounce) {
lastState = 1;
}
if((pulseDuration > minWidthPulse) && (pulseDuration < maxWidthPulse)) {
curtime_cout = millis();
pulseCount++;
}
}
if((curtime_cout > 0) && (curtime - curtime_cout > 1000) && curtime > curtime_cout) {
switch(pulseCount) {
case 3: balance += 100; break;
case 2: balance += 50; break;
}
pulseCount = 0;
curtime = 0;
curtime_cout = 0;
pulseDuration = 0;
lastState = 0;
pulseBegin = 0;
}
monState = digitalRead(monPin);
monTime = millis();
if((monState == 0) && (monLastState == 1)) {
monPulseBegin = monTime;
monLastState = 0;
} else if((monState == 1) && (monLastState == 0) && millis() > 10000) {
monPulseDuration = monTime - monPulseBegin;
if(monPulseDuration > debounce) {
monLastState = 1;
}
if((monPulseDuration > 80) && (monPulseDuration < 110)) {
monPulse++;
monTime_count = millis();
}
}
if((monTime_count > 0) && (monTime - monTime_count > 300) && monTime > monTime_count) {
balance += monPulse;
monPulse = 0;
monTime = 0;
monTime_count = 0;
monPulseDuration = 0;
monLastState = 0;
monPulseBegin = 0;
}
}
void main_n() {
switch(status) {
case 0 ... 2: {
if(balance != balance_old && balance != 0) {
status = 2;
balance_old = balance;
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Баланс: " + String(balance) + " руб.");
time_status = millis();
} else {
if(status == 0) {
filtTime = millis();
status = 1;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(String(filtTemp) + " C");
lcd.write(223);
lcd.setCursor(0, 1);
lcd.print("Кофемат работает");
} else if(status == 1 && (millis() - filtTime) >= 1000) {
filtTime = millis();
lcd.setCursor(0, 0);
lcd.print(String(filtTemp) + " C");
lcd.write(223);
}
}
break;
}
case 3: {
if((millis() - time_status) >= timeTraget) {
if(progress == 0) lcd.clear();
progress++;
lcd.setCursor(6, 0);
lcd.print(String(progress) + " %");
lcd.setCursor(round(0.16 * progress), 1);
lcd.write(255);
time_status = millis();
if(progress >= 100) {
//status = 0;
balance_old = 0;
progress = 0;
}
}
break;
}
case 4: {
if((millis() - time_status) >= 2000) {
status = 0;
time_status = 0;
balance_old = 0;
}
}
case 5: {
if((millis() - time_status) >= 3000) {
status = 0;
time_status = 0;
balance_old = 0;
}
}
}
if((millis() - time_status) >= 240000 && status == 2) {
status = 0;
time_status = 0;
balance = 0;
}
}
фото моторчика U17: Liw-Dq-Q85-IMUk5h7-PVwnemkf-Em-YVNx-G2l0oa-A-e-Ait-Xt-Bgy-Ts-U9-Yczr-GPi2irye-a-Ogco-BUlx-Hp-LO9-QJY hosted at ImgBB — ImgBB
фото моторчика U16: image-3 hosted at ImgBB — ImgBB
фото моторчиков 24v DC: image-1 hosted at ImgBB — ImgBB
image-2 hosted at ImgBB — ImgBB
фото катушек: image hosted at ImgBB — ImgBB
фото бп 24 и 8.2в: Screenshot hosted at ImgBB — ImgBB
фото бп 12в: image-4 hosted at ImgBB — ImgBB
@MMM скинул
Для начала добавьте диодики на моторчики.
Между моторчиками и ардуиной что стоит? На картинке не разобрать.
Параллельно? Катод к плюсу?
Реле SRD-05VDC-SL-C 8 каналов
А сфотай свой монтаж, пожалуйста.
Можешь Ардуинку запитать от батарейки? А все остальное от БП. Минус батарейки соедини с минусом всей схемы. Посмотри, не изменится ли поведение.
Не помешает. Я только сейчас сослепу разглядел, что у тебя там и 220VAC моторчики стоят. Причем просто воткнуты в сеть, через реле. Они нещадно гадят в сеть и, скорее всего, в этом и причина. Надо разделить питание ардуинки и всего остального. Ардуинку запитать от батарейки, посмотреть не поможет ли. А там видно будет
Все приблизительно в таком состоянии, проект я собираю на базе старого вендингового кофеаппарата VISTA SM Coin 180.
Моторчики подключены на прямую к ардуино.
Попробую
Поставил батарейку, полностью обесточил 12-вольтовый БП.
Ардуинка не зависла, а просто перезапустилась при срабатывании электромагнитного клапана (катушки)
Я скорее всего, щас все буду разбирать чтобы сделать нормальный кабельменеджмент и изоляцию
Я? Это же Ваша картинка!
Для истории напомню: ТС пришёл с вопросом Ардуино, проблема с помехами на монетоприемнике с перерываниями. Ему подробнейшем образом рассказали и показали с картинками. ТС слился, причем на форум Гайвера, где ему рассказали то-же самое! Реле 8 каналов. Как подключить через JD-VCC? | AlexGyver Community
Результат - эта картинка. Лично я больше помогать не намерен.
поставь диод в обратную полярность, параллельно клапану, как можно ближе к нему
спасибо, диод помог, искра погашена
Только вот вопрос, искра погашена на электромагнитном клапане (модуль, который по сути открывает воду силами электромагнитной катушки), а как погасить на помпе 220V AC 55w?
Электромагнитный клапан, на котором погашена искра: image hosted at ImgBB — ImgBB
Помпа, на которой я хочу погасить искру во время отключения её от питания: Liw-Dq-Q85-IMUk5h7-PVwnemkf-Em-YVNx-G2l0oa-A-e-Ait-Xt-Bgy-Ts-U9-Yczr-GPi2irye-a-Ogco-BUlx-Hp-LO9-QJY hosted at ImgBB — ImgBB
И если вас не затруднит, по этому моторчику тоже: image-3 hosted at ImgBB — ImgBB
любая индуктивная нагрузка должна быть защищена диодом, установленным обратно параллельно нагрузке. помпа там или не помпа - любая индуктивная, т.е. с моторчиком.
а че, помпа работающая от 220В тоже дает наводку? скорее всего, наводка идет от реле которое ее включает, по сути это такой же привод как клапан, тоже диод ставь обратно, правило универсальное.
без впн ваши картинки не открываются. я не понял, как прибор работающий от 220В мешает работе МК? опишите ваш случай, я чето не понимаю.
едит: мля, я посмотрел вашу сборку на картинке выше. это говнище надо переделать. прототипирование не означает “сделать говно”. извините.
если реле рвёт переменный ток на контакты ставят снаббер, цепочка RC