conflict in code?

Arduino specifieke Software
Berichten: 9
Geregistreerd: 16 Jun 2017, 15:03

conflict in code?

Berichtdoor chrisvoorma » 16 Jun 2017, 15:29

goedendag allemaal,

ik zit met een vreemd probleem...

ik heb een arduino uno met daaraan: adafruit lcd 16x2, adafruit rtc (DS3231) en een moisture sensor.

tis de bedoeling dat er straks een relay geschakelt wordt die mijn waterpomp voorziet van electra.
Maar nu het probleem, de scetch loopt de ene keer wel en de andere keer weer niet, of er draaien een paar loops en blijft dan weer met verschillende tussenposen "hangen" , dan weer een loopje, dan zomaar weer geen data van de RTC, dan zomaar weer geen beeld op de LCD. (Nu ik deze text schrijf zie ik opeens vanuit mijn ooghoek dat alles zomaar weer begint te lopen :( )

Dus maw alles is goed verbonden en de code zal ongeveer wel goed zijn, en toch vermoed ik dat er een conflict in zit, die ik dus echt niet kan vinden.
mijn kennis van Arduino en de bijbehorende taal was tot een paar week geleden zeg maar ongeveer 0 , de code die ik nu heb komt vooral van speuren in fora en de grote vriend google.

Code: Alles selecteren

#include <RTClib.h>
#include <Wire.h>
#include <LiquidCrystal.h>

RTC_DS3231 rtc;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

const int led1 = 13;
const int relais = 12;
const int probe = 11;
const int moistureSensor = A0;   
const int klok = 10; //powering rtc, is alleen om zeker te zijn dat ik een goede stroomverbinding heb ipv via breadboard
int scl = A5;
int sda = A4;
int sensorValue = 0;
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

unsigned long previousMillis = 0;
const long interval = 1000;


void setup()
{

  lcd.begin(16, 2);
  rtc.begin();

  //Serial.begin(9600);
  //delay(1000); // wait for console opening



  //if (! rtc.begin()); {
  //Serial.println("Cant't find RTC");
  //lcd.print("Can't find RTC");
  //while (1);}


  //if (rtc.lostPower()) {
  //Serial.println("lost power,set");
  //lcd.print("lost power,set");
  // following line sets the RTC to the date & time this sketch was compiled
  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));}


  // setting the pins to outputs
  pinMode(led1, OUTPUT);
  pinMode(relais, OUTPUT);
  pinMode(probe, OUTPUT);
  pinMode(scl, INPUT);
  pinMode(sda, INPUT);
  pinMode(klok, OUTPUT);

  //get and display startup reading before main loop to the serial monitor
  // digitalWrite(probe, HIGH);
  //delay(100);
  int sensorValue = analogRead(moistureSensor);
  //Serial.println(analogRead(moistureSensor));
  //digitalWrite(probe, LOW);
  // digitalWrite(relais, LOW);
  digitalWrite(klok, HIGH);
}

void loop()

{

  DateTime now = rtc.now();

  {

    lcd.setCursor(0, 0);

    if (now.hour() < 10)
      lcd.print('0');
    lcd.print(now.hour(), DEC);
    lcd.print(':');
    if (now.minute() < 10)
      lcd.print('0');
    lcd.print(now.minute(), DEC);
    lcd.print(':');
    if (now.second() < 10)
      lcd.print('0');
    lcd.print(now.second(), DEC);
    lcd.print("                ");
  }
  //Serial.print(now.hour(), DEC);
  // Serial.print(':');
  //Serial.print(now.minute(), DEC);
  //Serial.print(':');
  //Serial.print(now.second(), DEC);
  //Serial.println();

  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval)

  {
    previousMillis = currentMillis;



    digitalWrite(probe, HIGH);
    delay(200); //super small delay may need to be higher depending on your arduino or launchpad board you are using, some take 200 miliseconds to get accurate analog reading

    int percent = map(analogRead(A0), 1023.00, 196.00, 0.00, 100.);

    // print out the value you read:
    Serial.print(percent);
    Serial.print("% = ");
    Serial.println(analogRead(A0));
    lcd.setCursor(0, 1);
    lcd.print(percent);
    lcd.print("% = ");
    lcd.print(analogRead(A0));
    //lcd.println();


    if (now.hour() >= 11 && now.hour() <= 23)


      //may have to adjust ranges depending on a few factors
      if (analogRead(0) > 701 && analogRead(0) < 1023)
      {
        digitalWrite(13, HIGH);
      }

    if (analogRead(0) > 601 && analogRead(0) < 700)
    {
      digitalWrite(13, HIGH);
    }

    if (analogRead(0) > 350 && analogRead(0) < 600)
    {
      digitalWrite(13, LOW);
    }

    if (analogRead(0) > 201 && analogRead(0) < 349)
    {
      digitalWrite(13, LOW);
    }

    if (analogRead(0) < 200)
    {
      digitalWrite(13, LOW);
    }

    // Power-down the probe
    digitalWrite(probe, LOW);

  }
}




