reel2reel teller

Arduino specifieke Software
Berichten: 12
Geregistreerd: 05 Dec 2016, 15:07

Re: reel2reel teller

Berichtdoor dyk » 24 Dec 2016, 01:18

Ik heb inmiddels een klein oled schermpje geregeld (adafruit ssd1306,128x64p I2r) en ben er al een avondje of wat mee aan het stoeien, leuk ding, eigenlijk net te klein maar past iig in de kastopening van de oude teller.

Na wat rondspeuren kwam ik op de site van magictale electronics waar de code van adafruit wat aangepast was en er een library met o.a. een 7 segment font , op zo'n oled ding ziet dat er gelikt uit, cool. Werkte in eerste instantie niet op de ide, misschien dat deze tutorial op een vorige versie van arduino geschreven is??? Er zaten iig fouten in bij het compileren.

De afmeting van de font per cijfer is 32x50 pixel, 32 pixels breed dus. Het scherm is 128p breed, er passen maar 4 cijfers op. Plaats voor een minteken is er niet, jammer.
Ik heb de code ingepast in de tellercode en de serial.print veranderd in de code voor het oled scherm, display. print enz. Gelukt tot zo ver. Ik heb zelfs een punt tussen de cijfers kunnen zetten, tenencrommende code maar het werkt. Alleen merk ik dat door de extra code ik aardig richting limiet van het geheugen van de arduino uno ga. Ik wil nml nog functies inpassen o.a. de richting en het tellen aanpassen aan de snelheid van de band, ben bang dat dit te veel wordt.

Verder vraag ik me af of het mogelijk is om zonder veel omslag de grootte van de font te veranderen is, denk zelf van niet ,...iemand???
Had al een programmaatje geprobeerd bitmap2lcd maar daar heb ik voor alsnu te weinig kaas van gegeten, het is niet zo moeilijk om een cijfer te tekenen, als je een cijfer acht maakt kun je met een beetje gummen en plakken de rest ook wel maken, maar ja hoe sla je de cijfers op als hex-bestand en wel zodat het in een headerfile leesbaar is.
Daarbij, het moet leuk blijven, hier gaat al tijd genoeg in zitten zo, heb die cijfers aan de praat, misschien moet ik eens omkijken naar een groter display.

Enfin, :

Code: Alles selecteren
 
/*  **Tellercode**

  Met Encoder Library
  http://www.pjrc.com/teensy/td_libs_Encoder.html

  Tutorial for ssd1306 display with 7segment font in size 32x50 from
  http://magictale.com/2459/interfacing-ssd1306-oled-display-with-luminardo/
  Copyright (c) 2015 Dmitry Pakhomenko.http://magictale.com
 
  This example code is in the public domain.
*/

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <glcdfont.h>
#include <Encoder.h>

Encoder myEnc(2, 3);   // interruptpinnen arduino uno

#define OLED_RESET 0
Adafruit_SSD1306 display(OLED_RESET);

const int buttonPin = 6;     // nummer van de zero return schakelaar
const int relaisPin =  13;   // nummer relaispin
int buttonState = 0;         // variabele voor de status van de schakelaar

const int resetPin = 7;      //reset knop teller op nul zetten
int resetState = 0;          //variabele voor de status van de schakelaar


void loop() {
  long positie = myEnc.read();   // De huidige positie van de band in pulsen.

  ShowHHMMSS(positie);      // druk het af




  //de band stopt bij nul als buttonState == HIGH maar door de snelheid van de
  //band is het beter het wat eerder te stoppen, vandaar "positie 100"
  //dit getal 100 is later proefondervindelijk te veranderen, btw de oude analoge
  //teller schiet de nul altijd voorbij


  buttonState = digitalRead(buttonPin);                            // kijk naar de status van de schakelaar
  if (positie > -100 && positie < 100 && buttonState == HIGH) {    // als aan alle voorwaarden voldaan is,
    digitalWrite(relaisPin, HIGH);                                 // schakel het relais in
  }
  else {
    digitalWrite(relaisPin, LOW);                                  // schakel het relais weer uit
  }
  resetState = digitalRead(resetPin);    // kijk naar de status van de schakelaar
  if (resetState == HIGH) {              //als de knop ingedrukt is
    myEnc.write (0);                     //zet de pulsteller op nul
    delay(500);
  }
}


