Měřič na bázi Arduina a umístění LED

Yutani

Měřič na bázi Arduina a umístění LED
« kdy: 14. 01. 2015, 01:53:47 »
Dobry den,
Doufam, ze zde pisi svoji prosbu o pomoc na spravnem miste, pokud je to jiny odkaz tak se predem omlouvam..

Vytvoril jsem hybrid kodu pro svuj prototyp,
na prvni pohled ve sve funkci vypada, ze pracuje v poradku, ale v jistych okamzicich se chova divne, coz bohuzel je jen pulka meho problemu...

Kod je souctem tri veci:
1, meric vzdalenosti a jeho nastaveni hranice
2, meric vlhkosti pudy
3, jsou podminky, ktere urcuji chovani pristroje
(if, else).

Vse pracuje dobre, ale jakmile dosahnu ci prekrocim nastavenou hranici ve vzdalenosti k prekazce, zacne prototyp pipat (to je OK), ale problikavat display v hodnotach real. delky a nastavene delky... nevim co stim, je to dosti neesteticke a uz ted to vypada desingove cela krabicka jako na koleni delana :(( Bohuzel nevim, kde hledat problem... cisty kod je vporadku, do te doby nez ho sloucim s dalsimi a i tak obcas display se chova normalne (nahodne). Druhy problem, se kterym chci nekoho poprosit o pomoc je:
Ze potrebuji, aby mi pracovali kontrolky stavu... Napr. zapnuti Arduina (je tam jiz umistena, ale mam pocit, ze se stim Arduino pere), sepnuti (1x LED) a rozepnuti rele (1x LED), pri pipani dosazene vzdalenosti (1x LED).. nevim bohuzel jake je vlozit do kodu tak, aby ve vyse uvedenych situacich svitily :( Dalsi pouzivani else a if mi kompilace uz nezere a jako temer uplneho zacatecnika me nic nenapada, a google me nijak nepomohl (nevim jak definovat problem).  A ted malinkou otazecku.... pro lepsi osvetleni daneho stavu (napis) jsem musel pouzit 2x ledky... arduino mi na port neda vice jak 5V, proto jsem je zapojil seriove, to vsak ma vetsi odber mA, neodpali to Arduino ?

Predem se opravdu moc omlouvam za dlouhy text, ale chtel jsem to vse vysvetlit.. nize uvadim cely svuj kod.
Dekuji moc dekuji za Vase odpovedi.

#include <LiquidCrystal.h>
LiquidCrystal lcd(22, 24, 26, 28, 30, 32);
 
const int trigger=23;
const int echo=25;
const int altavoz=2;
const int potAlarm=A4;

int led_limit= 34;
int led_cerpadlo= 31;
int led_power= 29;
int led_stop= 27;
int relay= 36;
int sensorPin = A0; // Sensor Soil Humidity
int sensorValue = A0;
int sensor2Pin = A1; // Sensor Light
int sensor2Value = A1;
 
float distance;
int val;
float lim;
 
void setup(){
 
  Serial.begin(9600);
  pinMode(led_limit, OUTPUT);
  pinMode(led_cerpadlo, OUTPUT);
  pinMode(led_stop, OUTPUT);
  pinMode(led_power, OUTPUT);
  pinMode(relay, OUTPUT);
  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);
  lcd.begin(16,2);
 
}
 
void loop(){ 
  val=analogRead(A4);
  lim=val*0.00293;

  digitalWrite(trigger,LOW);
  delayMicroseconds(5);
  digitalWrite(trigger,HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger,LOW);

 distance=pulseIn(echo,HIGH);
                             
                             
 distance=distance*0.0001657;

if(distance>lim){
  analogWrite(2, 100);
  digitalWrite(relay, LOW);
 
}
else{analogWrite(2, 0);
}
 
  sensorValue = analogRead(A0);
  sensor2Value = analogRead(A1);
  Serial.print("Vstupni sensoricka data Humidity - "); // Name date sensor Humidity
  Serial.println( sensorValue );
  Serial.print("Vstupni sensoricka data Light - "); // Name date sensor Light
  Serial.println( sensor2Value );
  Serial.print("Vstupni sensoricka data Vzdalenost hladiny - ");
  Serial.println(distance);
   
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Hladina:");
  lcd.setCursor(12,0);
  lcd.print(distance);
  lcd.setCursor(0,1);
  lcd.print("limit:");
  lcd.setCursor(9,1);
  lcd.print(lim);
  delay(500);
  digitalWrite(29, HIGH);
 
 if (sensorValue < 95)
   digitalWrite(relay, LOW);   
  else 
 if (sensor2Value < 30)
   digitalWrite(relay, LOW);   
  else
 if (sensorValue > 110)
   digitalWrite(relay, HIGH);   
  else   
 if (sensor2Value > 31)
   digitalWrite(relay, HIGH);         
}   


h7

Re:Měřič na bázi Arduina a umístění LED
« Odpověď #1 kdy: 14. 01. 2015, 05:40:46 »
Nevím, jakým způsobem to poblikává. Zda jde o rychlé přepisování hodnot (to bys poznal, když bys tam vložil nějaké delší čekací pauzy - místo 500 ms nebo v jakých jednotkách to je) nebo něco jiného. Napadá mě, zda není to poblikávání displeje jeho pohasínání kvůli velkému odběru a tedy poklesu napětí. Arduino jsem nikdy neviděl, hw nedělám – takže ber s velkou rezervou. Když se překročí ten limit, tak něco zapneš (pípání a nějaké relátko s LEDkami nebo tak něco). Zkusil bych upravit program tak, že program pouze udělá tohle ty akce, které děláš při překročení limitu:

analogWrite(2, 100);
digitalWrite(relay, LOW);

A zapnul případné další věci, které v takovém situaci něco spotřebovávají. A uvidíš, jak se to bude chovat.

PS: Za podrobný popis problému se neomlouvej - to je naopak správně. Špatné, když se někdo ptá "mě to nefunguje, čím to je?" a nic víc neuvede.

filip

Re:Měřič na bázi Arduina a umístění LED
« Odpověď #2 kdy: 14. 01. 2015, 10:09:42 »
ja bych to videl stejne. Zkus si hrat s delay(500) a uvidis, jestli se zmeni frekvence blikani.

  lcd.clear();
...
zapis na lcd
...
  delay(2000);

Pokud by to bylo tim, tak muzes zrusit lcd.clear() a misto toho jen prepsat text na lcd novym textem. jen si musis pohlidat, abys ho prepsal cely a nic ze stareho textu nezbylo. Pak uz to blikat nebude.

Yutani

Re:Měřič na bázi Arduina a umístění LED
« Odpověď #3 kdy: 14. 01. 2015, 10:35:15 »
Moc dekuji za Vase odpovedi.....

Uvedu priklad toho blikani - 

(limit nedosazen / prekrocen) :

Vzdalenost: 0.25 m
Limit: 1 M

(limit dosazen / prekrocen - pipani) :

Vzdalenost: 1.07 M
Limit: 1 M

v te chvili to zacne delat v case delay(500) nasledujici data:

Vzdalensot: 0.37 M
Limit: 0.97 M

Vzdalenost: 1.23 M
Limit: 0.57 M

Vzdalenost: 1.08 M
Limit: 1 M

atd.

- kdyz zvysim delay tak problikavani dat sice ustane (ne v tak rychlem sledu), ale mereni bude o to pomalejsi vcetne regulace (potenciometrem) limitu.

- ale jak jsem rekl. je to esteticky problem, ktery neni zrovna krasny :)
- estetiku prekousnu, hlavne uvnitr (klubko dratu atd), ale umisteni stavu LED je uz problem, ktery neprekousnu...
tj. 6x napisu bez osvetleni a o stavu pristroje jen domnivaje...

Pouzivam pro napajeni Arduina LM78M08, kvuli jeho nadmernemu prehrivani (odber je pouze 1/5 celkoveho vykonu stabilizatoru)
 jsem ho odstavil (u 1/5 vykonu jsem necekal, ze budu potrebovat vykonny chladic - ktery se mi nikam uz nevejde),
a pouzivam USB napajeni... nicmene u prvniho ci druheho typu napajeni se display chova stejne. 

dTTb

Re:Měřič na bázi Arduina a umístění LED
« Odpověď #4 kdy: 14. 01. 2015, 16:57:06 »
co prekreslovat lcd jenom v jednom z N prubehu?

cekani++;
if(cekani==4){
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Hladina:");
  lcd.setCursor(12,0);
  lcd.print(distance);
  lcd.setCursor(0,1);
  lcd.print("limit:");
  lcd.setCursor(9,1);
  lcd.print(lim);
  cekani=0;
}
  delay(500);
  digitalWrite(29, HIGH);


h7

Re:Měřič na bázi Arduina a umístění LED
« Odpověď #5 kdy: 14. 01. 2015, 17:23:10 »
A nebo si do nějakých dalších proměnných ulož poslední zobrazený stav těch hodnot. A překresluj displej jen v případě, že nově naměřené hodnoty jsou jiné než ty uložené (tedy ty, které jsou na displeji). A při překreslení displeje si zase uložíš aktuální stav.

Pokud lze displej překreslovat po částech, tak můžeš překreslovat jen ty části displeje, které se mění (třeba jen údaj o vzdálenosti).

Yutani

Re:Měřič na bázi Arduina a umístění LED
« Odpověď #6 kdy: 14. 01. 2015, 17:43:01 »
Jakym kodem definujete ono cekani==; ?

dTTb

Re:Měřič na bázi Arduina a umístění LED
« Odpověď #7 kdy: 14. 01. 2015, 20:46:54 »
cekani++; je zkraceny zapis pro cekani=cekani+1;