van liquid cristal naar oled

Arduino specifieke Software
Gebruikers-avatar
Berichten: 19
Geregistreerd: 09 Mrt 2017, 13:51
Woonplaats: GB

van liquid cristal naar oled

Berichtdoor edensan » 12 Jun 2017, 21:36

Hallo allemaal,

Ik heb een skets die was bestemd voor liquid cristal omgezet naar oled.
dus ik heb de adfruit demo gepakt en gekeken hoe ze daar de oled aansturen.
dit ook bij mn eigen sketch gedaan
de demo draaid vlekkeloos
maar mn eigen sketch geeft alleen ruis...
misschien dat er iemand is die er wat zinnigs over kan zeggen? :D
Code: Alles selecteren
/*========================================================================== 
  Author              : Fahmi Ghani
  Project       : Test Peristaltic pump
  Date                : 20 Sept 2014 
  Video     :https://www.youtube.com/watch?v=GdTUIwj5ros
  Hardware    : Arduino Uno, LCD keypad shield. ULN2003(for switching motor)
==========================================================================*/
//#include <LiquidCrystal.h>
//LiquidCrystal lcd(8,9,4,5,6,7);
 

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

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

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

 

int keypad_pin = A0;
int Keypad_value = 0;
int Keypad_value_old = 0;

char Btn_push;

int Pump1 = 2;
int volume = 10;
int volumeOld = 10;
int Pump1State =0;

int MenuPage =1;
int MenuPageOld =1;

long previousMillis = 0; 
unsigned long currentMillis ;
long interval = 1000;
unsigned long multiplier = 1000; //value to change based on calibration
//multiplier = milliseconds needed to fill 1ml liquid

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 0x3D (for the 128x64)
  //lcd.begin(16,2);  //Initialize a 2x16 type LCD
  pinMode(Pump1, OUTPUT); 
  pinMode(10, OUTPUT); 
 
      //  lcd.setCursor(0,0);
   //     lcd.print("Peristaltic Pump");
   //     lcd.setCursor(0,1);
   //     lcd.print("Test");

             //      display.setTextSize(1);
 // display.setTextColor(WHITE);
  display.setCursor(0,0);
   display.println("Peristaltic Pump");
   display.setCursor(0,1);
  display.println("Test");
   display.clearDisplay();
      //  lcd.clear();
        delay(1000);

        MenuDisplay(MenuPage);
       
        analogWrite(10,50);
        delay(1000);       
}
void loop()
{
    Btn_push = ReadKeypad();
   
    //Change menu
    if(Btn_push == 'L') MenuPage =1;
    if(Btn_push == 'R') MenuPage =2;
   
    if(MenuPage != MenuPageOld)
    {
        MenuDisplay(MenuPage);
        MenuPageOld = MenuPage;
    }

    if(MenuPage ==1)
    {
        if(Btn_push == 'U' && volume <100)
          volume+=1;

        if(Btn_push == 'D'&& volume>0)
          volume-=1;
       
        if(volumeOld != volume)//update lcd when got new volume
        {
       //     lcd.setCursor(8,0);
         //   lcd.print(volume);
         //   lcd.print("ml ");
                //   display.setTextSize(1);
 // display.setTextColor(WHITE);
  display.setCursor(8,0);
   display.println(volume);
  display.println("Cl");
            volumeOld = volume;
        }
       
        if(Btn_push == 'S' )
        {
            RunPump(volume);
           
            MenuDisplay(MenuPage);
           
        }
    }
    if(MenuPage ==2)
    {
       if(Btn_push == 'S')
       {
           if(!Pump1State )
           {
             digitalWrite(Pump1,1);
        //     lcd.setCursor(0,1);
          //   lcd.print("Pump Run  ");
            //        display.setTextSize(1);
  //display.setTextColor(WHITE);
  display.setCursor(0,1);
  display.println("Pomp start");
             Pump1State =1;
           }
           else
           {       
             digitalWrite(Pump1,0);
        //     lcd.setCursor(0,1);
         //    lcd.print("Pump Stop  ");
           //  display.setTextSize(1);
 // display.setTextColor(WHITE);
  display.setCursor(0,1);
  display.println("Pomp stop");
             Pump1State =0;
           }
           delay(100);
       }
       
    }

    delay(200);
 
}//--------------- End of loop() loop ---------------------
void MenuDisplay(int page)
{
    switch (page)
    {
       case 1:
//          lcd.clear();
 display.clearDisplay();

 // display.setTextSize(1);
//  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Volume:");
    //      lcd.setCursor(0,0);
   //       lcd.print("Volume: ");
//   display.setTextSize(1);
//  display.setTextColor(WHITE);
  display.setCursor(8,0);
  display.println(volume);
  display.println("cl");
       //   lcd.setCursor(8,0);
         // lcd.print(volume);
          //lcd.print("ml ");
          break;
       case 2:
        //  lcd.clear();
          display.clearDisplay();
     //     lcd.clear();
          display.clearDisplay();
      //    lcd.setCursor(0,0);
        //   display.setTextSize(1);
 // display.setTextColor(WHITE);
  display.setCursor(0,0);
        //  lcd.print("Flush Water");
          display.println("Spoel water");
         break;
    }
 
}