// ---------------------------------------------
// functie: ShowHHMMSS()
// Drukt de pulses af in uren, minuten en seconden.
// Formaat: (-)HH:MM:SS
//   Plus 1 minuut wordt: 00:01:00
//   Minus 6 seconden wordt: -00:00:06
// ---------------------------------------------
void ShowHHMMSS(long pulses) {
  long totalseconds = pulses / 63;  //  De conversie factor van pulsen naar seconden!!

  if ( totalseconds < 0) {
    //  display.print('-'); werkt ff niet, geen font in de <glcdfont.h>
    totalseconds = -totalseconds;   // maak het een positief getal.
  }

  // Op dit moment is totalseconds altijd positief.
  // Een eventueel min-teken is al afgedrukt.


  // de code hieronder is aangepast om het te laten werken op het oled schermpje
  //misschien is het beter om óf een groter scherm óf
  //de grootte van de cijfers aan te passen, voor nu zonder uren

  // splits het totaal aantal seconden naar uren, minuten en seconden.
  //int hours = int( (totalseconds / (60L * 60L)) % 100L);   // tot maximaal 99 uren
  //int minutes = int( (totalseconds / 60L) % 60L);
  int minutes = int( (totalseconds / 60L) % 100L);
  int seconds = int( totalseconds % 60L);

  // ----------------------- uren ------
  //if (hours < 10) {
  //  Serial.print('0');
  // }
  //  display.print(hours);
  //  Serial.print(':');

  // ----------------------- minuten ------
  if (minutes < 10) {
    display.print('0');
  }
  display.print(minutes);
  //Serial.print(':');

  // ----------------------- seconden ------
  if (seconds < 10) {
    display.print('0');
  }
  display.print(seconds);

  display.setTextColor(WHITE, BLACK);

  display.setTextSize(1);
  display.setFont(sevenSegNumFont, 0);
  display.setCursor(0, 10);

  //pixel tekenen aan het begin en het eind van het display
  //display.drawPixel(0, 0, WHITE );
  //display.drawPixel(127, 63, WHITE );

  //tja, mijn manier om een punt op de goede plek te zetten, kan beter denk ik
  display.drawPixel(61, 56, WHITE );
  display.drawPixel(61, 57, WHITE );
  display.drawPixel(62, 56, WHITE );
  display.drawPixel(62, 57, WHITE );
  display.drawPixel(63, 56, WHITE );
  display.drawPixel(63, 57, WHITE );
  display.drawPixel(64, 56, WHITE );
  display.drawPixel(64, 57, WHITE );
  display.drawPixel(65, 56, WHITE );
  display.drawPixel(65, 57, WHITE );
  display.drawPixel(61, 55, WHITE );
  display.drawPixel(62, 55, WHITE );
  display.drawPixel(63, 55, WHITE );
  display.drawPixel(64, 55, WHITE );
  display.drawPixel(65, 55, WHITE );
  display.drawPixel(61, 54, WHITE );
  display.drawPixel(62, 54, WHITE );
  display.drawPixel(63, 54, WHITE );
  display.drawPixel(64, 54, WHITE );
  display.drawPixel(65, 54, WHITE );
  display.drawPixel(61, 53, WHITE );
  display.drawPixel(62, 53, WHITE );
  display.drawPixel(63, 53, WHITE );
  display.drawPixel(64, 53, WHITE );
  display.drawPixel(65, 53, WHITE );

  display.display();   //druk af
}

void setup() {

  myEnc.write(0);    // startpunt van telling = 0

  //Serial.begin(57600);
  // Serial.println("Luminardo SSD1306 I2C display test started");

  pinMode(relaisPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  pinMode(resetPin, INPUT);


  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // 0x3D initialize with the I2C addr 0x3D (for the 128x64)

  //display.display(); // show splashscreen
  //delay(3000);

  display.dim(true);
  delay(1000);
  display.dim(false);
  display.clearDisplay();   // clears the screen and buffer

}

 

Advertisement

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

Re: reel2reel teller

Berichtdoor Koepel » 24 Dec 2016, 12:24

Je kunt misschien beter een aparte functie maken voor het display en dat niet in de functie zetten die gegevens naar de seriële monitor stuurt.

De U8G2 library zou minder geheugen gebruiken. Hier is een overzicht van alle fonts : https://github.com/olikraus/u8g2/wiki/fntlistall

Vorige

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 22 gasten