capaciteitsmeter

Arduino specifieke Software
Berichten: 2
Geregistreerd: 14 Nov 2017, 16:33

capaciteitsmeter

Berichtdoor geurink » 14 Nov 2017, 23:10

ik ben bezig met een capaciteitmeter zoals beschreven bij Hackerstore.
als display heb ik een Adafruit_SSD1306

Ik heb het voorbeeldschript van Adafruit aangepast en daar de sketch van de capaciteitsmeter in gekopieerd.

Jammer maar geen succes. Ik heb het idee dat het programma niet doorloopt. Wie kan mij helpen, wat doe ik fout?

Code: Alles selecteren

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#define ANALOGE_PEN A3  // Analoge pen tussen R1/R2 en de condensator
#define R1_PEN      2   // Pen aan R1 (22k-weerstand)
#define R2_PEN      3   // Pen aan R2 (1,5k-weerstand)

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2

#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

void setup()   {
  Serial.begin(9600);
  pinMode(R1_PEN, OUTPUT);
  digitalWrite(R1_PEN, LOW);

  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x32)
  // init done

  // Clear the buffer.
  display.clearDisplay();

}

void loop() {
}

void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) {
  uint8_t icons[NUMFLAKES][3];

  // initialize
  for (uint8_t f = 0; f < NUMFLAKES; f++) {
    icons[f][XPOS] = random(display.width());
    icons[f][YPOS] = 0;
    icons[f][DELTAY] = random(5) + 1;

    Serial.print("x: ");
    Serial.print(icons[f][XPOS], DEC);
    Serial.print(" y: ");
    Serial.print(icons[f][YPOS], DEC);
    Serial.print(" dy: ");
    Serial.println(icons[f][DELTAY], DEC);
  }

  while (1) {
    // draw each icon
    for (uint8_t f = 0; f < NUMFLAKES; f++) {
      display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, WHITE);
    }
    display.display();
    delay(200);

    // then erase it + move it
    for (uint8_t f = 0; f < NUMFLAKES; f++) {
      display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, BLACK);
      // move it
      icons[f][YPOS] += icons[f][DELTAY];
      // if its gone, reinit
      if (icons[f][YPOS] > display.height()) {
        icons[f][XPOS] = random(display.width());
        icons[f][YPOS] = 0;
        icons[f][DELTAY] = random(5) + 1;
      }

      {

        //Ontlaad();
        digitalWrite(R1_PEN, LOW);
        pinMode(R2_PEN, OUTPUT);
        digitalWrite(R2_PEN, LOW);
        while (analogRead(ANALOGE_PEN) > 0);
        pinMode(R2_PEN, INPUT);

        // Meet de condensator
        digitalWrite(R1_PEN, HIGH); // Laadt de condensator (indien er 1 is aangesloten tenminste) op
        long tStart = millis();
        while (analogRead(ANALOGE_PEN) < 647);
        long nDuur = abs(millis() - tStart);

        // Bereken de waarde van de gemeten condensator
        float fMicroFarad = ((float)nDuur / 22000.0) * 1000;

        // Toon de waarde op het LCD
        if (fMicroFarad >= 1.0) {
          static char mf[3];
          mf[0] = 0xe4; // Dit is het micro-symbool (Griekse letter mu), voor microFarad
          mf[1] = 'F';
          mf[2] = 0;
          display.clearDisplay();
          display.print("    ");
          display.print(fMicroFarad);
          display.print(" ");
          display.print(mf);
          delay(200);
        }
        else {
          // Toon waarde in nF
          display.clearDisplay();
          display.print("    ");
          display.print(fMicroFarad * 1e3);
          display.print(" ");
          display.print("nF");
          delay(500); // Iets langere delay dan bij uF!
        }
        {
          //Ontlaad();
          digitalWrite(R1_PEN, LOW);
          pinMode(R2_PEN, OUTPUT);
          digitalWrite(R2_PEN, LOW);
          while (analogRead(ANALOGE_PEN) > 0);
          pinMode(R2_PEN, INPUT);

        }
      }
    }
  }
}





Advertisement

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

Re: capaciteitsmeter