void RunPump(unsigned long ml)
{
    previousMillis = millis();
    currentMillis = previousMillis;
   
    interval = ml *multiplier;
   
    digitalWrite(Pump1,1);
   
        //lcd.setCursor(4,1);
      //    display.setTextSize(1);
  //display.setTextColor(WHITE);
  display.setCursor(4,1);
  display.println("cl");
   //     lcd.print("ml ");
       
    while(currentMillis - previousMillis < interval)
    {
        currentMillis = millis();
//        lcd.setCursor(0, 1);
//  display.setTextSize(1);
//  display.setTextColor(WHITE);
  display.setCursor(0,1);
  display.println((currentMillis - previousMillis)/1000);
    //    lcd.print((currentMillis - previousMillis)/1000);
    }
   //     lcd.setCursor(0, 1);
   //  display.setTextSize(1);
  // display.setTextColor(WHITE);
  display.setCursor(0,1);
  display.println((currentMillis - previousMillis)/1000);
       // lcd.print((currentMillis - previousMillis)/1000);
   
    digitalWrite(Pump1,0);
    delay(1000);
}

char ReadKeypad()
{
  /* Keypad button analog Value
  no button pressed 1023
  select  741
  left    503
  down    326
  up      142
  right   0
  */
  Keypad_value = analogRead(keypad_pin);
 
  if(Keypad_value < 100)
    return 'R';
  else if(Keypad_value < 200)
    return 'U';
  else if(Keypad_value < 400)
    return 'D';
  else if(Keypad_value < 600)
    return 'L';
  else if(Keypad_value < 800)
    return 'S';
  else
    return 0;
 
}

Advertisement

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

Re: van liquid cristal naar oled

Berichtdoor Koepel » 13 Jun 2017, 06:30

Dus zonder de hardware te wijzigen draait de Adafruit demo goed ?
Weet je dat heel zeker, of zet je bijvoorbeeld bij de ene de voeding aan van de pomp terwijl die bij de andere die uit staat ?
Kun je een link geven naar die demo ?

Zie je de tekst "Peristaltic Pump" verschijnen die in setup() wordt gedaan ? of werkt het daar al niet ?

Als het een oled van Adafruit zelf is, dan kun je de Adafruit library gebruiken. Ik heb begrepen dat die veel geheugen vraagt.
Zelf geef ik de voorkeur aan U8g2 : https://github.com/olikraus/u8g2.

Gebruikers-avatar
Berichten: 19
Geregistreerd: 09 Mrt 2017, 13:51
Woonplaats: GB

Re: van liquid cristal naar oled

Berichtdoor edensan » 13 Jun 2017, 07:46

Bij de eerste initialisatie krijg ik overal stipjes (ruis)
Met de pomp doe ik nog niets eerst beeld en dan gaan we verder ( ben ook nog van sinds Rotary encoder toe te voegen)
Ik gebruik de 128x64 i2c demo van adafruit (ssd1306)
Demo met logo etc gaan prima.
Ik heb gekozen voor adafruit omdat het haast dezelfde manier van aanroepen is als de liquidatie cristal.

Gr Edwin

Gebruikers-avatar
Berichten: 210
Geregistreerd: 03 Sep 2013, 10:03
Woonplaats: Katwijk ZH

Re: van liquid cristal naar oled

Berichtdoor baco1978 » 13 Jun 2017, 13:45

Tot zover ik het kunnen vergelijken met de demo lijkt het overeen te komen met je programma.
het enige verschil is dat de demo i2c adres 0x3D gebruikt en jij 0x3C, maar ik ga er vanuit dat je dit zelf bewust hebt gewijzigd.


