Go Down

Topic: Hjælp til water level sensor code (Read 11119 times) previous topic - next topic

johnnyAlb

Hej på forumet

Der er vel ikke nogen som kan hjælpe en næsten nybegynder med en simpel code til sådan nogle water level sensor'er på billedet.
Det skal være sådan at når vandstanden falder ca 5-7 % så sender den et signal til arduino'en og videre til et relæ board.

Der skal bruges 4 x level sensor'er og et 4 relæ board.
Pins som jeg forventer at bruge, er (A1-A4) til sensor'er og (D4-D7) til relæ board, med mindre der er andre gode forslag

Jeg bruger en Arduino Leonardo og et sensor udvidelse board v4 til projektet.

Hvis der er nogen som vil hjælpe en code-blind og skal bruge flere oplysninger, så skriv endelig  :)

Mvh Johnny

3dprinter

Tja ja - det er det samme som enhver anden analog input. Jeg ved jo ikke noget om kredsløbet - men antagr du har styr på det.

Program 1: Se hvad der kommer af værdier
Code: [Select]

void setup() {
  Serial.begin(9600) ; // På leonardoen er det her trin måske en anlese anderledes. Kig i et eksempel
}

void loop() {
  Serial.println(analogRead(A1));   
  delay(1000);
}
Det vil vise i et sekunds intervaller på din SerialMonitor hvad du måler.

Få det til at virke. Noter dig de værdier den rapporterer når den er tør, halv i, fugtig m.m.

Herefter erstatter du Serial.begin-linjen i setup med
Code: [Select]
  pinMode(D4,OUTPUT) ;
og i loop Serial.print med
Code: [Select]
  if ( analogRead(A1) > 345 ) digitalWrite(D4,HIGH) ; else digitalWrite(D4,LOW) ;
Hvr værdie 345 er en der passer med dine målinger

Det skulle få dig startet...

johnnyAlb

Hej igen

Rigtig mange tak for svaret og har rodet lidt med det, og det så ud til at virke fint, men da jeg så fik justeret programmet så relæet slukkede ved den ønskede værdi, så blev den lille kreds på sensoren sindsygt varm og så brændte sensoren af, Hmm, og det var samme problem med sensor nr 2, så ved ski ikke lige hvad der er gået galt.  :(

Nå men her er lige en tegning ang hvad jeg havde tænkt mig, det er den første tegning jeg lavede så der tages forbehold for fejl og mangler :) og pins til relæ boardet er blevet lavet om siden, men håber man alligevel kan danne sig et indtryk af hvor jeg gerne vil hen  :)

PS. Jeg kunne så også godt tænke mig at der kom et display på udover det der er vist, så man kan se hvornår der bliver fyldt vand på, samt se hvor meget vand der ryger igennem systemet via flow metret.

Mvh Johnny

3dprinter

Det ser alt rimeligt ud - på papir.

Inkluder dit program i næste svar. (tryk på # ikonet i svar vinduet så program koden kommer i en pæn kasse for sig)

Hvis du skriver til analog porten (feks laver en digitalWrite(A1,HIGH) ) så kan det forklare at du brænder sensoren. Du må kun lave analogRead eller digitalRead fra de pinde du kobbler dine sensorer på. Du må ikke bruge pinMode(A1,OUTPUT),

Hvis du har brugt biblioteket for at snakke med RTC så bruger den A4 og A5. Det kan ikke laves om på, det er internt i chippen. Det kan også forklare din varme sensor brug A0-A3 (det er 4 styks)

I øvrigt - der findes ikke en defenition for D4 - det skrev jeg for oversigtens skyld. Du er selv nødt til at definere const int D4 = 4 ; for at navnet "D4" skal betyde digital pin 4.

Rent programmerigns mæssigt skal der være en "afstand" mellem grænseværdien for at tænde og for at slukke (hysterisis). Isør da analog læse værdier ofte variere med et par trin (støj/usikkerhed i Anlog-kredsløbet)
Code: [Select]
int Sensor=analogRead(A1) ;
if (Sensor < 300) digitalWrite(D4,HIGH) ;
if (Sensor > 400) digitalWrite(D4,LOW) ;
Her vil den ikke ændre i relæ tilstanden hvis analog ind værdien er mellem 300 og 400 (inklusiv), mens den vil ændre tilstanden hvis den er udenfor.


Erni

På din tegning har du skrevet at du bruger en Arduino Leonardo.
På den type bruges A2 og A3 som SDA/SCL til din RTC

johnnyAlb


Det ser alt rimeligt ud - på papir.
Takker og syntes selv det blev nogenlunde, nu hvor det er min første tegning  :)

