LED pásek + ultrasonic sensorem HC-SR04
Úvodní stránka › Fórum › Hardware › Arduino › LED pásek + ultrasonic sensorem HC-SR04
- Toto téma obsahuje celkem 10 odpovědí. Do diskuze (3 diskutující) se naposledy zapojil uživatel
posjirka a poslední změna proběhla před 8 roky a 6 měsíci.
-
AutorPříspěvky
-
15.1.2016 v 22:26 #5756
Krystof
ÚčastníkDobrý den,kdybyste my nikdo dal radu ohledně tohoto, moc by my to pomohlo:)
Mám připojený LED pás s ultrasonic sensorem (HC-SR04) při kontaktu bliká. A já potřebuji aby se při přiblížení se zvýšila světelná intenzita a při oddálení klesla.
No kdyby vás něco napadlo dejte prosím vědět Díky!
#include <ultrasonicranging.h>
#define ECHO_PIN 7 // ECHO pin of HC-SR04
#define TRIG_PIN 6 // Trigger pin of HC-SR04
#define LED_OUT 11 // Drive LED (Base pin of TIP120
const int space = 125; // Distance in cm in which to trigger LED
void setup()
{
Serial.begin (9600);
pinMode(TRIG_PIN, OUTPUT); // trigger pin of US range finder
pinMode(ECHO_PIN, INPUT); // Echo pin of US range finder
pinMode(LED_OUT, OUTPUT); // base of TIP120 to drive LED
analogWrite(LED_OUT, 0);
}
void GlowLed()
{
// Slowly get from LED strip off to full bright (glow-in)
for (int brightness = 25; brightness < 259; brightness++)
{
analogWrite(LED_OUT, brightness);
delay(3);
}
// Slowly get from LED strip on to full off (glow-out)
for (int brightness = 0; brightness >= 0; brightness–)
{
analogWrite(LED_OUT, brightness);
delay(3);
}
}
void loop()
{
int distance = GetDistanceInCm(TRIG_PIN, ECHO_PIN);
Serial.println(distance);
if (distance <= 0 || distance > space)
{
analogWrite(LED_OUT, 0);
delay(500);
return;
}
if (distance <= space)
{
GlowLed();
}
}17.1.2016 v 21:03 #5777posjirka
ÚčastníkVždyť nikde nemáš paralelu mezi vzdáleností a intenzitou, pouze stále dokola rozsvěcíš a zhasínaš LED.
Zkus toto, ale píšu to jen od PC nemám Arduino u sebe:
#include <ultrasonicranging.h>
#define ECHO_PIN 7 // ECHO pin of HC-SR04
#define TRIG_PIN 6 // Trigger pin of HC-SR04
#define LED_OUT 11 // Drive LED (Base pin of TIP120void setup()
{
pinMode(TRIG_PIN, OUTPUT); // trigger pin of US range finder
pinMode(ECHO_PIN, INPUT); // Echo pin of US range finder
pinMode(LED_OUT, OUTPUT); // base of TIP120 to drive LED
analogWrite(LED_OUT, 0);
}void loop()
{
int distance = GetDistanceInCm(TRIG_PIN, ECHO_PIN);
if (distance > 254 ) {
distance = 254;
}
analogWrite(LED_OUT, distance);
delay(500);
}17.1.2016 v 22:03 #5778Krystof
ÚčastníkMnohokrát děkuji,
hned v pondělí to vyzkouším.27.2.2016 v 13:21 #6182Nacelnik
ÚčastníkAhoj, zneužiji již tento vyřešený dotaz ke svému.
Jsem ve fázi úvah kdy chci také měnit intenzitu jasu pomocí vzdálenosti. Můj problém je ten, že když podržím překážku třebas v rozmezí 10-40cm (ta bude pevně daná) chci aby tato vzdálenost byla převedena na PWM a dále když tu překážku odstraním, tak chci aby hodnota PWM platila i pro odpojení napájení. Jenže jak to udělat?
Podržím ruku na 10 cm bude PWM 125 (vymyslel jsem si toto)
ale když tu ruku odstraním, tak nechci další přepočet ale chci aby platila hodnota 125.
PO čase podržím ruku na 30cm, přepočte se hodntota na PWM (třeba) 200 a pak když dám tu ruku pryč, aby zas platila hodnota 200.Šlo by to zapisovat do EEpromky ( nebude častý zápis),ale jak udělat to, že když dám ruku do vzdálenosti 10cm , rozsvítí se ledka jasem PWM 125 a když překážku odstraním, nedojde k přepisu hodnoty PWM dokuď zase nepodržím ruku jakkoliv ve vzdálenosti 10-40cm.
Poradíte?
Děkuji velice
David
27.2.2016 v 20:29 #6186posjirka
Účastníkeepromka ti moc nepomůže, spíš ji ničíš neustálím přepisem. Má max 100 000 přepísů což vypadá nekonečně ale při zápisu 1 x 1s = 100 000 s = 1666 min = 27h takže za 1 den zničíš 1 buňku eeprom….
Když se nad tím zamyslím, tak by to mohlo jít např. touto cestou:
1, udělat to formou hrubé stupnice např:
<10cm = 0 (pwm)
15-20cm = 85
25-30cm = 170
35-40cm = 255
>40cm = zapiš ale ignoruj
žádné mezi stavy, prostě tyto hodnoty.
2, Každou 1s si změříš vzdálenost.
3, Tu zapíšeš do pole o 5-ti hodnotách, které budeš neustále posouvat.
4, Když 3 z 5 hodnot budou stejné a přitom menší než 40cm nastav PWM a zapiš do eeprom (pokud je změna proti původní hodnotě v eeprom)Takže dáš ruku na víc než 3s na vzdálenost/intenzitu jakou chceš a podle toho se ti nastaví LED.
Co ty na to? Je to co si představuješ?
27.2.2016 v 21:49 #6194Nacelnik
ÚčastníkTu epromku bych použil pouze v při prvním zápisu „nastavení“, a pak ppři změně. tu změnu počítám tak 1 -2x za týden. Takže 100000/2 je mraky týdnů.
ad1) to se dá vyřešit matematicky ( např každé 2 cm = 1 PWM) + přidat argument – více jak 51cm – ignoruj
ad3) Jak to myslíš? To jsem nepochopil…Můžeš mi dát konkrétní příklad?D.
27.2.2016 v 22:43 #6197posjirka
Účastníknapíšu to hodně mírně : jaké máš zkušenosti s touto oblastí ???
Mám na mysli aplikace senzorů v reálném světě.27.2.2016 v 22:48 #6198posjirka
Účastník…nechám to tu chvilku odležet, nemám moc dobrý den a vznikla by zbytečná hádka bez řešení….. nech to být, hol jsem starý morous….
28.2.2016 v 17:20 #6199posjirka
Účastníkhotovo, odzkoušeno, vyřešeno. Až to vyzkoušíš v realitě zjitíš pro je zbytečné a krajně nevhodné hrát si s lineární stupnicí. Po odzkoušení pak celou serivou komunikaci zakomentuj ať ti zbytečně nezkouší odesílat data. zdržuje to procesor a může se i resetnout.
// LED ovládaná rukou v.2 // by JP 2016 // přiblížením ruky se reguluje intzenzita jasu LED od 0 do 100% jasu. // zatím ve 12 krocích 0 - 240 PWM // jemnější nastavení už téměř nejde dosáhnout. // nová intenzita se nastavuje přiblížením ruky na dobu 2s // V.2 - použito funkce map() pro nastavení citlivosti // knihovna EEPROM #include <EEPROM.h> int echoPin = 2; // přijímač int trigPin = 3; // vysílač long distance = 0; // čas odezvy / vzdálenost int LED = 10; // pin s LED diodou s PWM řízením long lastDistance = 0; // hodnota posledního měření int pwm = 0; // hodnota PWM long max_dist = 1500; // maximalni vzdalenost v ms long min_dist = 100; // minimalni vzdalenost v ms long kroku = 6; // pocet stupnu intenzit, kdy 0 = vypni, max = nereaguj takze pocet stupnu je koku-1 byte adresa = 1022; // adresa záznamu v EEPROM void setup() { Serial.begin(9600); pinMode(echoPin, INPUT); pinMode(trigPin, OUTPUT); pinMode(LED, OUTPUT); pwm = EEPROM.read(adresa); // načtení poslední hodnoty z EEPROM analogWrite(LED, pwm); // zápis PWM } void loop() { // vysílám impulz digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // měřím délku odezvy distance = pulseIn(echoPin, HIGH); Serial.print(distance); distance = map(distance, min_dist, max_dist, 0, kroku); // prepocet na stupne intenzity svitu LED distance = constrain(distance, 0, kroku); // omezení přepočtu na nastevný rozsah Serial.print("/"); Serial.print(distance); Serial.print("/"); Serial.println(kroku); if (lastDistance == distance){ if (distance < kroku){ pwm = distance * (255/(kroku-1)); // přepočet na PWM analogWrite(LED, pwm); // zápis PWM // změna oproti záznamu v EEPROM if (pwm != int(EEPROM.read(adresa))) { EEPROM.write(adresa, pwm); // záznam do EEPROM Serial.print("Zapis do EEPROM ..."); } } } Serial.print("Aktualni PWM ..."); Serial.println(pwm); lastDistance = distance; // předání záznamu posledního měření delay(1000); }
28.2.2016 v 20:42 #6200Nacelnik
ÚčastníkAhoj, několikrát jsem četl tvůj kód a kombinace map a constrain je to pravé – vždycky jsem to řešil nějakým matematickým vzorcem, tyhle fce to udělají jednodušeji a najednou mi to dává smysl….
děkuji ti moc, touhle ukázkou jsi mi ušetřil několik dní života.
Pěkný den a večer.
David28.2.2016 v 21:45 #6201posjirka
Účastníknemáš zač. Tu hrubou stupnici jsem tam navrhoval od začátku proto, že nikdy neudržíš ruku ve stejné vzdálenosti od čidla. To čidlo taky nikdy nedá 2x po sobě stejný výsledek už jen proto, že se musí počítat z dozvukem předcházejícího signálu , nerovnosti plochy, atd atd.
Ani průměr několika hodnot ti nepomůže a budeš mít nejen velký rozptyl, ale navíc tě to bude stát spoustu času.
Zkoušel jsem zkrátit čas smyčky na 500ms a nefunguje to špatně, navíc je to celkem rychlý.Rád jsem pomohl,…
-
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.