wie o wie kan er hulp bieden? alvast bedankt mvg chris

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: conflict in code?

Berichtdoor Koepel » 16 Jun 2017, 16:12

Het is waarschijnlijk een combinatie van tussen de 5 en 10 verschillende dingen.

Begin eerst eens met de sketch.

De variabelen 'scl' en 'sda' en het zetten van de pinMode daarvan is overbodig. Die kun je weghalen.

Je accolades (gekrulde haakjes) kloppen niet. Kun je dat opnieuw bekijken, en het inspringen en accolades goed zetten ?

Na "DateTime now = rtc.now();" staan er overbodige haakjes.

Kijk hier eens naar:
Code: Alles selecteren
if (now.hour() >= 11 && now.hour() <= 23)
      //may have to adjust ranges depending on a few factors
      if (analogRead(0) > 701 && analogRead(0) < 1023)
      {
        digitalWrite(13, HIGH);
      }

    if (analogRead(0) > 601 && analogRead(0) < 700)
    {
      digitalWrite(13, HIGH);
    }

De test voor tussen 701 en 1023 staat binnen de now.hour tussen 11 en 23. Alles wat erna komt staat er weer buiten.

Gebruik één analogRead() en stop dat in een integer, en doe daar alle if-statements mee.

Je zet de 'probe' hoog en laag. Is dat om op een logic analyzer of oscilloscope te kijken wat er gebeurt ? Een andere logische verklaring kan ik niet in de sketch zien.

Kun je de Serial.begin() en alle Serial.print() weer terug zetten. Die heb je hard nodig om te zien wat er gebeurt.
Kun je aan het begin van setup() er tekst uitgooien, dan weet je of je sketch aan het resetten is.
Code: Alles selecteren
void setup()
{
  ...
  Serial.begin(9600);
  Serial.println("De sketch is gestart");
  ...
}


Het heeft mijn voorkeur dat is nagedacht over: iedere spatie, al het inspringen, en iedere nieuwe regel. Wanneer je dat consequent doet, dan zie je veel beter de structuur van je eigen code.

Dan de hardware.
Kun je met een multimeter de 5V van het display meten ? Een LCD display heeft 5V nodig, en 4.5V is eigenlijk al te weinig.

Ik vermoed dat je breadboard slechte verbindingen heeft.
Gebruik niet dezelfde GND draden voor sensoren en voor de relais. Doe zulke dingen ook niet op hetzelfde breadboard.

Gebruik je 5V relais ? En gebruik je daarvoor de 5V pin van de Arduino ? Kan die voldoende stroom leveren ?

Hier laat ik het even bij.
Ik denk dat ik de helft van de problemen heb benoemd. Het is nu belangrijk om stapje-voor-stapje vooruit te komen. Probeer niet meteen het eindresultaat werkend te krijgen, maar zorg dat elk deel goed werkt.

Berichten: 9
Geregistreerd: 16 Jun 2017, 15:03

Re: conflict in code?

Berichtdoor chrisvoorma » 17 Jun 2017, 00:37

heel erg bedankt voor je snelle reactie.
Ben er direct weer mee bezig gegaan. het vreemde is dus dat sinds de scetch vanochtend opeens begon te lopen hij tot nu toe nog steeds netjes zn loop draait, print ook netjes alles op LCD. ook na herhaaldelijk nieuwe code uploaden.
Zal dus wel een brakke verbinding op het breadboard zijn.
Wat betreft je opmerking tav
Code: Alles selecteren
if (now.hour() >= 11 && now.hour() <= 23)
      //may have to adjust ranges depending on a few factors
      if (analogRead(0) > 701 && analogRead(0) < 1023)
      {
        digitalWrite(13, HIGH);
      }

    if (analogRead(0) > 601 && analogRead(0) < 700)
    {
      digitalWrite(13, HIGH);
    }


