Προσωπικά χρησιμοποιώ τον IR κώδικα του hifiduino, ο οποίος δεν έρχεται καν σε μορφή library.. απλά πράγματα.. δουλεύει out-of-the-box με το τηλεκοντρόλ της Apple αλλά και με οποιοδήποτε τηλεκοντρόλ παίζει με τους κώδικες της NEC. Εγώ το δουλεύω ακόμα με ένα τ/χ από BlueSky..
Όσο αφορά το memory footprint, δεν έχω ιδέα. Ο κώδικας του βουβαλιού μου έχει περάσει πλέον τις 2200 γραμμές και τα 70ΚΒ οπότε τρέχα γύρευε.. Πάντως το κομμάτι του IR λογικά θα είναι πολύ πιο μικρό από 10Κ.
Περισσότερα εδώ: http://hifiduino.wordpress.com/code/
Έχεις καμιά ιδέα πόσο μεγάλη θα βγει η πλακέτα ?
Μεγάλη πλακέτα μεγάλο κόστος -> μεγάλος κόστος λιγότερο ενδιαφέρον -> ακόμα ακριβότερη πλακέτα.
Επειδή υπάρχει επανάληψη στο κύκλωμα μήπως θα σύμφερε να την σπάσουμε με τον αντίστοιχο τρόπο που κάναμε στα PGA?
Θα κάτσω να το τροποποιήσω για να σου δείξω οπτικά τι εννοώ.
Υγ. Τα τροφοδοτικά μάλλον βγάλε τα τελείως διότι εκτός του ότι οι περισσότεροι θα πάνε σε salas, μάλλον θα είναι και κοινά με αυτά των pga.
Άσε μόνο αυτό της τροφοδοσίας των relay για την ώρα.
Ντίνο, τα τροφοδοτικά έκδοσης 1.1 με τα ανάλογα σεραρίσματα πάνε από 2,5-45V.
Επίσης, επειδή χρησιμοποιούν ταυτόγχρονη έξοδο με αισθητήρες τύπου Kelvin, παρακάμπτουν το γνωστό πρόβλημα που δημιουργεί η αντίσταση των καλωδίων.
Άποψή μου είναι να παραμείνουν τα σημεία αποσύζευξης κοντά στους τελεστικούς όπως τα έχεις, έτσι ώστε η σχεδίαση να είναι πιο ευέλικτη - το ίδιο έχω κάνει και στο pga.
Όλα αυτά φυσικά θα παραμετροποιηθούν στο τέλος που αναλόγως της τροφοδοσίας που θα επιλέξει ο καθένας, θα δώσει και σχετική βοήθεια στα λοιπά μέλη.
Πάντως - κατά τη γνώμη μου - καλά κάνεις και αναφέρεις τα προβλήματα που προκύπτουν από τις ανεξάρτητες τροφοδοσίες και ως σχεδίαση καλώς έπραξες.
Για το φιλτράρισμα θέλω να ακούσω και τους λοιπούς.
Φυσικά, περιμένω και τις γνώμες των λοιπών μελών που συμμετέχουν στο νήμα για να καθορίσουμε καλύτερα τις ανάγκες μας.
Μια μεγάλη πλακέτα εισόδου με πολλές εισόδους/εξόδους και εμένα θα μου ήταν χρήσιμη. Μια όμως.
Οι μικρές θα έβρισκαν πιο συχνή χρήση σε μικρά projects. Τα συνηθισμένα για πολλούς από εμάς.
Άρα δε θεωρώ απαραίτητα κακό να ξεκινήσουμε από μια μεγάλη πλακέτα εσόδου, και να υπάρχει και μια εναλλακτική μικρή αργότερα.
Τα 317/337 δεν είναι απαραίτητο να αφαιρεθούν από το τυπωμένο. Εάν θέλει κάποιος δε τα βάζει στη πλακέτα και φέρνει ρεύμα από όπου αλλού. Λχ. πιθανά είναι εύκολο να προβλέψουμε σχετική αναμονή, και βάζουμε και ένα cut trace here Χ .
/*
* Pin Assigment for the various Periferals
* Comment out the pin assigments you dont use.
* This should skip compilation of the respective code
* saving precious codespace.
*/
//Rotary Encoder without Interrupts
#define ENCA 19
#define ENCB 18
//General Mute Button
#define MUTEBUTTON 17
//A "Simple" 16 Led Graph
#define LEDGraphSelect 10
//PGA23xx. You propably need it
#define PGASelect 12
//Paraller LCD connected in a 4bit transfer mode.
#define PlcdRS 2
#define PlcdEN 3
#define PlcdD4 7
#define PlcdD5 6
#define PlcdD6 5
#define PlcdD7 4
/*
* General Settings for this Pre Amplifier
*/
//Maximum gain. Some offset values will override it.
#define MaximumVolume 192
//Number of channels. This should always be an even number since each PGA has 2 channels.
#define ChannelNumber 2
//Volume offset values. Negative values will lower volume.
int offset[ChannelNumber] = {};
/*
* Venture further below if you know what you are getting into :).
*/
#include <SPI.h>
#if defined(PlcdRS) && defined(PlcdEN) && defined(PlcdD4) && defined(PlcdD5) && defined(PlcdD6) && defined(PlcdD7)
#include <LiquidCrystal.h>
LiquidCrystal lcd(PlcdRS, PlcdEN, PlcdD4, PlcdD5, PlcdD6, PlcdD7);
int curpos = 8;
#endif
void setup() {
#if defined(PlcdRS) && defined(PlcdEN) && defined(PlcdD4) && defined(PlcdD5) && defined(PlcdD6) && defined(PlcdD7)
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Volume: MUTE ");
lcd.setCursor(0, 1);
lcd.print("Input : Computer");
#endif
#if defined(ENCA) && defined(ENCB)
pinMode(ENCA, INPUT);digitalWrite(ENCA, HIGH);
pinMode(ENCB, INPUT);digitalWrite(ENCB, HIGH);
#endif
#if defined(MUTEBUTTON)
pinMode(MUTEBUTTON, INPUT);digitalWrite(MUTEBUTTON, HIGH);
#endif
#if defined(LEDGraphSelect)
pinMode(LEDGraphSelect, OUTPUT);
#endif
SPI.begin() ;
Serial.begin(9600);
}
unsigned int volume=0;
unsigned int previousVolume=255;
void loop() {
#if defined(MUTEBUTTON)
muteButtonPoll();
#endif
#if defined(ENCA) && defined(ENCB)
int dir=RotEncoder();
if (dir==1&&volume>0) {
volume=volume-1;
} else if (dir==2&&volume<MaximumVolume) {
volume=volume+1;
}
#endif
delay(1); // Software Debouncing. The correct way is with capacitors and resistors but its vastly more complicated.
/*
* Things here are executed each time the volume changes. This should generaly be output commands.
*/
if (volume != previousVolume) {
previousVolume=volume;
#if defined(PlcdRS) && defined(PlcdEN) && defined(PlcdD4) && defined(PlcdD5) && defined(PlcdD6) && defined(PlcdD7)
int gain=315-(5*(255-volume));
char buffer[17] ="";
if (volume==0)
sprintf(buffer, " MUTE ",gain/10,abs(gain)%10);
else
sprintf(buffer, " %3d.%ddb ",gain/10,abs(gain)%10);
lcd.setCursor(7, 0);
lcd.print(buffer);
#endif
#if defined(LEDGraphSelect)
LEDShow(volume);
#endif
//setVol(volume, volume);
}
}
/*
* Helper functions that automate simple tasks.
*/
unsigned int unmuteVolume=0;
void mute () {
if (volume == 0)
volume=unmuteVolume;
else {
unmuteVolume=volume;
volume=0;
}
}
void setVol (unsigned int volumeL, unsigned int volumeR) {
digitalWrite(PGASelect, LOW);
SPI.transfer(volumeL);
SPI.transfer(volumeR);
digitalWrite(PGASelect, HIGH);
}
/* Below this comment we have the functions that check each of the buttons and do the neccessary functions */
/* We should call them only when we need then to conserve cycles */
#if defined(ENCA) && defined(ENCB)
int state0[]={0,0,0,0};
int RotEncoder() {
int encc = (digitalRead( ENCA ) << 1) + digitalRead( ENCB );
int out=4;
int state1[]={1,0,2,3};
int state2[]={0,2,3,1};
int state3[]={2,3,1,0};
int state4[]={3,1,0,2};
int state5[]={0,1,3,2};
int state6[]={1,3,2,0};
int state7[]={3,2,0,1};
int state8[]={2,0,1,3};
if (state0[3] != encc) {
for (int i=0;i<4;i++) {
if (i<3) state0[i]=state0[i+1];
else state0[i]=encc;
}
if ((state1[0] == state0[0] && state1[1] == state0[1] && state1[2] == state0[2] && state1[3] == state0[3])||
(state2[0] == state0[0] && state2[1] == state0[1] && state2[2] == state0[2] && state2[3] == state0[3])||
(state3[0] == state0[0] && state3[1] == state0[1] && state3[2] == state0[2] && state3[3] == state0[3])||
(state4[0] == state0[0] && state4[1] == state0[1] && state4[2] == state0[2] && state4[3] == state0[3]))
out = 1;
else if ((state5[0] == state0[0] && state5[1] == state0[1] && state5[2] == state0[2] && state5[3] == state0[3])||
(state6[0] == state0[0] && state6[1] == state0[1] && state6[2] == state0[2] && state6[3] == state0[3])||
(state7[0] == state0[0] && state7[1] == state0[1] && state7[2] == state0[2] && state7[3] == state0[3])||
(state8[0] == state0[0] && state8[1] == state0[1] && state8[2] == state0[2] && state8[3] == state0[3]))
out = 2;
else
out = 3;
}
return out;
}
#endif
#if defined(MUTEBUTTON)
boolean previusInputCT = 0;
void muteButtonPoll () {
boolean inputCT = digitalRead(MUTEBUTTON);
if (inputCT != previusInputCT && inputCT == LOW) {
mute();
}
previusInputCT = inputCT;
}
#endif
#if defined(LEDGraphSelect)
void LEDShow(int value) {
int bytehigh=0, bytelow=0;
if (volume==0) {
bytelow=0;
bytehigh=1;
} else {
int localhigh = map(volume, 0, MaximumVolume, 1, 15);
int ledstate = 0;
for (int i=0;i<15;i++) {
if (i < localhigh ) {
ledstate+=1;
}
ledstate=(unsigned int)ledstate << 1;
}
bytehigh= ledstate&255;
bytelow= ((unsigned int)ledstate&65280) >> 8;
}
SPI.setBitOrder(LSBFIRST);
SPI.transfer(bytehigh);
SPI.transfer(bytelow);
digitalWrite(LEDGraphSelect, HIGH);
digitalWrite(LEDGraphSelect, LOW);
}
#endif
We use essential cookies to make this site work, and optional cookies to enhance your experience.