Hello community,
First, I apologize about my bad English writing and my low level in C . I'm french and use rarely English
So , my project !
I would like play with a 4 characters Digital Display. ( it's probably from à alarm clock )
On the board, with Digital displays, we see two chips "Shift register" ( MC74HC595 ).
We can drive it with 3 pins , datas, shift, and latch .
To have a correct result , we must send 16 bits datas , each bit enabled with the shift pin and finally validate with latch pin.
So, I must create a "serial" interface or something like this.
I created a class Named "Serialise" who send a sequence.
(Source is more interesting)
Serialise.cpp
#include "Serialise.h"
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
Serialise::Serialise( uint8_t pin_data, uint8_t pin_clock, uint8_t pin_latch ,uint8_t nb_bits ,long tmp_delay)
{
init(pin_data,pin_clock,pin_latch,nb_bits,tmp_delay);
}
void Serialise::init( uint8_t pin_data, uint8_t pin_clock, uint8_t pin_latch ,uint8_t nb_bits ,long tmp_delay)
{
pinMode(pin_data, OUTPUT);
pinMode(pin_clock, OUTPUT);
pinMode(pin_latch, OUTPUT);
PIN_DATA = pin_data;
PIN_CLOCK = pin_clock;
PIN_LATCH = pin_latch;
NB_BITS = nb_bits;
TMP_DELAY = tmp_delay;
}
void Serialise::clear()
{
digitalWrite(PIN_DATA, LOW);
delayMicroseconds(TMP_DELAY);
digitalWrite(PIN_CLOCK, LOW);
delayMicroseconds(TMP_DELAY);
digitalWrite(PIN_LATCH, LOW);
delayMicroseconds(TMP_DELAY);
}
void Serialise::send(long datas)
{
clear();
for (int i = NB_BITS-1 ; i>= 0 ; i--)
{
// clock LOW
digitalWrite(PIN_CLOCK, LOW);
delayMicroseconds(TMP_DELAY);
// data
digitalWrite(PIN_DATA, bitRead(datas, i)) ;
delayMicroseconds(TMP_DELAY);
// clock HIGH
digitalWrite(PIN_CLOCK, HIGH);
delayMicroseconds(TMP_DELAY);
}
// latch HIGH
digitalWrite(PIN_LATCH, HIGH);
delayMicroseconds(TMP_DELAY);
}
Serialise.h
#ifndef Serialise_h
#define Serialise_h
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
class Serialise
{
public:
Serialise(uint8_t pin_data, uint8_t pin_shift, uint8_t pin_latch, uint8_t nbBits , long tmp_delay);
void init(uint8_t pin_data, uint8_t pin_shift, uint8_t pin_latch, uint8_t nbBits , long tmp_delay);
void send(long datas);
void clear();
private:
byte PIN_DATA ;
byte PIN_CLOCK ;
byte PIN_LATCH ;
int NB_BITS;
long TMP_DELAY;
};
#endif
"Serialise" works perfectly at this level.
(certainly not the best way, but working)
For exemple I can run this in main :
#include <Serialise.h>
byte pin_data = 11 ;
byte pin_shift = 12;
byte pin_latch = 13;
int nbBits =16;
long tmp_delay = 1;
Serialise transmiter(pin_data,pin_shift,pin_latch, nbBits , tmp_delay);
void setup()
{
}
void loop()
{
transmiter.send(4);
}
It display four "8" without points.
If I send "2526" , display show this : 1_ 1 ("" as empty)
Other , I send "2522" , display show this : 1_.:_.1.
Right , we can continue.
I decide to create one other class, who calculate the right bit code to send.
Now, it's going worse and worse.
DigitalTimer.cpp
#include "DigitalTimer.h"
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#include "String.h"
#include <C:\Arduino\libraries\Serialise\Serialise.h>
DigitalTimer::DigitalTimer(int data, int clock, int latch )
{
init(data, clock, latch );
}
void DigitalTimer::init(int data, int clock, int latch )
{
_Transmitter(data, clock, latch,16 ,1);
}
void DigitalTimer::clear()
{
_Transmitter.clear();
}
void DigitalTimer::write(String string, long refresh)
{
int len = string.length() ;
char str[len];
string.toCharArray(str,len+1);
int sizeOfFormat = sizeof(str)-1;
unsigned long TimerA = millis();
do
{
for (long j = 0 ; j <= sizeOfFormat ; j++)
{
_Transmitter.send( get_digit_code(str[j]) + get_standard_format_code(j)*bit(8) + point + eclairage + option1 +option2+option3);
}
}
while (TimerA >= millis() -refresh);
}
long DigitalTimer::get_standard_format_code(int index)
{
long bit_code = 0 ;
int correct_pos[4] = {1,0,2,3};
for(int i = 0 ; i<= 3 ; i++)
{
if (correct_pos[i]!= index)
{
bit_code = bit_code + bit(i);
}
}
return bit_code;
}
int DigitalTimer::get_digit_code(char number)
{
int sortie = 0 ;
switch (number)
{
case ' ': sortie = 251; break;
case '0': sortie = 16 ; break;
case '1': sortie = 218; break;
case '2': sortie = 34 ; break;
case '3': sortie = 66 ; break;
case '4': sortie = 200; break;
case '5': sortie = 65 ; break;
case '6': sortie = 1 ; break;
case '7': sortie = 210; break;
case '8': sortie = 0 ; break;
case '9': sortie = 64 ; break;
case 'A': sortie = 128; break;
case 'C': sortie = 49 ; break;
case 'E': sortie = 33 ; break;
case 'F': sortie = 161; break;
case 'G': sortie = 17 ; break;
default : sortie = 251 ;
}
return sortie;
}
DigitalTimer.h
#ifndef DigitalTimer_h
#define DigitalTimer_h
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#include "String.h";
#include <C:\Arduino\libraries\Serialise\Serialise.h>
#define CFG_POINT 1;
#define CFG_ECLAIRAGE 0;
#define CFG_OPTION1 0;
#define CFG_OPTION2 0;
#define CFG_OPTION3 0;
class DigitalTimer
{
public:
DigitalTimer(int data, int clock, int latch );
void init(int data, int clock, int latch );
void clear();
void write(String string, long refresh );
private:
long get_standard_format_code(int index);
int get_digit_code(char number);
int _data_pin;
int _clock_pin;
int _latch_pin;
Serialise _Transmitter;
long point = bit(2) * CFG_POINT;
long eclairage = bit(12) * CFG_ECLAIRAGE;
long option1= bit(13) * CFG_OPTION1;
long option2= bit(14) * CFG_OPTION2;
long option3= bit(15) * CFG_OPTION3;
};
#endif
Main.ino
#include <LiquidCrystal.h>
#include <DigitalTimer.h>
int latchPin = 13;
int clockPin = 12;
int dataPin = 11;
DigitalTimer dc(dataPin,clockPin,latchPin);
void setup()
{
Serial.begin(9600);
}
void loop()
{
dc.clear();
dc.write("1333", 2000);
dc.write("A EF", 2000);
}
As you see, I want use a "Serialise" "object" into the "DigitalTimer" class.
Of course, it returns lot of errors who I dont deciphers.
Errors on windows Arduino IDE 1.6.4
C:\Arduino\libraries\DigitalTimer\DigitalTimer.cpp: In constructor 'DigitalTimer::DigitalTimer(int, int, int)':
C:\Arduino\libraries\DigitalTimer\DigitalTimer.cpp:10:60: error: no matching function for call to 'Serialise::Serialise()'
DigitalTimer::DigitalTimer(int data, int clock, int latch )
^
C:\Arduino\libraries\DigitalTimer\DigitalTimer.cpp:10:60: note: candidates are:
In file included from C:\Arduino\libraries\DigitalTimer\DigitalTimer.h:9:0,
from C:\Arduino\libraries\DigitalTimer\DigitalTimer.cpp:1:
C:\Arduino\libraries\Serialise\Serialise.h:13:1: note: Serialise::Serialise(uint8_t, uint8_t, uint8_t, uint8_t, long int)
Serialise(uint8_t pin_data, uint8_t pin_shift, uint8_t pin_latch, uint8_t nbBits , long tmp_delay);
^
C:\Arduino\libraries\Serialise\Serialise.h:13:1: note: candidate expects 5 arguments, 0 provided
C:\Arduino\libraries\Serialise\Serialise.h:9:7: note: Serialise::Serialise(const Serialise&)
class Serialise
^
C:\Arduino\libraries\Serialise\Serialise.h:9:7: note: candidate expects 1 argument, 0 provided
C:\Arduino\libraries\DigitalTimer\DigitalTimer.cpp: In member function 'void DigitalTimer::init(int, int, int)':
C:\Arduino\libraries\DigitalTimer\DigitalTimer.cpp:18:41: error: no match for call to '(Serialise) (int&, int&, int&, int, int)'
_Transmitter(data, clock, latch,16 ,1);
Someone have à solution to use class into a class ? Or just help to use a better way to do that ?
Thanks for help,