Capactivesensor op lcd printen om te zien welke LED aan staat

#include <LiquidCrystal.h>


#define THRES 30
#define SAMPLES 15

//#define SERIAL_DEBUG

#define LED1 6
#define LED2 7
#define LED3 8
#define LED4 9

typedef struct touchPad{
  int pin;
  int unpValue;
  int value;
  char state=0, prevState=0;
  char toggleState=0;
};

touchPad touchPad1, touchPad2, touchPad3, touchPad4;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  /* Set A0 pull-up resistor, used to charge internal capacitor */
  pinMode(A0, INPUT_PULLUP);
  analogRead(A0);
  //lcd
  lcd.begin(16, 2);
  lcd.print("start load.......");

  pinMode(LED1, OUTPUT);
  digitalWrite(LED1, 0);
  pinMode(LED2, OUTPUT);
  digitalWrite(LED2, 0);
  pinMode(LED3, OUTPUT);
  digitalWrite(LED3, 0);
  pinMode(LED4, OUTPUT);
  digitalWrite(LED4, 0);

  /* Initialize sensors */
  touchPadInit(&touchPad1, A1);
  touchPadInit(&touchPad2, A2);
  touchPadInit(&touchPad3, A3);
  touchPadInit(&touchPad4, A4);

#ifdef SERIAL_DEBUG
  Serial.begin(57600);
#endif
}

void loop() {
  /* Scan sensors */
  touchPadScan(&touchPad1);
  touchPadScan(&touchPad2);
  touchPadScan(&touchPad3);
  touchPadScan(&touchPad4);

  /* Use sensors reding to control LEDs */
  digitalWrite(LED1, touchPad1.toggleState);
  digitalWrite(LED2, touchPad2.toggleState);
  digitalWrite(LED3, touchPad3.toggleState);
  digitalWrite(LED4, touchPad4.toggleState);

  delay(10);

#ifdef SERIAL_DEBUG
  Serial.print(touchPad1.value);
  Serial.print(",");
  Serial.print(touchPad2.value);
  Serial.print(",");
  Serial.print(touchPad3.value);
  Serial.print(",");
  Serial.println(touchPad4.value);
#endif
}

void touchPadInit(touchPad *pad, int pin){
  pad->pin=pin;
  pad->unpValue = (sampleB(pin) - sampleA(pin));
  DIDR0 |= 1;
  DIDR0 |= 1<<(pin-A0);
}

int sampleA(int sensePin){
  /* Sample capacitor is charged to VCC
   * via A0 pull-up resistor, touch pad
   * is discharged by pulling pin low
   */
  ADMUX = 0b01000000;
  pinMode(sensePin, OUTPUT);
  digitalWrite(sensePin, 0);
  
  pinMode(sensePin, INPUT);
  ADMUX = 0b01000000 | sensePin-A0;

  ADCSRA |= 1<<ADSC;
  while((ADCSRA & (1<<ADSC)) != 0);
  
  return ADC;
}

int sampleB(int sensePin){
  /* Sample capacitor is discharged by selecting
   * GND as ADC input, touch pad is charged to VCC
   * via pin pull-up resistor
   */
  ADMUX = 0b01001111;
  pinMode(sensePin, INPUT_PULLUP);
  
  pinMode(sensePin, INPUT);
  ADMUX = 0b01000000 | sensePin-A0;

  ADCSRA |= 1<<ADSC;
  while((ADCSRA & (1<<ADSC)) != 0);
  
  return ADC;
}

void touchPadScan(touchPad *pad){
  static float A, B;

  A=0;
  B=0;

  /* Get some readings from sensor and calculate average */
  for(int i=0; i<SAMPLES; i++){
    A += sampleA(pad->pin);
    B += sampleB(pad->pin);
  }

  A /= SAMPLES;
  B /= SAMPLES;
  
  pad->value = (B - A);

  /* Member unpValue is a running average of the unpressed readings.
   * A sudden change in sensor reading is interpreted as a touch
   */
  if(pad->value > (pad->unpValue + THRES))
    pad->state=1;
   else{
    pad->state=0;
    pad->unpValue=((float)pad->unpValue*0.9)+((float)pad->value*0.1);
  }
  
  if(pad->state == 1 && pad->prevState == 0)
    pad->toggleState = !pad->toggleState;

  pad->prevState = pad->state;
}

dit is mijn code wat ik al een heel eind heb gemaakt maar nu lukt het noch niet om op een lcd 16, 2 te zetten welke LED er aanstaat das als ik LED1 aan zet wil ik dat op mijn lcd zien
zou iemand mij daar bij kunnen helpen alvast bedankt

Beste Jarno,

Je vraag staat nu op het Engelstalige forum.
Misschien kun je je vraag in het engels stellen of je post laten verplaatsen naar het nl forum. Als je op he vlaggetje onder je post duwt wordt de moderator gewaarschuwd dat er iets moet gebeuren.
Heb je al een losse sketch waarmee je op een lcd een text kunt printen? Begin met deze losse sketch en probeer ze dan later in elkaar te schuiven.

