Go Down

Topic: verlichting volière (Read 2365 times) previous topic - next topic

jmnijsse

Hoi,

Ik ben bezig een voliere verlichting te maken die ik zowel met bluetooth als handmatig wil kunnen aansturen.
Nu heb ik onderstaande code. Twee vragen:

- manual1 doet het prima, in- en uitdimmen.
- manual2 springt alleen aan, maar wil daarna niet meer uit (ja, via manual1 weer eerst aan en dan uit).
Terwijl manual2 toch op dezelfde manier gecodeerd is, dacht ik.

En hoe (waar) moet ik de optie bluetooth toevoegen?
Het is of met de schakelaar, of met bluetooth.

Verder staat er nog wat overtollig spul in, maar dat moet er nog uit.

Graag een reactie.
Alvast bedankt.
Code: [Select]

int ledPin = 3;
int state = 0;
int flag = 0;
int manual1 = 7;
int manual1_state;
int last_manual1_state = 0;
int manual2 = 8;
int manual2_state;
int last_manual2_state = 0;
int keuze;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(manual1, INPUT);
  pinMode(manual2, INPUT);
  digitalWrite(ledPin, LOW);

  Serial.begin(9600); // Default connection rate for my BT module
}

void loop() {

  manual1_state = digitalRead(manual1);
  manual2_state = digitalRead(manual2);

  if (manual1_state != last_manual1_state) {
    if (manual1_state == HIGH) {
      dimIn();
    }
    else {
      dimOut();
    }
    delay(10);

  }
  last_manual1_state = manual1_state;

  if (manual2_state != last_manual2_state) {
    if (manual2_state == HIGH) {
      lightOn();
    }
    else {
      lightOff;
    }
    delay(10);
  }
  last_manual2_state = manual2_state;

}

void bluetooth() {

  if (Serial.available() > 0) {
    keuze = Serial.read();
  }
}

void dimIn() {

  for (int x = 0; x < 255; x++) {
    analogWrite(ledPin, x);
    Serial.println(x);
    delay(30);
  }
  digitalWrite(ledPin, HIGH);
}

void dimOut() {

  for (int y = 255; y > 1; y--) {
    analogWrite (ledPin, y);
    Serial.println(y);
    delay(30);
  }
  digitalWrite(ledPin, LOW);
}

void lightOn() {
  digitalWrite(ledPin, HIGH);
}

void lightOff() {
  digitalWrite(ledPin, LOW);
}




jmnijsse

En hij blijft op een of andere manier heel zwak branden, als hij eigenlijk uit zou moeten staan (met beide schakelaars uit).


MAS3

Hoi.

Het overtollige spul kun je mooi als debug tool gebruiken (of deed je dat al toevallig ?).
Dus zet dat ook eens in de aan/uit afhandeling zou ik zeggen.
Verder kun je ook de verlichting altijd uitzetten, en vervolgens kijken of ie niet aan moet.
Dan is ie dus heel kort uit en wordt daarna meteen weer ingeschakeld.

Nu kijk je dus of ie aan moet, en anders zet je 'm uit (maar alleen als er een veranderde knop stand geregistreerd werd).
Dan zou je 'm dus uitzetten, maar eventueel meteen weer aanzetten in een heel korte tijd.
Das niet echt een nette oplossing, maar je kunt eens proberen of dat verschil maakt.

Als je verlichting niet helemaal uit gaat, dan is er wellicht een verbindingsprobleem.
Maar dat is een aanname, want ik heb geen idee wat en hoe je met die pin 3 hebt verbonden.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

jmnijsse

Nee, dat werkt niet, om het langs een andere kant te benaderen.
Heb Serial.prints toegevoegd op verschillende punten. O.a. in de lightOff functie. Hij komt wel in de functie, zegt mn Serial monitor, maar voert deze niet uit.

Ook de schakelaars reageren in goed volgens de Serial monitor. Alleen zit er ergens een if-je verkeerdom ofzo. We begrijpen elkaar niet in elk geval.. :smiley-confuse:

Pin 3 is aangesloten op een 30N06 mosfet, die weer 10 led-modules aanstuurt.

En de bluetooth functie is ook nog niet af, zoals je ziet.
Ik zou eigenlijk bluetooth willen laten controleren, en zo ja, er is signaal, stuur dat signaal dan terug de loop() in en reageer daar op met dimmen of in één keer aan/uit.

