Hjælp til water level sensor code

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 :slight_smile:

Mvh Johnny

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

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

  pinMode(D4,OUTPUT) ;

og i loop Serial.print med

  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...

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. :frowning:

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 :slight_smile: 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 :slight_smile:

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

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)

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.

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

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

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)

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 :slight_smile: da jeg åbenbart er total code-blind :slight_smile:
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 :stuck_out_tongue:

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

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

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

Mvh Johnny

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)

Msquare:
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 :slight_smile:

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.

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

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

Har du et link til dine sensorer ?

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 ?

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 :slight_smile: :slight_smile: 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:

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 ?

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 :slight_smile: :slight_smile: 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

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

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 :wink: )

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

Msquare:
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

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???

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

Nej du har misforstået variabler.

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)

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).

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 :slight_smile:

Hej Igen Msquare

Ja hele problemet er at jeg ikke kan forstå, og få det code halløj banket ind, selvom jeg har læst, læst & læst...... (har bogen Getting started with arduino), set diverse video'er på youtube mm, og jeg har da også været ved at gi op en hulens masse gange, men som jeg læste, (Arduino Is Not For Quitters), og så har jeg jo også brugt en del penge på dele mm, så jeg må kæmpe videre med at prøve at forstå det (håber det kommer en dag), men det skal så også siges at jeg har ADD og vi gir ski'ikke så nemt op :stuck_out_tongue:

Så jeg prøver da lige igen :slight_smile:

Men du har da været en rigtig stor hjælp indtil videre, og jeg har da også forstået lidt/noget af det :stuck_out_tongue: så tak for det.

PS. Jeg skal nok lade være med at Quote det fremover, hihi :slight_smile:

Mvh Johnny

Det skal du ikke tage så tungt. Nogle finder det sværere end andre, men sådan er det jo med så meget. Jeg har svært at forstå pensionsordninger. Jeg går kold efter 2 minutters studie af "afkastningsgrad".

Nu skriver jeg dit program - ikke noget jeg normalt gør, men nogle gange er det vejen frem for nogle. Så må du tilrette pin nummre og grænseværdier og den slags.

Du skal nok udkommentere RTC, DS1307 delen indtil du får styr på den. Indstille tid på den er en once-in-a-lifetime sag, så skriv et lille seperat program for det.

/*--------------------------------------------------*\
| PumpIt                                             |
| Overvåg vand niveau og tænd tilsvarende ventiler   |
*\--------------------------------------------------*/

#include <Wire.h>     // Tilføj I2C bibliotek
#include <DS1307.h>   // tilføj RTC kode. Denne inklude definerer også RTC variablen

/* =====  Pin defenitioner  ==== */
const int VenstreTankNiveau = A0 ;
const int MellemTankNiveau = A1 ; 
const int Tredje = A4 ;
const int Reserve = A5 ;
// NB: A2, A3 bruges af SDA/SCL, må ikke bruges til sensorer

const int VenstreVentil = 4 ;
const int MellemVentil = 5 ;
const int TredjeVentil = 6 ;
const int ReserveVentil = 7 ;

/* ==== Globale Variabler === */

int Sensor ;  // unødvendigt den er global, men pyt.

// extern DS1307new RTC; // (udført i DS1307.h) 

/*---------*\
|   Setup   |
\*---------*/

void setup() {
  // --- RealTimeClock
  //RTC.startClock();           should be on already
  RTC.ctrl = 0x00; RTC.setCTRL();  // Disable the SqW pulse

  // Output pins
  pinMode(VenstreVentil, OUTPUT) ;
  pinMode(MellemVentil, OUTPUT) ;
  pinMode(TredjeVentil, OUTPUT) ;
  pinMode(ReserveVentil, OUTPUT) ;

  // --- Serial line 
  Serial.begin(9600) ;
  Serial.println("Pumpit, version 1.0") ;
 
}


/*---------*\
|   Loop    |
\*---------*/
void loop() {
  Sensor = analogRead(VenstreTankNiveau) ;
  if ( Sensor < 300 ) digitalWrite(VenstreVentil, HIGH) ; // Tænd når under "lav" niveau
  if ( Sensor > 400 ) digitalWrite(VenstreVentil, LOW) ;  // Sluk hvis over "høj" niveau
  Serial.print("Venstre:");Serial.print(Sensor) ;

  Sensor = analogRead(MellemVentil) ;
  if ( Sensor < 323 ) digitalWrite(MellemVentil, HIGH) ; // Tænd når under "lav" niveau
  if ( Sensor > 388 ) digitalWrite(MellemVentil, LOW) ;  // Sluk hvis over "høj" niveau
  Serial.print(" Mellem:");Serial.print(Sensor) ;

  Sensor = analogRead(TredjeVentil) ;
  if ( Sensor < 77  ) digitalWrite(TredjeVentil, HIGH) ; // Tænd når under "lav" niveau
  if ( Sensor > 520 ) digitalWrite(TredjeVentil, LOW) ;  // Sluk hvis over "høj" niveau
  Serial.print(" Tredje:");Serial.print(Sensor) ;

//  Sensor = analogRead(VReserveVentil) ;
//  if ( Sensor < 300 ) digitalWrite(ReserveVentil, HIGH) ; // Tænd når under "lav" niveau
//  if ( Sensor > 400 ) digitalWrite(ReserveVentil, LOW) ;  // Sluk hvis over "høj" niveau
//  Serial.print("Reserve:");Serial.println(Sensor) ;

  Serial.println() ;
  delay(2000) ;   // Stå stille, gør intet, mens 2 sekunder går sin vej.
}

Ingen garantier, jeg er også almindelig dødelig og laver fejl, jeg har kun testet at det kompilerer.

Hej Msquare

Jeg prøver også på ikke at ta det så tungt, men det er da meget irriteret at det bare ikke vil hænge fast og du har helt ret, for der er altid noget man bare ikke kan lære, og det er jo forskelligt fra person til person.

Men jeg kan ikke takke dig nok for at du gider at ta dig tid til at hjælpe mig, og lave programmet til mig, og kan sagtens forstå det ikke er noget du normalt gør, for så kunne du jo sikkert ikke lave andet, her på forumet :slight_smile: så kæmpe stort tak for det, så har jeg noget jeg kan prøve at lære noget af, nu når jeg har set hvordan det skal stilles op :slight_smile: for jeg har en masse gode ide'er til udvidelser af programmet og fremtidige projekter, så er det så bare om jeg kan få dem ført ud i livet :slight_smile: :slight_smile:

Og selvfølgelig er der ingen garantier, for du har jo ingen muligheder for at afprøve om det virker i virkeligheden, men hvis det ikke virker, så ved jeg jo hvem jeg skal skrive til, hihi :slight_smile:

Mvh Johnny