Heb je zelf al geprobeerd om zelf een nieuwe sketch te maken, waarbij je alleen het scherm initialiseert en een simpel tekstje op het scherm laat verschijnen.
Als dit werkt heb je iig een basis waarmee je voor jezelf kan vergelijken met je huidige programma waar misschien het probleem in kan zitten
Met vriendelijke groet Arjan

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

Re: van liquid cristal naar oled

Berichtdoor Koepel » 13 Jun 2017, 15:06

@baco1978, maar ik zie iets dat totaal anders is.

@edensan,
Kun je proberen om de #include <SPI.h> te verwijderen. Misschien dat de bibliotheek die nodig heeft, dus ik weet niet of dat kan.
Kun je ook pinMode(10, OUTPUT); verwijderen. Het is nu niet nodig om de SPI bus goed te zetten.

Het gaat dus om deze tutorial: https://learn.adafruit.com/monochrome-oled-breakouts/arduino-library-and-examples
En deze demo: https://github.com/adafruit/Adafruit_SSD1306/blob/master/examples/ssd1306_128x64_i2c/ssd1306_128x64_i2c.ino

Ik heb nooit met die Adafruit libraries gewerkt, maar volgens mij is jouw sketch heel wat anders dan de demo :mrgreen:
In die demo zie je volop gebruik van display.display(); terwijl jij dat nergens hebt.

Je kunt beginnen om de eerste helft van de setup() van de demo in jouw setup() te zetten. Dan zou je dat zien als het goed is.
Nadat je een display.println(...); hebt gedaan, probeer dan daarna eens een display.display(); gevolgd door delay(2000);
Dan zou het zichtbaar moeten worden.

Gebruikers-avatar
Berichten: 19
Geregistreerd: 09 Mrt 2017, 13:51
Woonplaats: GB

Re: van liquid cristal naar oled

Berichtdoor edensan » 13 Jun 2017, 18:35

Ik heb die spi.h uitgevinkt
pinmode ook
geen verschil
display.display(); roept het logo van adafruit aan dus niet nodig... :lol:
ik heb het idee dat het mis gaat met het

// Clear the buffer.
display.clearDisplay();
maar we stoeien door... :|

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

Re: van liquid cristal naar oled

Berichtdoor Koepel » 13 Jun 2017, 19:04

Als je het logo ziet, dan heb je dus geen ruis meer. Dat was de bedoeling ook ;)

Na een display.begin zit het logo er in. Een display.display() laat dan het logo zien. Daarna een display.clearDisplay() verwijdert het logo (niet van het scherm, maar het logo wordt uit de buffer verwijdert). Daarna lijnen en blokken en tekst schrijven, en dan een display.display() om dat te laten zien.

Gebruikers-avatar
Berichten: 19
Geregistreerd: 09 Mrt 2017, 13:51
Woonplaats: GB

Re: van liquid cristal naar oled

Berichtdoor edensan » 13 Jun 2017, 19:31

Koepel schreef:Zelf geef ik de voorkeur aan U8g2 : https://github.com/olikraus/u8g2.