klopt helmaal wat je daarover zegt, zojuist getest en idd alleend de eerste regel wordt tussen de gestelde tijden uitgevoerd, de rest draait gewoon lekker door.

Ondertussen ben ik mij wat aan het verdiepen in de oplossing die jij hebt aangedragen om analogRead in een integer te stoppen en daar de if-statements mee draaien. (Iets met bomen en bos)
Hieronder de code nogmaals met verduidelijking en eerste verbeteringen.


Code: Alles selecteren
#include <RTClib.h>
#include <Wire.h>
#include <LiquidCrystal.h>

RTC_DS3231 rtc;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
const int led1 = 13; //controle led, op afstand zien of relais aan of uit staat
const int relais = 12; //relais
const int probe = 11; //voeding vochtsensor
const int moistureSensor = A0; //data vochtsensor
const int klok = 10; //powering rtc //ivm waarschijnlijk slechte breadboard
const int scl = A5; //serialclock RTC
const int sda = A4; //serial data RTC
int sensorValue = 0;
int sensorMin = 1023;
int sensorMax = 0;
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //aansluitingen LCD
unsigned long previousMillis = 0;
const long interval = 5000; //wordt als de sketch werkt 900000

void setup()
{
  lcd.begin(16, 2);
  rtc.begin();

  Serial.begin(9600);
  delay(1000); // korte pauze opstarten arduino uno V3
  Serial.println("scetch is begonnen");

  //if (! rtc.begin()); {                   //als ik de volgende 10 regels uncomment dan weet ik zeker dat er helemaal niks begint te lopen, maar dat is voor latere zorg (klok loopt nu op juiste tijd)
  //Serial.println("Cant't find RTC");
  //lcd.print("Can't find RTC");
  //while (1);}

  //if (rtc.lostPower()) {
  //Serial.println("lost power,set");
  //lcd.print("lost power,set");
  // following line sets the RTC to the date & time this sketch was compiled
  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));}

  // setting the pins to outputs
  pinMode(led1, OUTPUT);
  pinMode(relais, OUTPUT);
  pinMode(probe, OUTPUT);
  pinMode(klok, OUTPUT);

  //startup meting naar serial monitor
  digitalWrite(probe, HIGH); // voeding vochtsensor aan
  delay(100); //korte vertraging voor nauwkeurige meting vochtsensor
int sensorValue = analogRead(moistureSensor);
  Serial.println(analogRead(moistureSensor));
  digitalWrite(probe, LOW); //voeding vochtsensor uit
  digitalWrite(klok, HIGH); //voeding RTC aan ivm slechte contacten breadboard
}
void loop()
{
  DateTime now = rtc.now();
  // display tijd op LCD
  lcd.setCursor(0, 0);

if (now.hour() < 10)
  lcd.print('0');
  lcd.print(now.hour(), DEC);
  lcd.print(':');
if (now.minute() < 10)
  lcd.print('0');
  lcd.print(now.minute(), DEC);
  lcd.print(':');
if (now.second() < 10)
  lcd.print('0');
  lcd.print(now.second(), DEC);
  lcd.print("                ");
  // weergave tijd naar serial monitor
if (now.hour() < 10)
   Serial.print('0');
  Serial.print(now.hour(), DEC);
  Serial.print(':');
if (now.minute() < 10)
  Serial.print('0');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
if (now.second() < 10)
  Serial.print('0');
  Serial.print(now.second(), DEC);
  Serial.println();


  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval)


  { previousMillis = currentMillis;  //zodra ik deze accolade verwijder werken de millis niet meer en blijft de probe constant metingen verrichten



    digitalWrite(probe, HIGH); //het aan uitzetten van de probe voorkomt dat er een constante spanning op staat, waardoor dus zo weinig mogelijk chemische (electrolyse) reacties plaatsvinden en de probe (staat in vochtige grond) erg snel vergaat
    delay(200); //zeer kleine pauze om een accurate lezing van de vochtsensor te krijgen, zonder vertraging erg onnauwkeurig

int percent = map(analogRead(A0), 1023.00, 196.00, 0.00, 100.); //omzetten waarde vochtsensor naar percentage

    // print out the value you read:
    Serial.print(percent);
    Serial.print("% = ");
    Serial.println(analogRead(A0));
    lcd.setCursor(0, 1);
   if (percent < 10)
    lcd.print('0');
    lcd.print(percent, DEC);
    lcd.print("% vocht");
    lcd.println("                ");


   if (now.hour() >= 20 && (now.hour() <= 23) //tijden waartussen de relais daadwerkelijk aan gaat, nu alleen nog de controle led


      //onderstaande waardes aanpasssen naar waardes die daadwerkelijk gehaald worden door vochtsensor
   if (analogRead(0) > 701 && analogRead(0) < 1023)
      {digitalWrite(13, HIGH);}

   if (analogRead(0) > 601 && analogRead(0) < 700)
    {digitalWrite(13, HIGH);}

   if (analogRead(0) > 350 && analogRead(0) < 600)
    {digitalWrite(13, LOW);}

   if (analogRead(0) > 201 && analogRead(0) < 349)
    {digitalWrite(13, LOW);}

   if (analogRead(0) < 200)
    {digitalWrite(13, LOW);}

     // voeding vochtsensor uit
     digitalWrite(probe, LOW);

  }
}

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: conflict in code?