Inkluder dit program i næste svar. (tryk på # ikonet i svar vinduet så program koden kommer i en pæn kasse for sig)

Hvis du skriver til analog porten (feks laver en digitalWrite(A1,HIGH) ) så kan det forklare at du brænder sensoren. Du må kun lave analogRead eller digitalRead fra de pinde du kobbler dine sensorer på. Du må ikke bruge pinMode(A1,OUTPUT),

Hvis du har brugt biblioteket for at snakke med RTC så bruger den A4 og A5. Det kan ikke laves om på, det er internt i chippen. Det kan også forklare din varme sensor brug A0-A3 (det er 4 styks)

I øvrigt - der findes ikke en defenition for D4 - det skrev jeg for oversigtens skyld. Du er selv nødt til at definere const int D4 = 4 ; for at navnet "D4" skal betyde digital pin 4.

Rent programmerigns mæssigt skal der være en "afstand" mellem grænseværdien for at tænde og for at slukke (hysterisis). Isør da analog læse værdier ofte variere med et par trin (støj/usikkerhed i Anlog-kredsløbet)
Code: [Select]
int Sensor=analogRead(A1) ;
if (Sensor < 300) digitalWrite(D4,HIGH) ;
if (Sensor > 400) digitalWrite(D4,LOW) ;
Her vil den ikke ændre i relæ tilstanden hvis analog ind værdien er mellem 300 og 400 (inklusiv), mens den vil ændre tilstanden hvis den er udenfor.



Hej Msquare

Rigtigt mange tak for svar igen, sætter stor pris på den hjælp jeg kan får  :) da jeg åbenbart er total code-blind  :)
Jeg prøvede at bruge den code du skrev i første indlæg.

Der er sikkert noget jeg har helt misforstået ved den, for kan godt se nu at der nok mangler noget.
Den Serial.print jeg fik fra dit eksempel 1 viste, tør 57 og helt våd 124 fra sensor'en.

Og som du kan se, så lavede jeg D4 om til 4 for ellers kunne programmet ikke finde ud af det, men det har du lige skrevet hvorfor  :P

Code: [Select]
void setup() {
   pinMode(4, OUTPUT);
}

void loop() {
  if ( analogRead(A1) > 80 ) digitalWrite(4, HIGH);
  else digitalWrite(4, LOW);
}


RTC'en er nemlig sat til A4 og A5, for der har jeg læst det skulle være, men kan heller ikke få den til at virke, så den skriver rigtige tid og dato.

PS. Jeg har sensor shield v4 sat på Leonardo'en, men det burde vel ikke ha nogen indvirkning på pinsne og programmet, eller???

Mvh Johnny



johnnyAlb


På din tegning har du skrevet at du bruger en Arduino Leonardo.
På den type bruges A2 og A3 som SDA/SCL til din RTC


Rigtig mange tak for svaret.
Gælder det også når der er sat et sensor shield v4 på Leonardo'en ???

Mvh Johnny

3dprinter

Ja, det er selve chippen der har SDA/SCL på de ben. Det kan en shield ikke ændre på. (Leonardoen bruger en anden ATmel chip end UNO, derfor er det forskel på de to)

johnnyAlb


Ja, det er selve chippen der har SDA/SCL på de ben. Det kan en shield ikke ændre på. (Leonardoen bruger en anden ATmel chip end UNO, derfor er det forskel på de to)


Takker igen
Ahhh, jamen så blev jeg da så klog  :)

Nu har jeg lige prøvet at rode lidt med coden igen, og er det sådan her du mener det skal se ud???
Og skal jeg så lave det x 4 eller hvordan gør man det???

Nu kan jeg desværre ikke afprøve det før der kommer nye sensor.

Code: [Select]
const int D4 = 4 ;

void setup() {
   pinMode(D4, OUTPUT);
   
  Serial.begin(9600);
}

void loop() {
int sensor=analogRead(A0) ;
  if (sensor < 300) digitalWrite(D4, HIGH) ;
  if (sensor > 400) digitalWrite(D4, LOW) ;
 
  Serial.println(analogRead(A0));
    delay(2000);
}


Mvh Johnny

Erni

Hvis du har et ptentiometer, kan du bruge det til at teste med.
Det er sikkert også lettere og så ungår du vandpjaskeri:

http://arduino.cc/en/Tutorial/ReadAnalogVoltage

Har du et link til dine sensorer ?

johnnyAlb


Hvis du har et ptentiometer, kan du bruge det til at teste med.
Det er sikkert også lettere og så ungår du vandpjaskeri:

http://arduino.cc/en/Tutorial/ReadAnalogVoltage

Har du et link til dine sensorer ?


Hej Erni
Tak for svaret