Berichtdoor Koepel » 14 Nov 2017, 23:34

De setup() wordt eenmalig uitgevoerd en de loop() steeds opnieuw.
Wat doet jouw loop() ?

Kun je een link geven naar waar je die sketch hebt gevonden ? De code is nog best merkwaardig.

Ik heb in het verleden meerdere condensator-meet-sketchen geprobeerd. Deze ene doet het veel beter dan de andere, en sommigen kunnen een hele kleine capaciteit nog goed meten.
Dit is een goede start om mee te beginnen: https://www.gammon.com.au/forum/?id=12075.

Gevonden: https://www.hackerstore.nl/BlogArtikel/4
Maar die code lijkt niet op jouw sketch :?

Berichten: 2215
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: capaciteitsmeter

Berichtdoor shooter » 14 Nov 2017, 23:53

inderdaad de loop is helemaal leeg, en eronder staat een functie testdrawbitmap, prima maar daaronder staat while (1) en dat vwordt niet meer uitgevoerd.
paul deelen
shooter@home.nl

Berichten: 2
Geregistreerd: 14 Nov 2017, 16:33

Re: capaciteitsmeter

Berichtdoor geurink » 18 Nov 2017, 17:48

Na verder testen en proberen hier het resultaat.

de schets is van Hackerstore maar aangepast voor een ander display.

Code: Alles selecteren

// Digitale capaciteitsmeter
// (C) 2013 Hackerstore

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2

#define LOGO16_GLCD_HEIGHT 16
#define LOGO16_GLCD_WIDTH  16
static const unsigned char PROGMEM logo16_glcd_bmp[] =
{ B00000000, B11000000,
  B00000001, B11000000,
  B00000001, B11000000,
  B00000011, B11100000,
  B11110011, B11100000,
  B11111110, B11111000,
  B01111110, B11111111,
  B00110011, B10011111,
  B00011111, B11111100,
  B00001101, B01110000,
  B00011011, B10100000,
  B00111111, B11100000,
  B00111111, B11110000,
  B01111100, B11110000,
  B01110000, B01110000,
  B00000000, B00110000 };

#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif


#define ANALOGE_PEN A3  // Analoge pen tussen R1/R2 en de condensator
#define R1_PEN      2   // Pen aan R1 (22k-weerstand)
#define R2_PEN      3   // Pen aan R2 (1,5k-weerstand)


void setup() {

  Serial.begin(9600);
 
  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x32)
  // init done
 
  display.display();
  delay(1000);
 
 pinMode(R1_PEN, OUTPUT);
 digitalWrite(R1_PEN, LOW); 
 
  display.clearDisplay();

}

void loop() {
  Ontlaad();
 
 // Meet de condensator
 digitalWrite(R1_PEN, HIGH); // Laadt de condensator (indien er 1 is aangesloten tenminste) op
 long tStart = millis();
 while(analogRead(ANALOGE_PEN)<647);
 long nDuur = abs(millis()-tStart);
 
 // Bereken de waarde van de gemeten condensator
 float fMicroFarad = ((float)nDuur/22000.0) * 1000;   

    // Toon de waarde op het LCD
 if(fMicroFarad >= 1.0){
   display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  static char mf[3];
  mf[0]=0xe4; // Dit is het micro-symbool (Griekse letter mu), voor microFarad
  mf[1]='F';
  mf[2]=0;
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0,10);
  display.print(fMicroFarad);
  display.print(" ");
  display.print(mf);
  display.display();
  delay(800);
 }
 else {
  // Toon waarde in nF
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(1,10);
  display.print(fMicroFarad*1e3);
  display.print(" ");
  display.print("nF");
  display.display();
  delay(1000); // Iets langere delay dan bij uF!
 }
}

void Ontlaad() { // Ontlaad de condensator zodat hij gereed is voor een volgende meting
 digitalWrite(R1_PEN, LOW);           
 pinMode(R2_PEN, OUTPUT);           
 digitalWrite(R2_PEN, LOW);         
 while(analogRead(ANALOGE_PEN)>0); 
 pinMode(R2_PEN, INPUT);   
 display.clearDisplay();
 display.display();
 delay(10);
}



Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 1 gast