Berichtdoor Koepel » 17 Jun 2017, 00:53

Sorry, misschien had ik duidelijker moeten zijn, er stonden maar twee accolades teveel in, terwijl dat niet eens echt fout was.
Kun je nog eens door heel je sketch lopen. Voeg accolades toe waar ze horen, en zet iedere spatie en ieder inspringen goed.

Een functie heeft '{' en '}' om de code aan te geven waar de functie uit bestaat. De functie-body.

In gewone code wordt '{' en '}' gebruikt om meerder statements te combineren tot één geheel. Je had er eerst twee teveel staan, dat staat slordig, maar het mag dus wel.

Dus stel, je hebt dit if-statement:
Code: Alles selecteren
if( zon == fel)
  eet_ijstje = 1;

Dat mag zonder '{' en '}' omdat het maar één statement is. De if-statement verwacht na de conditie slechts één ding (één blok code tussen '{' en '}' of één statement).

Stel dat je nog meer wilt doen. Dan gebruik je '{' en '}' zodat na de if conditie er één ding staat, ook al is dat ene ding een heel blok code tussen '{' en '}'.

Code: Alles selecteren
if( zon == fel)
{                          // groepeer meerdere statements
  eet_ijstje = 1;
  antizonnebrandcremefactor = 30;
}

Dus bij millis() is er een groot blok code dat bij elkaar hoort onder de if-statement.

De schrijfwijze maakt het moeilijk of makkelijk om code te lezen.
Kijk nu eens naar je eigen code:
Code: Alles selecteren
if (now.hour() < 10)
  lcd.print('0');
  lcd.print(now.hour(), DEC);
  lcd.print(':');

Achter de if conditie staat alleen maar lcd.print('0'); en de rest valt er buiten. Als je dat goed schrijft, met inspringen en alles, dan zie je in één oogopslag wat de bedoeling is. Hieronder drie variaties.
Code: Alles selecteren
  if (now.hour() < 10)
    lcd.print('0');
  lcd.print(now.hour(), DEC);
  lcd.print(':');

Code: Alles selecteren
  if (now.hour() < 10)
  {
    lcd.print('0');
  }
  lcd.print(now.hour(), DEC);
  lcd.print(':');

Code: Alles selecteren
  if (now.hour() < 10)
    lcd.print('0');         // print leading zero if only one digit
  lcd.print(now.hour(), DEC);
  lcd.print(':');



In de taal Python kun je gerust er een flinke puinhoop van maken, en wordt het inspringen op zich gebruikt om een blok code te maken, maar dit is 'c' en 'c++' dus hier alles graag netjes doen ;) Ik maak geen grap als ik graag zie dat iedere spatie op de juiste plaats staat :geek:

Berichten: 9
Geregistreerd: 16 Jun 2017, 15:03

Re: conflict in code?

Berichtdoor chrisvoorma » 17 Jun 2017, 01:25

aha ja duidelijk, precies wat de automatische opmaak dus ook doet, alleen ik vond dat er niet zo "strak" uitzien, maar ik begrijp dat dat dé manier is.
morgen maar weer even verder.

eerst weer bedankt

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: conflict in code?

Berichtdoor Koepel » 17 Jun 2017, 08:45

Heb je de verbindingen al gecontroleerd en de 5V spanning op het display al gemeten ?

Berichten: 9
Geregistreerd: 16 Jun 2017, 15:03

Re: conflict in code?

Berichtdoor chrisvoorma » 18 Jun 2017, 20:32

zojuist even gekeken naar de voltages,

uitgang arduino: 4,82
spanning LCD: 4,2

dat is zowel op usb als op externe voeding

