Добрый день, многоуважаемые форумчане,подскажите пожалуйста по скетчу.Ввиду того что человек я общительный имею много знакомых ,родственников,друзей,соответсвено бывает у меня много застолья,и наверно не все приходящие умеют пользоваться сливом унитаза)))вот и решил сделать слив автоматическим.В проекте использую: ардуино уно, 2 серво, 2 сенсорные кнопки,адресную светодиодную ленту ws2812b и инфракрасный датчик измерения шарп. суть скетча такова,что при приближении человека на определенное расстояние зажигается светодиодная лента с лево на право и продолжает гореть пока объект находится на определенном расстоянии, если объект удаляется светодиодная лента гаснет с право на лево срабатывают 2 сервопривода(слив,освежитель),во время нахождения объекта в туалете можно отдельно управлять двумя серво с помощью сенсорных кнопок(слив,освежитель).Помогите пожалуйста с правильной работай кнопок что бы они могли самостоятельно работать с сервами без нарушения основной логики. И самое главное с чем я мучуюсь, это светодиодная лента:мне надо что бы при срабатывании датчика, с лево на право на ленте с 0 до 40 светодиода загоралось синим цветом и хаотично увеличивалась и уменьшалась яркость синих диодов (полы),с 40 до 100 диода загорались хаотично разноцветные вспышки (стена),с 100 до 150 диода просто горело только белым цветом (потолок).Что то я уже сделал благодаря темам с вашего форума очень помог своими постами многоуважаемый Tomasina ну и другие ресурсы в сети. Код (C++): #include <Servo.h> #include "FastLED.h" #define DATA_PIN 8 #define NUM_LEDS 33 #define SPEED 150 #define LED_TYPE WS2811 #define COLOR_ORDER GRB #define OFFTIME 20 byte ledBrightness = 64; #define LEFT 0 #define RIGHT 1 #define OFF 0 #define ON 1 CRGB leds[NUM_LEDS]; int button1 = 4; int press1 = 0; int button2 = 5; int press2 = 0; Servo myservo; Servo myservo1; const int sensorPin = A0; int pos = 0; int sensorValue = 0; const int queue_length = 5; int queue [queue_length]; long starttime; int justClose = 0; long avg; void setup() { Serial.begin(9600); myservo.attach(11); myservo1.attach(10); starttime = millis(); myservo.write(180); myservo1.write(180); FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); FastLED.setBrightness(ledBrightness); pinMode(button1, OUTPUT); pinMode(button2, OUTPUT); digitalWrite(4, LOW); digitalWrite(5, LOW); } void ledManager(boolean dir, boolean state) // черный ящик с входными параметрами - направление (направо/налево) и действие (вкл/выкл) { for (byte i = dir * NUM_LEDS; i != NUM_LEDS - dir * NUM_LEDS;) // ленивый цикл, сам все формирует :) { leds[!dir ? i++ : --i] = CRGB(0 * state, 0 * state, 255 * state); // специально для ИгорьК - одна строка вместо 12 ;o) FastLED.show(); delay(SPEED); } } void loop() { long elapsedtime = millis() - starttime; if (elapsedtime > 1000 ) { sensorValue = analogRead(sensorPin); long sum = 0; for (int i = queue_length-1; i > 0; i--) { queue[i] = queue[i-1]; sum += queue[i]; } queue[0] = sensorValue; sum += queue[0]; avg = sum/queue_length; starttime = millis(); Serial.println(avg); } if (avg > 100) { justClose = 1;ledManager(LEFT, ON);} if (avg < 70 && justClose) { Serial.println("FLUSH"); myservo.write(11); myservo1.write(11); delay(15000); myservo.write(180); myservo1.write(180); ledManager(RIGHT, OFF); justClose = 0; } press1 = digitalRead(button1); if (press1 == HIGH) {myservo.write(11); } else {myservo.write(180); } press2 = digitalRead(button2); if (press1 == HIGH) {myservo1.write(11); } else {myservo1.write(180); } } void testDirection() { ledManager(LEFT, ON); // включаем подсветку справа налево (от датчика 1) delay(3000); ledManager(LEFT, OFF); // отключаем подсветку справа налево (от датчика 1) delay(3000); ledManager(RIGHT, ON); // включаем подсветку слева направо (от датчика 2) delay(3000); ledManager(RIGHT, OFF); //отключаем подсветку слева направо (от датчика 2) delay(3000); } void testLEDstrip() { while (1) // бесконечный цикл { static boolean state = 0; state = !state; for (byte i = 0; i < NUM_LEDS; i++) { leds[i] = state ? CRGB::Red : CRGB::Black; FastLED.show(); delay(SPEED); } for (byte i = 0; i < NUM_LEDS; i++) { leds[i] = CRGB::White; FastLED.show(); delay(SPEED); leds[i] = CRGB::Blue; FastLED.show(); } } }
Вот это вот всё станет абсолютно ненужным, если: 1. Не водить к себе в гости малограмотных людей, интеллект которых не позволяет запомнить им, как работает слив. С такими можно встечаться и во дворе, они все равно не утруждают себя поисками туалета, кусты сойдут. 2. Для других, на вид не столь безнадёжных, проводить подробную и тщательную инструкцию по пользованию сливом, можно даже с закреплением моторных навыков. Не запомнили - это в первую категорию гостей и --> во двор. 3. Не напиваться до состояния, когда вылетают из головы простейшие инструкции по пользованью сливом. И наступит щастье....
Поправить скетч с трёхсекундными задержками так, чтобы в нём могли одновременно работать и кнопки, и сервы, и всё остальное практически невозможно (можно, но для этого нужна квалификация, значительно превышающая то, что мы здесь наблюдаем). Поэтому, единственный выход - перепроектировать программу так. чтобы в ней не требовались блокирующие операции такой длительности и переписать с нуля.
Там даже 15 секунд задержка есть... С выводом полностью согласен - этот скетч править без толку, его надо выкинуть и написать правильный с нуля. Автору - посмотрите пример "блинк без делей" (blink without delay) - это то, с чего надо начать проектирование правильного скетча.
Не умеете Вы жизнь в праздник превращать! Видел в сети концепт умного унитаза, так там и выход в соцсети есть
Я не понял для чего. Единственное, что могу предположить - раз есть любители еду в ресторанах в инстаграм постить, то должны быть и любители продукт переработки еды туда же.выкладывать.
И как?В наших условиях?Я тоже такой взял бы.Эт конечно черезчур но для себя любимого-можно.главное гостей не пускать.
http://www.senspa.ru Здесь брал. Крышки. Не страшны они гостям. Ничего с ней не сделать задницей. Только молотком
Спасибо парни за критику и нужную ссылку,учту ваши пожелания по delay.ведь я только начал разбираться с ардуино,основываясь на примеры и уроки других. Но жалко что вы имеющие не один год за плечами -знания даже не посмотрели код,а ведь в коде только один delay (15 сек ) между работой серводвигателей ,а все остальные не участвуют, но написаны! (могу удалить если вас это нервирует),складывается такое ощущение что просто ищете в кодах что вам не нравится ,указываете новичку на ошибку словом а не делом и все дальше просто ФЛУД про жизнь.Вы подскажите по вопросам которые вам задают люди,конкретно я даже выделил жирным их в своем вопросе,но все равно началось "научи людей смывать,не пейте,и так далее",за чем вам этот флуд. если вы мастер своего дела подскажите, приведите пример новичку. Только один b707 подсказал что надо посмотреть про задержку, а про то как разместить на одной ленте 3 разных эффекта работающих одновременно ни слова.Итог помощи самый мизерный!
Вам был дан пример в самом начале темы. blink without delay. Там показан принцип, по которому можно решить немалую часть ваших проблем. Когда вы разберетесь, и напишете соответствующий код - возвращайтесь. Пока больше говорить не о чем.