Sjovt for jeg sad lige i dag og kikkede på det du linker til og tænkte om det var noget jeg kunne bruge til noget, så det vil jeg da lige prøve at kikke lidt nærmer på, for vandpjaskeri har jeg haft rigeligt af, da jeg har 37 akvarier  :)  :) men jeg brugte nu et plast glas og et lille beslag af akryl til at teste de andre på, og så helte jeg vand i glasset med en stor sprøjte og lidt af gangen.

Her får du da lige et link til sensorne:
http://www.ebay.com/itm/NEW-Water-Level-Liquid-Droplet-Surface-Height-Depth-Detection-Sensor-For-Arduino-/190961473967?pt=AU_B_I_Electrical_Test_Equipment&hash=item2c7630d9af

johnnyAlb



Hvis du har et ptentiometer, kan du bruge det til at teste med.
Det er sikkert også lettere og så ungår du vandpjaskeri:

http://arduino.cc/en/Tutorial/ReadAnalogVoltage

Har du et link til dine sensorer ?


Hej Erni
Tak for svaret

Sjovt for jeg sad lige i dag og kikkede på det du linker til og tænkte om det var noget jeg kunne bruge til noget, så det vil jeg da lige prøve at kikke lidt nærmer på, for vandpjaskeri har jeg haft rigeligt af, da jeg har 37 akvarier  :)  :) men jeg brugte nu et plast glas og et lille beslag af akryl til at teste de andre på, og så helte jeg vand i glasset med en stor sprøjte og lidt af gangen.

Her får du da lige et link til sensorne:
http://www.ebay.com/itm/NEW-Water-Level-Liquid-Droplet-Surface-Height-Depth-Detection-Sensor-For-Arduino-/190961473967?pt=AU_B_I_Electrical_Test_Equipment&hash=item2c7630d9af

3dprinter

Jo ... jeg kunne skrive det om på flere forskellige måder og det vil bare være anderledes, men ikke nødvednigtvis bedre. Der er dog en "fejl" :

Den værdi du udskriver på Serial er IKKE den samme som den du har brugt at styre relæet med. Det er en ny læsning af inputtet. Hvis du vil bekræfte værdien som styrede relæset så skal du Serial.print(sensor). Ligeledes når du har flere input, så må du huske at læse ind i sensor for hver af dem.

Du bør nok flytte deklarationen af sensor ("int sensor" delen af linjen) udenfor, foran setup(),, og så indlæse en værdi
Code: [Select]
int sensor;
  :
sensor = analogRead(A0) ;
if ( sensor ...
Det er god stil den var indenfor før, men nu jeg kender dig lidt mere anbefaler jeg det andet så det er mindre sandsynlighed for bøvl når du skal gøre det "4 gange". (Og det med arrays for at kun skrive det en gang tager vi en anden dag. Det er helt OK i dette program at skrive den del af koden næsten ens de 4 gange.)

Resten er smag og behag:  (og der er god stil og dårlig stil, men jeg vil ikke skrive en bog her ;) )

Det program vil så både klappre med relæet og skrive på Serial monitoren - hvis det er det du vil.

Linjen const int D4 = 4 ; er lidt overflødigt da "D4" åbnelys er pin 4. Du kan give det et bedre navn som "Pumpe1" eller Faerskvandpumpe; altså const int Faerskvandpumpe = 4 ;. Så er det i koden indysende at digitalWrite(Faerskvandpumpe,HIGH) ; vil tænde den.

Du kan også omdøbe A0 på lignende måde : const int Bundkar = A0 ;  fordelen er at hvis du ænder dine ledninger, så behover du bare rette et sted

Fortsat god held med projektet

johnnyAlb

#13
Feb 12, 2014, 07:03 pm Last Edit: Feb 12, 2014, 07:05 pm by johnnyAlb Reason: 1

Jo ... jeg kunne skrive det om på flere forskellige måder og det vil bare være anderledes, men ikke nødvednigtvis bedre. Der er dog en "fejl" :

Den værdi du udskriver på Serial er IKKE den samme som den du har brugt at styre relæet med. Det er en ny læsning af inputtet. Hvis du vil bekræfte værdien som styrede relæset så skal du Serial.print(sensor). Ligeledes når du har flere input, så må du huske at læse ind i sensor for hver af dem.

Du bør nok flytte deklarationen af sensor ("int sensor" delen af linjen) udenfor, foran setup(),, og så indlæse en værdi
Code: [Select]
int sensor;
 :