maar daar draait die prima op,

sketch heeft tot nu toe prima gedraait, helaas heb ik nu dus ergens tegen aan gestoten en doet het scherm weer raar. kortom, de verbindingen controleren en/of rechtstreeks verbinden zonder breadboard.

wat mij nu wel opviel is dat de if statements onder die waar de tijd ingesteld is zich allemaal netjes houden aan de ingestelde tijden, kan dat kloppen?
dus als ik de vochtsensor buiten de gestelde tijden droog maak gebeurt er niks, als ik dan de tijd verander naar rtc.now springt de controle led aan (dus de relais gaat open)

hoe ik de analogread in een integer moet stoppen ben ik nog niet achter, dus eenn kleine tip of voorbeeld zou handig zijn.

mvg chris


sketch tot nu toe


Code: Alles selecteren

#include <RTClib.h>
#include <Wire.h>
#include <LiquidCrystal.h>

RTC_DS3231 rtc;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
const int led1 = 13; //controle led, op afstand zien of relais aan of uit staat
const int relais = 12; //relais
const int probe = 11; //voeding vochtsensor
const int moistureSensor = A0; //data vochtsensor
const int klok = 10; //powering rtc //ivm waarschijnlijk slechte breadboard
const int scl = A5; //serialclock RTC
const int sda = A4; //serial data RTC
int sensorValue = 0;
int sensorMin = 1023;
int sensorMax = 0;
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //aansluitingen LCD
unsigned long previousMillis = 0;
const long interval = 5000; //wordt als de sketch werkt 900000

void setup()
{
  lcd.begin(16, 2);
  rtc.begin();

  Serial.begin(9600);
  delay(1000); // korte pauze opstarten arduino uno V3
  Serial.println("scetch is begonnen");

  //if (! rtc.begin()); {                   //als ik de volgende 10 regels uncomment dan weet ik zeker dat er helemaal niks begint te lopen, maar dat is voor latere zorg (klok loopt nu op juiste tijd)
  //Serial.println("Cant't find RTC");
  //lcd.print("Can't find RTC");
  //while (1);}

  //if (rtc.lostPower()) {
  //Serial.println("lost power,set");
  //lcd.print("lost power,set");
  // following line sets the RTC to the date & time this sketch was compiled
  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));}

  // setting the pins to outputs
  pinMode(led1, OUTPUT);
  pinMode(relais, OUTPUT);
  pinMode(probe, OUTPUT);
  pinMode(klok, OUTPUT);

  //startup meting naar serial monitor
  digitalWrite(probe, HIGH); // voeding vochtsensor aan
  delay(100); //korte vertraging voor nauwkeurige meting vochtsensor
  int sensorValue = analogRead(moistureSensor);
  Serial.println(analogRead(moistureSensor));
  digitalWrite(probe, LOW); //voeding vochtsensor uit
  digitalWrite(klok, HIGH); //voeding RTC aan ivm slechte contacten breadboard
}
void loop()
{
  DateTime now = rtc.now();
  // display tijd op LCD
  lcd.setCursor(0, 0);

  if (now.hour() < 10)
    lcd.print('0');
  lcd.print(now.hour(), DEC);
  lcd.print(':');
  if (now.minute() < 10)
    lcd.print('0');
  lcd.print(now.minute(), DEC);
  lcd.print(':');
  if (now.second() < 10)
    lcd.print('0');
  lcd.print(now.second(), DEC);
  lcd.print("                ");
  // weergave tijd naar serial monitor
  if (now.hour() < 10)
    Serial.print('0');
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  if (now.minute() < 10)
    Serial.print('0');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  if (now.second() < 10)
    Serial.print('0');
  Serial.print(now.second(), DEC);
  Serial.println();


  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval)


  { previousMillis = currentMillis;  //zodra ik deze accolade verwijder werken de millis niet meer en blijft de probe constant metingen verrichten



    digitalWrite(probe, HIGH); //het aan uitzetten van de probe voorkomt dat er een constante spanning op staat, waardoor dus zo weinig mogelijk chemische (electrolyse) reacties plaatsvinden en de probe (staat in vochtige grond) erg snel vergaat
    delay(200); //zeer kleine pauze om een accurate lezing van de vochtsensor te krijgen, zonder vertraging erg onnauwkeurig

    int percent = map(analogRead(A0), 1023.00, 196.00, 0.00, 100.); //omzetten waarde vochtsensor naar percentage

    // print out the value you read:
    Serial.print(percent);
    Serial.print("% = ");
    Serial.println(analogRead(A0));
    lcd.setCursor(0, 1);
    if (percent < 10)
      lcd.print('0');
    lcd.print(percent, DEC);
    lcd.print("% vocht");
    lcd.println("                ");


{    if (now.hour() >= 21 && (now.hour() <= 23)) //tijden waartussen de relais daadwerkelijk aan gaat, nu alleen nog de controle led


        //onderstaande waardes aanpasssen naar waardes die daadwerkelijk gehaald worden door vochtsensor
        if (analogRead(0) > 701 && analogRead(0) < 1023)
    {
      digitalWrite(13, HIGH);
      }

    if (analogRead(0) > 601 && analogRead(0) < 700)
  {
    digitalWrite(13, HIGH);
    }

    if (analogRead(0) > 350 && analogRead(0) < 600)
  {
    digitalWrite(13, LOW);
    }

    if (analogRead(0) > 201 && analogRead(0) < 349)
  {
    digitalWrite(13, LOW);
    }

    if (analogRead(0) < 200)
  {
    digitalWrite(13, LOW);
    }
}
    // voeding vochtsensor uit
    digitalWrite(probe, LOW);

}
}

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: conflict in code?