Groet, Koen.

ja dat heb ik geprobeerd maar het lukt steeds niet

Kun je de code voor de lcd posten?
Of werkt die wel?
'Het lukt steeds niet', is te vaag. Kun je precies vertellen wat er niet lukt? (Incl. eventuele compiler warnings/errors)?

Hoi jarnofokker, welkom.

In de sketch die je toont, initialiseer je je LCD wel, maar print je er alleen maar een begintekst "start load......." naar.
Verder doe je er niets mee.
Dan kun je dus ook niet verwachten dat er iets meer op je LCD verschijnt.
Ik weet ook niet wat er met de waardes toggleState en value gebeurt.
Het lijkt er op dat je daarmee alle uitgangen dezelfde waarde geeft.

Je kunt met lcd.setCursor(), kiezen waar je iets op je LCD wil zetten.
Vervolgens kun je er neerzetten wat je wil.
Wat je ook kunt doen, maar niet erg netjes is, is een digitalRead op je uitgang doen.
Dan kun je dus letterlijk kijken of die uitgang aan of uit staat, en aan de hand daarvan wat tonen op je LCD.
Eigenlijk is het beter als je toggleState per poort bijhoudt.
Dan krijg je dus toggleState1 tot en met toggleState4.
Want dan kun je gewoon die waarde naar de LCD sturen.
En omdat de toggle een toggle is, kun je daar een bit van maken.
Wanneer je die togglet, dan zeg je:

toggleState1 = !toggleState1

Op die manier flipt ie telkens tussen 0 en 1 heen en weer.

ik bergrijp dit noch niet helemaal kun je noch meer uitleg geven

Zie je deze tekst "start load......." op je lcd scherm?

ja die zie ik. ik heb van alles geprobeerd maar het lukt nog niet jammer genoeg :disappointed_relieved:

"van alles geprobeerd" heeft voor jou een bepaalde waarde, maar wij hebben nog geen idee wat je dan geprobeerd hebt, en heeft voor de mensen die je best graag willen helpen helemaal geen waarde.

Vul volgende eens in in je sketch op de juiste plaatsen (en pas dan ook het nodige aan), en vertel ons dan of je een verschil ziet:

Snippet:

  digitalWrite(LED1, touchPad1.toggleState);
  lcd.setCursor(0,1);
  lcd.print (touchPad1.toggleState);
  lcd.print (" ");

Waarschijnlijk vergt dit nog wat aanpassingen, maar laat ons eerst maar eens weten of dit wat doet.

MAS3

ik heb het geprobeert maar het lever geen verschil alleen op het lcd 0, 1 geeft hij 3 strepjes onder elkaar maar verder niks

3 streepjes onder elkaar op een LCD betekent meestal dat er een ongedefinieerd teken naar het display geschreven wordt.
Tekens 0 tot en met 7 zijn meestal tekens die je zelf kunt aanmaken bij een LCD.
Wanneer je dan een teken print die je niet eerst aangemaakt hebt, krijg je dus iets willekeurigs.
Maar.
Omdat je een print van een getal doet, moet je ook dat getal zien.
Wanneer je in plaats van een print een write naar je display doet, zou je het karakter moeten zien wat in de tabel van de LCD staat, zoals hierboven beschreven.
Met andere woorden, je zou gewoon de inhoud van touchpad1.toggleState moeten zien.
Probleem in jouw sketch, is dat je om een of andere reden toggleState als een char (een (reeks) teken(s)) hebt gedefinieerd.
Mogelijk dat het daarom hier fout gaat.

Overigens, bij een digitalWrite kun je een 0 (nul) naar de uitgang sturen of niet.
Wanneer je een nul stuurt, dan wordt de uitgang ook nul.
Wanneer je iets naar de digitale uitgang stuurt dat geen nul is, dan wordt de uitgang dus een 1.
Dus voor de LED maakt het niet uit wat je er heen stuurt; zodra het geen nul is, gaat de LED aan.

#include <LiquidCrystal.h>


#define THRES 30
#define SAMPLES 15

//#define SERIAL_DEBUG

#define LED1 6
#define LED2 7
#define LED3 8
#define LED4 9

//int stateLED1 = LOW;
//int stateLED2 = LOW;
//int stateLed3 = LOW;
//int stateLED4 = LOW;

typedef struct touchPad{
  int pin;
  int unpValue;
  int value;
  char state=0, prevState=0;
  char toggleState=0;
};