sensor = analogRead(A0) ;
if ( sensor ...
Det er god stil den var indenfor før, men nu jeg kender dig lidt mere anbefaler jeg det andet så det er mindre sandsynlighed for bøvl når du skal gøre det "4 gange". (Og det med arrays for at kun skrive det en gang tager vi en anden dag. Det er helt OK i dette program at skrive den del af koden næsten ens de 4 gange.)

Hihi, ja en ting af gangen, ellers bliver jeg ski helt forvirret

Resten er smag og behag:  (og der er god stil og dårlig stil, men jeg vil ikke skrive en bog her ;) )
Det ville da ellers være dejligt med en bog på Dansk til arduino  :)

Det program vil så både klappre med relæet og skrive på Serial monitoren - hvis det er det du vil.
Jeps, det er derhen ad, for det ville være fedt hvis man kunne få en tid og dato for hvornår relæerne tænder

Linjen const int D4 = 4 ; er lidt overflødigt da "D4" åbnelys er pin 4. Du kan give det et bedre navn som "Pumpe1" eller Faerskvandpumpe; altså const int Faerskvandpumpe = 4 ;. Så er det i koden indysende at digitalWrite(Faerskvandpumpe,HIGH) ; vil tænde den.

Du kan også omdøbe A0 på lignende måde : const int Bundkar = A0 ;  fordelen er at hvis du ænder dine ledninger, så behover du bare rette et sted

Fortsat god held med projektet
Jo rigtig mange tak, og håber du gider hjælpe mig lidt endnu  :)


Igen rigtig mange tak.

Hvad siger du så til denne her, Er det sådan ca det skal se ud???

Code: [Select]
const int magnetventil1 = 4 ;
const int magnetventil2 = 5 ;
const int magnetventil3 = 6 ;
const int magnetventil4 = 7 ;

const int sensor1 = analogRead(A0) ;
const int sensor2 = analogRead(A1) ;
const int sensor3 = analogRead(A2) ;
const int sensor4 = analogRead(A4) ;

void setup() {
 pinMode(magnetventil1, OUTPUT) ;
 pinMode(magnetventil2, OUTPUT) ;
 pinMode(magnetventil3, OUTPUT) ;
 pinMode(magnetventil4, OUTPUT) ;

 Serial.begin(9600);
}

void loop() {

 if ( sensor1 < 300 ) digitalWrite(magnetventil1, HIGH) ;
 if ( sensor1 > 400 ) digitalWrite(magnetventil1, LOW) ;

 if ( sensor2 < 300 ) digitalWrite(magnetventil2, HIGH) ;
 if ( sensor2 > 400 ) digitalWrite(magnetventil2, LOW) ;

 if ( sensor3 < 300 ) digitalWrite(magnetventil3, HIGH) ;
 if ( sensor3 > 400 ) digitalWrite(magnetventil3, LOW) ;

 if ( sensor4 < 300 ) digitalWrite(magnetventil4, HIGH) ;
 if ( sensor4 > 400 ) digitalWrite(magnetventil4, LOW) ;

 Serial.println(sensor1) ;  //Og så videre med sensor2, 3 & 4
 delay(2000);
}


PS. Jeg har lidt problemer med arduino program uploader, så vil lige høre om hvilke program man stiller den til under værktøj / programmer (AVR ISP - USBasp) eller nogle af de andre, da jeg mistænker det er der den er gal.
For når jeg bruger codebender.cc er der ingen problemer.

Mvh Johnny

3dprinter

Nej du har misforstået variabler.

Code: [Select]
const int navn = værdi ;giver os et erstatnings navn for værdien. Den vil ikke ændre sig. nogen sinde. (ikke før du retter i programmet og uploader det igen)

Code: [Select]
int navn ;giver en æske med navn, hvori programmet kan placere alle mulige tal, det er et dynamisk indhold. Når programmet starter indholder det 0 (nul).

Code: [Select]
int navn = værdi ; gør det samme (dyanmisk) her er bare den første værdi ikke 0 (nul).

Det er de basale ting med variabler. Udover det, kan de være forskellige størrelser (byte, char, int, unsigned int, long ...). Og de kan have forskellig "scope".  Hvis du laver en declaration udenfor setup(), loop() eller anden function så er de globale og alle steder i programet kan du skrive/læse dem. Er de indenfor { } så kan de kun læse/skrives af den del af programmet der indenfor samme { }. Det kaldes local scope.

I dit program har du kun indlæst målværdien af sensoren lige før det hele begynder. Du skal altså opdatere sensorX værdien med en ny analogRead() inde i loop().

Prøv igen. Det er formålet med denne hobby.  8)


NB: Du behover ikke "quote" forrige mail for at svare den. Folk bruger "quote" hvis deres svar er flere posts for sen i forhold til det de svarer på. Når i er så få her på "scandinavian" er det ikke et problem :)

Go Up