Berichtdoor Koepel » 18 Jun 2017, 21:46

Het is echt beter als iedere inspringen en iedere spatie en ieder haakje op de juiste plaats staat, dat is echt geen grap.

Zo'n goedkoop LCD display heeft meer dan 4.5V nodig. De 4.2V kan de reden zijn dat het af en toe raar doet.

Kun je een variabele maken voor analoge ingang ? Je gebruikt nu zowel 'A0' en '0', dat is een beetje verwarrend.
cpp code
const int humidtyPin = A0;


Ik was ook niet zo duidelijk :oops: Ik bedoelde om eenmalig de analoge waarde op te vragen, en die waarde overal in de if-statements te gebruiken.
Wanneer je tijdens die if-statements iedere keer een "analogRead(0)" doet, dan kan die waarde veranderen tijdens al die if-statements. Het resultaat is dan niet meer voorspelbaar.

cpp code
//
int humidity = analogRead( humidityPin); // lees de waarde van de vochtsensor.

if ( humidity > 701 && humidity < 1023)
...

if ( humidity > 601 && humidity < 700)
...


Er bestaat een 'zeef'-methode. Je kunt die if-statements korter schrijven. Wat je doet met die "now.hour()" begrijp ik niet, dus die laat ik er uit.
cpp code
//
int humidity = analogRead( humidityPin); // lees de waarde van de vochtsensor.

if( humidity > 701)
{
...
}
else if( humidity > 600)
{
...
}
else if( humidity > 350)
{
...
}
else if( humidity > 200)
{
...
}
else
{
...
}


Ik begrijp nog niet wat je wilt, dus helaas weet ik ook niet hoe het beter kan.
De haakjes en inspringen rondom de "if (now.hour() >= 21 ..." is een rommeltje. Probeer daar wat meer structuur in aan te brengen.

Je interval met millis() is goed. Dat gebeurt iedere 5 seconden.

Je kunt meerdere software timer met millis() maken.
Bijvoorbeeld 3 keer per seconde het display updaten, en 1 keer per uur de vochtigheid bepalen, en 1 keer per dag het relais bedienen.