touchPad touchPad1, touchPad2, touchPad3, touchPad4;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  /* Set A0 pull-up resistor, used to charge internal capacitor */
  pinMode(A0, INPUT_PULLUP);
  analogRead(A0);
  //lcd
  lcd.begin(16, 2);
  lcd.clear();

  pinMode(LED1, OUTPUT);
  digitalWrite(LED1, 0);
  pinMode(LED2, OUTPUT);
  digitalWrite(LED2, 0);
  pinMode(LED3, OUTPUT);
  lcd.setCursor(0, 1);
  digitalWrite(LED3, 0);
  pinMode(LED4, OUTPUT);
  digitalWrite(LED4, 0);
  

  /* Initialize sensors */
  touchPadInit(&touchPad1, A1);
  touchPadInit(&touchPad2, A2);
  touchPadInit(&touchPad3, A3);
  touchPadInit(&touchPad4, A4);

#ifdef SERIAL_DEBUG
  Serial.begin(57600);
#endif
}

void loop() {
  /* Scan sensors */
  touchPadScan(&touchPad1);
  touchPadScan(&touchPad2);
  touchPadScan(&touchPad3);
  touchPadScan(&touchPad4);

  /* Use sensors reding to control LEDs */
  digitalWrite(LED1, touchPad1.toggleState);
  digitalWrite(LED2, touchPad2.toggleState);
  digitalWrite(LED3, touchPad3.toggleState);
  digitalWrite(LED4, touchPad4.toggleState);

  delay(10);

#ifdef SERIAL_DEBUG
  Serial.print(touchPad1.toggleState);
  Serial.print(",");
  Serial.print(touchPad2.toggleState);
  Serial.print(",");
  Serial.print(touchPad3.toggleState);
  Serial.print(",");
  Serial.println(touchPad4.toggleState);
#endif
}

void touchPadInit(touchPad *pad, int pin){
  pad->pin=pin;
  pad->unpValue = (sampleB(pin) - sampleA(pin));
  DIDR0 |= 1;
  DIDR0 |= 1<<(pin-A0);
}

int sampleA(int sensePin){
  /* Sample capacitor is charged to VCC
   * via A0 pull-up resistor, touch pad
   * is discharged by pulling pin low
   */
  ADMUX = 0b01000000;
  pinMode(sensePin, OUTPUT);
  digitalWrite(sensePin, 0);
  
  pinMode(sensePin, INPUT);
  ADMUX = 0b01000000 | sensePin-A0;

  ADCSRA |= 1<<ADSC;
  while((ADCSRA & (1<<ADSC)) != 0);
  
  return ADC;
}

int sampleB(int sensePin){
  /* Sample capacitor is discharged by selecting
   * GND as ADC input, touch pad is charged to VCC
   * via pin pull-up resistor
   */
  ADMUX = 0b01001111;
  pinMode(sensePin, INPUT_PULLUP);
  
  pinMode(sensePin, INPUT);
  ADMUX = 0b01000000 | sensePin-A0;

  ADCSRA |= 1<<ADSC;
  while((ADCSRA & (1<<ADSC)) != 0);
  
  return ADC;
}

void touchPadScan(touchPad *pad){
  static float A, B;

  A=0;
  B=0;

  /* Get some readings from sensor and calculate average */
  for(int i=0; i<SAMPLES; i++){
    A += sampleA(pad->pin);
    B += sampleB(pad->pin);
  }

  A /= SAMPLES;
  B /= SAMPLES;
  
  pad->value = (B - A);

  /* Member unpValue is a running average of the unpressed readings.
   * A sudden change in sensor reading is interpreted as a touch
   */
  if(pad->value > (pad->unpValue + THRES))
    pad->state=1;
   else{
    pad->state=0;
    pad->unpValue=((float)pad->unpValue*0.9)+((float)pad->value*0.1);
  }
  
  if(pad->state == 1 && pad->prevState == 0)
    pad->toggleState = !pad->toggleState;

  pad->prevState = pad->state;

/*LED1 aan en uit op lcd printen*/
lcd.setCursor(0, 0);
  if(digitalRead(LED1) == LOW)
  {

  lcd.print("LED1 uit");
}
if(digitalRead(LED1) == HIGH)
  {

  lcd.print("LED1 aan");
}
/*LED2 aan en uit op lcd printen*/
lcd.setCursor(8, 0);
if(digitalRead(LED2) == LOW)
  {

  lcd.print("LED2 uit");
}
if(digitalRead(LED2) == HIGH)
  {

  lcd.print("LED2 aan");
}
/*LED3 aan en uit op lcd printen*/
lcd.setCursor(0, 1);
if(digitalRead(LED3) == LOW)
  {

  lcd.print("LED3 uit");
}
if(digitalRead(LED3) == HIGH)
  {

  lcd.print("LED3 aan");
}
/*LED4 aan en uit op lcd printen*/
lcd.setCursor(8, 1);
if(digitalRead(LED4) == LOW)
  {

  lcd.print("LED4 uit");
}
if(digitalRead(LED4) == HIGH)
  {

  lcd.print("LED4 aan");
}
}

het is me gelukt bedankt alvast

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.