Bedankt voor je reactie, overigens.
Ben zelf even met herfstvakantie, maar reacties volg ik graag!

Groet,
Johan





MAS3

Dat ie in die functie lightOff terecht komt, zie je dat omdat je Serial.print ook in die functie zit, of omdat die net voor of net na het aanroepen komt ?

In het 1e geval zou het dan dus niet zijn dat de functie niet wordt uitgevoerd.
Want de Serial.print wordt uitgevoerd, en daarom met grote waarschijnlijkheid de rest in die functie ook.

Aangezien je een (logic level-) FET gebruikt, kan het zijn dat je 2 problemen eigenlijk 1 en hetzelfde probleem is.
Je vertelde namelijk ook dat de LEDs niet helemaal uit gaan.

Een FET is een zeer kleine belasting voor je uitgang, met capacitieve eigenschappen.
Je kunt daarom eens een LED met passende weerstand parallel aan de FET zetten.
Dus aansluiten op ledPin en aan GND.
Hierna kun je zien of je signaal geschakeld word, maar de FET open zou blijven staan, of niet.
Het kan ook zijn dat je door deze parallelschakeling ineens een ander (meer gewenst) gedrag gaat zien, omdat de extra belasting van die LED de werking van de FET nog wel eens zou kunnen beïnvloeden.

Uiteraard heb je bij het verbinden van de FET, de datasheet (klik !) geraadpleegd en gevolgd..
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

jmnijsse



Zo heb ik 'm aangesloten. En dan uiteraard ipv motor de ledmodules. En daar zit toch zo'n weerstand in?

Ik heb die Serial.print idd in de functie gezet, die op dat moment aangeroepen wordt, maar waar dus de eerste regel (print) wel wordt uit gevoerd, maar de tweede regel (digitalWrite(3, LOW);) niet.
Het zou kunnen dat ie wel uitgevoerd wordt, maar gelijk daarna op een of andere manier weer aan springt.

Is de if-else constructie wel goed zo?
Zou die in principe gewoon moeten werken?

J.

MAS3

Ik zou last_manual_state alleen veranderen als je geregistreerd hebt dat die state eerder anders was.
Dat betekent dus dat ik 'm voor de } zou zetten waar ie nu net na staat.

Verder zou ik eens de delays die je hebt een heel stuk groter maken.
Dan kun je zien of er werkelijk niets gebeurt, of dat er iets heel kort gebeurt.
0.01 seconde is heel weinig om te zien of een lampje brandt.
Als je er tijdelijk delay(1000) van maakt, dan kun je een stuk beter zien of wat jij vermoedt, ook is wat er gebeurt.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

jmnijsse

#7
Oct 26, 2017, 03:23 pm Last Edit: Oct 27, 2017, 08:38 am by jmnijsse
Stom.

Code: [Select]

else {
lightOff;
}


Daar horen haakjes achter.
Vreemd (of niet?) dat ie daar geen foutmelding van geeft?

Afijn, werkt nu, basic.

Nu de bluetoothfunctie nog.
Had een losse testopstelling gemaakt met alleen bluetooth, dus de module (HC-05) werkt ook.

Maar nu moet ie ingebouwd worden als een of-functie.

Code: [Select]

if (manual1_state != last_manual1_state || bluetooth()) //dus óf de schakelaar klapt om, óf bluetooth komt in actie en koppelt een signaal terug (iets van a, b, c of d)
{
    if (manual1_state == HIGH || keuze == "a")
{
      dimIn();
}


Dit klopt niet, zover ben ik wel:), maar hoe krijg ik dat voor elkaar? Hoe maak ik die bluetooth functie dusdanig dat ie een waarde teruggeeft in de if-regel?


Jantje

probeer dit eens
Code: [Select]
bluetoothsignaal == 'a'
"a" betekend string a of dus a\0 (of a en een null erachter)
'a' betekend dus character a
Do not PM me a question unless you are prepared to pay for consultancy.
Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -

jmnijsse

Ja, dat snap ik wel (tenminste, daar kom ik uiteindelijk wel uit).

Waar het me vooral om gaat is (staat verderop in de code):

Code: [Select]
void bluetooth() {

  if (Serial.available() > 0) {
    keuze = Serial.read();
  }
}