Maar dan je vochtsensor zelf. Dat is prut :evil: Er bestaat eigenlijk maar één goede manier, en dat is capacitief zoals deze: https://www.tindie.com/products/miceuz/chirp-plant-watering-alarm/.
Ik draai zelf de spanning nog eens om en neem dan het gemiddelde. Maar dat bleek op de langere termijn (een jaar) ook niet meer betrouwbaar. En even mijn plant uit een 15 liter pot halen om een andere sensor er in te stoppen zie ik ook niet zitten :(

Er kan nog veel meer mis zijn. Breadboards maken vaak slecht contact. De stroom van het relais kan de sensor of de RTC chip beïnvloeden wanneer je de GND draden niet goed hebt. De draden van de I2C kunnen te lang zijn.

Berichten: 9
Geregistreerd: 16 Jun 2017, 15:03

Re: conflict in code?

Berichtdoor chrisvoorma » 20 Jun 2017, 13:14

allereerst natuurlijk weer bedankt voor je reactie, TOP

en dan nu even ter verduidelijking uitleg van wat ik wil aan het eind.

laten we beginnen met het uitlezen van de hoeveelheid vocht in de bodem, dat wil ik in de uiteindelijke scetch 1x per 15 minuten uitlezen en weergeven op het display, de hele dag door (vochtsensor wordt nog vervangen door een ander, misschien DIY exemplaar)
vervolgens moet er 'snachts tussen 0200 en 0600 (zijn nu andere tijden in scetch ivm uitproberen) eventueel gesproeit worden (relais, ledred) als de vochtsensor in de tussenliggende waardes zit (in principe alles boven de +/- 600, moet ik nog even precies omzetten) en de temperatuur boven een bepaald aantal graden zit (tempsensor zit nu nog helemaal niet in de scetch).
continu: Als de waarde van de vochtsensor boven de 350 (wordt nog aangepast) is moet de ledred gaan knipperen, zodat duidelijk word dat er binnenkort gesproeit gaat worden, alles onder een waarde van 350 moet de groene led gaan branden.

Dus:
als rtc.now tussen 0200 en 0600 is en humidity boven de 600; ledred en relais aan
als humidity tussen 350 en 600; redled knipperen (blink)
als humidity onder 350; ledgreen aan


Alles staat nu nog in een proefopstelling; dus korte draadjes max 10cm, relais is niet aangesloten maar vervangen door een led
Breadboard is er zo goed als tussen vandaan, alleen plus en min worden daar nog op verdeelt

scetch tot op heden:
Code: Alles selecteren

#include <LiquidCrystal.h>
#include <RTClib.h>
#include <Wire.h>


RTC_DS3231 rtc;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
const int ledred = 3; //controle led, op afstand zien of relais aan of uit staat
const int ledgreen = 4;
const int relais = 5; //relais
const int probe = 6; //voeding vochtsensor
const int humidityPin = A0; //data vochtsensor
//const int klok = 10; //powering rtc //ivm waarschijnlijk slechte breadboard
const int scl = A5; //serialclock RTC
const int sda = A4; //serial data RTC
int sensorValue = 0;
int sensorMin = 1023;
int sensorMax = 0;
int ledredstate = LOW;
unsigned long previousMillis = 0;
const long interval = 5000; //wordt als de sketch werkt 900000
const long intervalred = 250; //knippersnelheid ledred
LiquidCrystal lcd(7, 8, 9, 10, 11, 12); //aansluitingen LCD

void setup()
{
  lcd.begin(16, 2);
  rtc.begin();

  Serial.begin(9600);
  delay(1000); // korte pauze opstarten arduino uno V3
  Serial.println("scetch is begonnen");

  //if (! rtc.begin()); {                   //als ik de volgende 10 regels uncomment dan weet ik zeker dat er helemaal niks begint te lopen, maar dat is voor latere zorg (klok loopt nu op juiste tijd)
  //Serial.println("Cant't find RTC");
  //lcd.print("Can't find RTC");
  //while (1);}

  //if (rtc.lostPower()) {
  //Serial.println("lost power,set");
  //lcd.print("lost power,set");
  // following line sets the RTC to the date & time this sketch was compiled
  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));}

  // setting the pins to outputs

  pinMode(ledred, OUTPUT);
  pinMode(ledgreen, OUTPUT);
  pinMode(relais, OUTPUT);
  pinMode(probe, OUTPUT);
  //  pinMode(klok, OUTPUT);

  //startup meting naar serial monitor
  digitalWrite(probe, HIGH); // voeding vochtsensor aan
  delay(100); //korte vertraging voor nauwkeurige meting vochtsensor
  int sensorValue = analogRead(humidityPin);
  Serial.println(analogRead(humidityPin));
  digitalWrite(probe, LOW); //voeding vochtsensor uit
  //  digitalWrite(klok, HIGH); //voeding RTC aan ivm slechte contacten breadboard
}
void loop()
{
 
  DateTime now = rtc.now();
  // display tijd op LCD
  lcd.setCursor(0, 0);

  if (now.hour() < 10)
    lcd.print('0');
  lcd.print(now.hour(), DEC);
  lcd.print(':');
  if (now.minute() < 10)
    lcd.print('0');
  lcd.print(now.minute(), DEC);
  lcd.print(':');
  if (now.second() < 10)
    lcd.print('0');
  lcd.print(now.second(), DEC);
  lcd.print("                ");
  // weergave tijd naar serial monitor
  //if (now.hour() < 10)
  //Serial.print('0');
  //Serial.print(now.hour(), DEC);
  //Serial.print(':');
  //if (now.minute() < 10)
  //Serial.print('0');
  //Serial.print(now.minute(), DEC);
  //Serial.print(':');
  //if (now.second() < 10)
  //Serial.print('0');
  //Serial.print(now.second(), DEC);
  //Serial.println();


  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval)


  { previousMillis = currentMillis;  //zodra ik deze accolade verwijder werken de millis niet meer en blijft de probe constant metingen verrichten



    digitalWrite(probe, HIGH); //het aan uitzetten van de probe voorkomt dat er een constante spanning op staat, waardoor dus zo weinig mogelijk chemische (electrolyse) reacties plaatsvinden en de probe (staat in vochtige grond) erg snel vergaat
    delay(200); //zeer kleine pauze om een accurate lezing van de vochtsensor te krijgen, zonder vertraging erg onnauwkeurig

    int percent = map(analogRead(A0), 1023.00, 196.00, 0.00, 100.); //omzetten waarde vochtsensor naar percentage

    // print out the value you read:
    Serial.print(percent);
    Serial.print("% = ");
    Serial.println(analogRead(A0));
    lcd.setCursor(0, 1);
    if (percent < 10)
      lcd.print('0');
    lcd.print(percent, DEC);
    lcd.print("% vocht");
    lcd.println("                ");

    {

      int humidity = analogRead(humidityPin);   // lees de waarde van de vochtsensor.

      { if (now.hour() >= 11 && (now.hour() <= 23)) //tijden waartussen de relais daadwerkelijk aan moet gaan

          if ( humidity >= 600)
          {
            digitalWrite(ledred, HIGH);
            digitalWrite(relais, HIGH);
          }
          else (humidity < 600);
        {
          //digitalWrite(ledred, LOW);
          digitalWrite(relais, LOW);
        }
      }
{
      if ( humidity > 350 && humidity < 600)
      {
        unsigned long currentMillis = millis();

        if (currentMillis - previousMillis > intervalred) {
          // save the last time you blinked the LED
          previousMillis = currentMillis;

          // if the LED is off turn it on and vice-versa:
          if (ledredstate == LOW)
            ledredstate = HIGH;
          else
            ledredstate = LOW;

          // set the LED with the ledState of the variable:
          digitalWrite(ledred, ledredstate);
        }
      }
      else (humidity <= 350);
      {
        digitalWrite(ledred, LOW);
        digitalWrite(ledgreen, HIGH);
      }
}
      // voeding vochtsensor uit
      digitalWrite(probe, LOW);
    }
  }
}