Ik heb inmiddels alles vertaald naar u8g2 maar geen beeld... :(
Code: Alles selecteren
/*========================================================================== 
  Author              : Fahmi Ghani
  Project       : Test Peristaltic pump
  Date                : 20 Sept 2014 
  Video     :https://www.youtube.com/watch?v=GdTUIwj5ros
  Hardware    : Arduino Uno, u8g2 keypad shield. ULN2003(for switching motor)
==========================================================================*/
 
#include <Arduino.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);   // All Boards without Reset of the Display

int keypad_pin = A0;
int Keypad_value = 0;
int Keypad_value_old = 0;

char Btn_push;

int Pump1 = 2;
int volume = 10;
int volumeOld = 10;
int Pump1State =0;

int MenuPage =1;
int MenuPageOld =1;

long previousMillis = 0; 
unsigned long currentMillis ;
long interval = 1000;
unsigned long multiplier = 1000; //value to change based on calibration
//multiplier = milliseconds needed to fill 1ml liquid

void setup()
{
  u8g2.begin();
  pinMode(Pump1, OUTPUT); 
  pinMode(10, OUTPUT); 
 
        u8g2.setCursor(0,0);
        u8g2.print("Peristaltic Pump");
        u8g2.setCursor(0,1);
        u8g2.print("Test");
        u8g2.clearBuffer();
        delay(1000);

        MenuDisplay(MenuPage);
       
        analogWrite(10,50);
        delay(1000);       
}
void loop()
{
    Btn_push = ReadKeypad();
   
    //Change menu
    if(Btn_push == 'L') MenuPage =1;
    if(Btn_push == 'R') MenuPage =2;
   
    if(MenuPage != MenuPageOld)
    {
        MenuDisplay(MenuPage);
        MenuPageOld = MenuPage;
    }

    if(MenuPage ==1)
    {
        if(Btn_push == 'U' && volume <100)
          volume+=1;

        if(Btn_push == 'D'&& volume>0)
          volume-=1;
       
        if(volumeOld != volume)//update u8g2 when got new volume
        {
            u8g2.setCursor(8,0);
            u8g2.print(volume);
            u8g2.print("ml ");
            volumeOld = volume;
        }
       
        if(Btn_push == 'S' )
        {
            RunPump(volume);
           
            MenuDisplay(MenuPage);
           
        }
    }
    if(MenuPage ==2)
    {
       if(Btn_push == 'S')
       {
           if(!Pump1State )
           {
             digitalWrite(Pump1,1);
             u8g2.setCursor(0,1);
             u8g2.print("Pump Run  ");
             Pump1State =1;
           }
           else
           {       
             digitalWrite(Pump1,0);
             u8g2.setCursor(0,1);
             u8g2.print("Pump Stop  ");
             Pump1State =0;
           }
           delay(100);
       }
       
    }

    delay(200);
 
}//--------------- End of loop() loop ---------------------
void MenuDisplay(int page)
{
    switch (page)
    {
       case 1:
          u8g2.clearBuffer();
          u8g2.setCursor(0,0);
          u8g2.print("Volume: ");
          u8g2.setCursor(8,0);
          u8g2.print(volume);
          u8g2.print("ml ");
          break;
       case 2:
          u8g2.clearBuffer();
          u8g2.clearBuffer();
          u8g2.setCursor(0,0);
          u8g2.print("Flush Water");
         break;
    }
 
}

void RunPump(unsigned long ml)
{
    previousMillis = millis();
    currentMillis = previousMillis;
   
    interval = ml *multiplier;
   
    digitalWrite(Pump1,1);
   
        u8g2.setCursor(4,1);
        u8g2.print("ml ");
       
    while(currentMillis - previousMillis < interval)
    {
        currentMillis = millis();
        u8g2.setCursor(0, 1);
        u8g2.print((currentMillis - previousMillis)/1000);
    }
        u8g2.setCursor(0, 1);
        u8g2.print((currentMillis - previousMillis)/1000);
   
    digitalWrite(Pump1,0);
    delay(1000);
}

char ReadKeypad()
{
  /* Keypad button analog Value
  no button pressed 1023
  select  741
  left    503
  down    326
  up      142
  right   0
  */
  Keypad_value = analogRead(keypad_pin);
 
  if(Keypad_value < 100)
    return 'R';
  else if(Keypad_value < 200)
    return 'U';
  else if(Keypad_value < 400)
    return 'D';
  else if(Keypad_value < 600)
    return 'L';
  else if(Keypad_value < 800)
    return 'S';
  else
    return 0;
 
}


volgens wiki:

print

C++/Arduino Prototype:
void U8G2::print(...)
Description: This is the Arduino print() function. See the description on the Arduino Web Page here and here. This procedure will write the text to the current cursor position with the current font, set by setFont. The cursor position can be set by setCursor. Support for UTF-8 can be enabled with enableUTF8Print.
Arguments: See link.
Returns: -
Note: This function depends on the current font mode and drawing color.
See also: print (U8x8), enableUTF8Print, setCursor, setFont
Example:
u8g2.setFont(u8g2_font_ncenB14_tr);
u8g2.setCursor(0, 15);
u8g2.print("Hello World!");
Afbeelding
Laatst gewijzigd door edensan op 13 Jun 2017, 19:46, in totaal 1 keer gewijzigd.

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

Re: van liquid cristal naar oled

Berichtdoor Koepel » 13 Jun 2017, 19:38

Ik was bezig om je duidelijk te maken dat bij de Adafruit library had je alleen maar display.display() hoef toe te voegen om de buffer naar het scherm te sturen.

De U8g2 kan in verschillende modes werken. Met de "Full screen buffer mode" is er u8g2.sendBuffer() om de buffer naar het scherm te sturen.

Gebruikers-avatar
Berichten: 19
Geregistreerd: 09 Mrt 2017, 13:51
Woonplaats: GB

Re: van liquid cristal naar oled

Berichtdoor edensan » 14 Jun 2017, 07:35

Ahh weer wat geleerd thx!
Ik zie in voorbeelden van u8g2 verschillende modi staan ik ga er is ff induiken thx!

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 27 gasten