In deze functie wordt 'keuze' gevuld met de waarde die binnenkomt via BT.
Maar hoe kan ik die waarde gebruiken in de if-loop uit het vorige bericht om zo te checken dat óf de schakelaars worden gebruikt, óf er komt een BT signaal binnen en zo ja, welk signaal dan.

MAS3

Lijkt me niet zo heel moeilijk.
Maar ik vraag me af waarom je dat onderscheid wil maken.

In jouw functie bluetooth kun je meer doen dan kijken of er iets binnenkomt, en wat er dan binnenkomt kopiëren naar een variabele.
Je kunt ook een variabele bewerken die bijhoudt of er iets binnenkwam of niet.
En natuurlijk kun je de variabele 'keuze' vullen met een inhoud die onmogelijk uit de bluetooth verbinding kan komen.
Als dat dan in 'keuze' zit, dan is er dus niets binnengekomen.
Wanneer er iets anders inzit, dan is er wel at binnengekomen en kun je de binnengekomen data gaan verwerken.
Uiteraard ga je na het verwerken, 'keuze' weer vullen met de onmogelijke inhoud.

Overigens raad ik je aan je eigen vragen eens kritisch te lezen en te beantwoorden (dat raad ik iedereen aan, schrijf je vragen op en verdeel ze onder in steeds kleinere deelvragen, maakt ze eenvoudig te beantwoorden).
Want wat hier boven staat, is niet veel meer dan een reflectie van de laatste helft van je laatste zin in je vraag hierboven.

Stukje code:
Code: [Select]
void bluetooth() {

  if (Serial.available() > 0) {
    keuze = Serial.read();
    BT_gekozen = true;
  }
}


Uiteraard maak je dan de de boolean variabele BT_gekozen aan zodat ie globaal (in alle functies van je sketch) beschikbaar is.
Dat kan wel anders maar is een klein beetje ingewikkelder.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

jmnijsse

Heb uiteindelijk toch de functie bluetooth() eruit gehaald en het op deze manier opgelost, die volgens mij hetzelfde doet. Het werkt nu in elk geval.

Bedankt voor het meedenken en sturen.

J.

Code: [Select]

//Verlichtingsregeling voliere. Ledpin 3 is via aan Mosfet 30N06L aan 10 ledmodules verbonden.
//Via schakelaars op pin 7 en 8 kun je óf het licht aan / uit zetten óf aan / uit dimmen.
//Via bluetooth verbinding met een HC-05 module kan hetzelfde maar dan met instelbare signalen die de bluetooth verzender uitstuurt.

int ledPin = 3;
int state = 0;
int manual1 = 7;
int manual1_state;
int last_manual1_state = 0;
int manual2 = 8;
int manual2_state;
int last_manual2_state = 0;
int keuze;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(manual1, INPUT);
  pinMode(manual2, INPUT);
  digitalWrite(ledPin, LOW);

  Serial.begin(9600); // Default connection rate for my BT module
}

void loop() {

  manual1_state = digitalRead(manual1);
  manual2_state = digitalRead(manual2);

  //=====Bluetooth=====

  if (Serial.available() > 0) {
    keuze = Serial.read();
    if (keuze == 'A') {
      dimIn();
    }
    else if (keuze == 'a') {
      dimOut();
    }
    else if (keuze == 'B') {
      lightOn();
    }
    else if (keuze == 'b') {
      lightOff();
    }
  }

  //=====Handmatig=====

  if (manual1_state != last_manual1_state) {
    if (manual1_state == LOW) {
      Serial.println("1 low");
      dimOut();
    }
    else {
      Serial.println("1 high");
      dimIn();
    }
    delay(1);
    last_manual1_state = manual1_state;
  }


  if (manual2_state != last_manual2_state) {
    if (manual2_state == LOW) {
      Serial.println("2 low");
      lightOff();
    }
    else {
      Serial.println("2 high");
      lightOn();
    }
    delay(1);
    last_manual2_state = manual2_state;
  }
}


void dimIn() {

  for (int x = 0; x < 255; x++) {
    analogWrite(ledPin, x);
    delay(3000);
  }
  digitalWrite(ledPin, HIGH);
}

void dimOut() {

  for (int y = 255; y > 1; y--) {
    analogWrite (ledPin, y);
    delay(3000);
  }
  digitalWrite(ledPin, LOW);
}

void lightOn() {
  digitalWrite(ledPin, HIGH);
}

void lightOff() {
  digitalWrite(ledPin, LOW);
}




Go Up