Enig idee waarom mijn ledbuiltin nu constant brand oftwel pin 13 = HIGH?

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: conflict in code?

Berichtdoor Koepel » 20 Jun 2017, 16:50

Volgens mij gebruik je pin 13 niet meer, dat was in de vorige sketch. Dus ik heb geen idee :?

Het lijkt wel alsof je er op achteruit gaat :(

Ik maak dus echt geen grap als ik vraag om iedere spatie, ieder inspringen, iedere komma, ieder haakje goed te zetten.
Wanneer dat een rommeltje is, dan kun je niet zien wat de sketch doet.

Een ander belangrijk punt is een juiste beschrijving.
Wat wil je doen als het geen tijd is om te sproeien, maar als de grond wel te droog is ?
Wil je dan de rode led continu aan zetten ?

Je if-else statements kloppen niet. Zou je dat zelf willen bekijken hoe dat in de 'c'-taal gaat ?

Je kunt 'previousMillis' maar voor één software timer gebruiken. Dus voor de led te laten knipperen heb je een tweede nodig. Je zou ze "previousMillisSample" en "previousMillisBlink" kunnen noemen.

Het is mogelijk om eenmalig in de loop() de waarde van de humidity sensor op te vragen.
Dan kan daarna meteen de sensor uitgezet worden.
Vervolgens dus overal in de loop() die integer 'humidity' gebruiken.

Ik wil je zover krijgen, dat je de code netjes opschrijft. Dus ik ga niet iets maken, dat je met plakken en kopiëren kunt overnemen, om er vervolgens weer een rommeltje van te maken :o

Wanneer ik je sketch netjes maakt, dan staat het resultaat hieronder.
Dat is geen werkende sketch, dat is op dit moment nog niet van belang.

Helaas heeft tinypic het plaatje verkleint, dus je ziet niet de originele grootte: http://nl.tinypic.com/r/2zfsuag/9
Afbeelding

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: esogolem, ulemeweja en 19 gasten