Come posso fare ad usare la lib <DmxSimple.h> con IDE 1.xx

Sto usando la libreria DmxSimple per alcuni esperimenti con il DMX.
Funziona solo con IDE 0022.

Ora vorrei aggiungerci un display lcd, non trovando librerie per l'IDE 0022 vorrei passare all'IDE 1.xx ma DmxSimple non va!

Che posso fare?

Non è che ci aiuti molto così eh ...
... se magari spieghi perché non va ... qualcuno forse ti può dare qualche suggerimento ... :roll_eyes:

Guglielmo

Hai ragione.

/*
Codice per aumentare o diminuire una variabile con i pulsanti di up e down
*/


/*
Dichiarazioni variabili
*/

const int buttonUpPin = 6;                      //numero pin a cui è collegato il pulsante di UP
const int buttonDownPin = 7;                    //numero pin a cui è collegato il pulsnte di DOWN

int buttonUpState;                              //stato attuale del pulsante di UP
long UpDebounceTime;                            //Variabilie di appoggio per calcolare il tempo di cambio di stato del pulsante di UP
long buttonUpPressedTime;                       //tempo che indica da quanto è stato premuto il pulsante
boolean buttonUpPressed;                        //memoria che indica il passaggio da LOW a HIGH del pulsante di UP
boolean repeatUp;                               //memoria che indica il repeat del pulsante attivo
long repeatUpTime;                              //tempo che indica da quanto è attivo il repeat
long lastRepeatUpTime;                          //variabile di appoggio per calcolare repeatUpTime
int addUp;                                      //fattore per incrementare la variabile

int buttonDownState;                            //stato attuale del pulsante di Down
long DownDebounceTime;                          //Variabilie di appoggio per calcolare il tempo di cambio di stato del pulsante di Down
long buttonDownPressedTime;                     //tempo che indica da quanto è stato premuto il pulsante
boolean buttonDownPressed;                      //memoria che indica il passaggio da LOW a HIGH del pulsante di Down
boolean repeatDown;                             //memoria che indica il repeat del pulsante attivo
long repeatDownTime;                            //tempo che indica da quanto è attivo il repeat
long lastRepeatDownTime;                        //variabile di appoggio per calcolare repeatDownTime
int addDown;                                    //fattore per incrementare la variabile 

long debounceDelay = 200;                       //Tempo di debounce per i pulsanti UP e DOWN
long pressedDelay;                              //variabile per determinare l' attivazione del repeat e il tempo di repeat quando è attivo
long timeRepeatEnable = 500;                    //costante che determina il tempo minimo per cui deve rimanere premuto il pulsante prima di ripetere l'operazione
long timeRepeat = 250;                          //costante che determina il tempo di ripetizione di UP e di DOWN

int pippo = 0;                                  //variabile da aumentare o diminuire come valore
const int pippoMax = 512;                     //limite massimo valore della variabile
const int pippoMin = 1;                         //limite minimo valore della variabile
//

#include <DmxSimple.h>


int pot1=analogRead(A1);
int ChDMX;
int DMXvalue;
//
/*
setup ARDUINO
*/

void setup () {
  
  Serial.begin(9600);                            //impostazione porta seriale
   DmxSimple.usePin(9);
    DmxSimple.maxChannel(4);
    
  pinMode (buttonUpPin, INPUT);                  //impostazione buttonUpPin come ingresso
  pinMode (buttonDownPin, INPUT);                //impostazione buttonDownPin come ingresso

}

/*
LOOP
*/

void loop() {
  
  int readingUp = digitalRead(buttonUpPin);                           //Lettura ingresso digitale del pulsante di UP
  int readingDown = digitalRead(buttonDownPin);                       //Lettura ingresso digitale del pulsante di Down
  
 
  if (readingUp == HIGH) {                                            //Se l' ingresso buttonUpPin è HIGH per un tempo maggiore di debounceDelay lo stato logico di buttonUpState è HIGH altrimenti è LOW 
    if((millis() - UpDebounceTime) > debounceDelay) {
      buttonUpState = HIGH;                                
    }
  }else{
      buttonUpState = LOW;
      UpDebounceTime = millis();  
  }
  
  if (readingDown == HIGH) {                                            //Se l' ingresso buttonDownPin è HIGH per un tempo maggiore di debounceDelay lo stato logico di buttonDownState è HIGH altrimenti è LOW 
    if((millis() - DownDebounceTime) > debounceDelay) {
      buttonDownState = HIGH;                                
    }
  }else{
      buttonDownState = LOW;
      DownDebounceTime = millis();  
  }


  switch (buttonUpState) {
    
    case HIGH:
      if (buttonUpPressed == LOW || repeatUp == HIGH) {
        pippo = pippo + addUp;                                        //inrementazione della variabile del fattore addUp
        if (pippo > pippoMax) {                                       //controllo limite della variabile
          pippo = pippoMax;
        }
        buttonUpPressed = HIGH;                                       //attivazione memoria di pulsante premuto
        repeatUp = LOW;                                               //disattivazione memoria di repeat
        Serial.println(pippo);                                        //Scrittura sulla seriale della varibile
      }else{
        if ((millis() - buttonUpPressedTime) > pressedDelay) {        //con memoria di pulsante premuto dopo il tempo di timeRepeatEnable si entra nella funzione repeat
          repeatUp = HIGH;                                            //attivazione memoria di repeat
          pressedDelay = timeRepeat;                                  //sostituzione di timeRepeatEnable con timeRepeat
          buttonUpPressedTime = millis();                             //aggiornamento buttonUpPressedTime
          repeatUpTime = millis() - lastRepeatUpTime;                 //calcolo da quanto tempo è attivo il repeat
          if (repeatUpTime > 1000 && repeatUpTime < 5000) {           //gestione fattore addUp in base alla durata del repeat attivo
            addUp = 10;
          }else if (repeatUpTime > 5000) {
            addUp = 100;
          }
        }
      }
      break;
    
    case LOW:                                                         //ripristino delle varibili del pulsante di UP allo stato iniziale
      buttonUpPressed = LOW;
      repeatUp = LOW;
      pressedDelay = timeRepeatEnable;
      buttonUpPressedTime = millis();
      repeatUpTime = 0;
      lastRepeatUpTime = millis();
      addUp = 1;
      break;
      
  }

switch (buttonDownState) {
    
    case HIGH:
      if (buttonDownPressed == LOW || repeatDown == HIGH) {
        pippo = pippo - addDown;                                      //decrementazione della variabile del fattore addDown
        if (pippo < pippoMin) {                                       //controllo limite della variabile
          pippo = pippoMin;
        }
        buttonDownPressed = HIGH;                                     //attivazione memoria di pulsante premuto
        repeatDown = LOW;                                             //disattivazione memoria di repeat
        Serial.println(pippo);                                        //Scrittura sulla seriale della varibile
      }else{
        if ((millis() - buttonDownPressedTime) > pressedDelay) {      //con memoria di pulsante premuto dopo il tempo di timeRepeatEnable si entra nella funzione repeat
          repeatDown = HIGH;                                          //attivazione memoria di repeat
          pressedDelay = timeRepeat;                                  //sostituzione di timeRepeatEnable con timeRepeat
          buttonDownPressedTime = millis();                           //aggiornamento buttonDownPressedTime
          repeatDownTime = millis() - lastRepeatDownTime;             //calcolo da quanto tempo è attivo il repeat
          if (repeatDownTime > 1000 && repeatDownTime < 5000) {       //gestione fattore addDown in base alla durata del repeat attivo
            addDown = 10;
          }else if (repeatDownTime > 5000) {
            addDown = 100;
          }
        }
      }
      break;
    
    case LOW:                                                         //ripristino delle varibili del pulsante di Down allo stato iniziale
      buttonDownPressed = LOW;
      repeatDown = LOW;
      pressedDelay = timeRepeatEnable;
      buttonDownPressedTime = millis();
      repeatDownTime = 0;
      lastRepeatDownTime = millis();
      addDown = 1;
      break;
      
  }

 int dmxchannel= (pippo);
   
  Serial.println(dmxchannel);
ChDMX=(dmxchannel); 
 pot1=analogRead(A1);             
DMXvalue=map(pot1,0,1023,1,255);   
Serial.println(DMXvalue); 
DmxSimple.write(ChDMX, DMXvalue);
    
    /* Small delay to slow down the ramping */
    delay(100);


}

Questo sketch funziona perfettamente con l’IDE0022, ma con l’IDE 1.xx boh tutta una serie di errori. Immagino sia perché la libreria è obsoleta…

Quindi vedo due soluzioni, o uso l’lcd con IDE0022 oppure sistemo la libreria per l’IDE 1.00…

C’è un sistema semplice per usare un lcd con l’ode 0022?

Ho appena provato e ...
... se tu dall'inizio avessi messo qui (copia/incolla) quelli che definisci "una serie di errori" e che sono fondamentali per capire il problema ... avresti già avuto la soluzione ... ]:smiley:

Apri il file DmxSimple.cpp della libreria e modifica la riga 11 sostituendo la

#include "wiring.h"

con

#include "Arduino.h"

... tutto qui :smiley:

Guglielmo

Guglielmo, porta pazienza per la mia grande ignoranza.

Ho scaricato la libreria Arduino.h
Ho modificato la libreria come mi hai consigliato
Adesso visualizzo i seguenti errori:

/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp:11:10: error: #include expects "FILENAME" or <FILENAME>
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp: In function 'void dmxBegin()':
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp:57: error: 'digitalPinToPort' was not declared in this scope
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp:57: error: 'portOutputRegister' was not declared in this scope
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp:58: error: 'digitalPinToBitMask' was not declared in this scope
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp:61: error: 'OUTPUT' was not declared in this scope
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp:61: error: 'pinMode' was not declared in this scope
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp: In function 'void dmxWrite(int, uint8_t)':
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp:183: error: 'max' was not declared in this scope
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp: In function 'void dmxMaxChannel(int)':
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp:194: error: 'min' was not declared in this scope

Cosa sbaglio?

Link alla libreria?
Hai controllato se l'autore ne ha creata una più recente?

EDIT: Vedi qui --> DmxSimple Arduino Library, controlling DMX lighting dimmers from Teensy++
Il Tensy 2.0 usa il 32U4 quindi è compatibile con la Leonardo, non so se vada con la UNO.

E' quella che sto usando io... e funziona solo con l'IDE 0022...

Non riesco a trovare neanche una libreria serial lcd per l'IDE 0022...

gelholder:
Guglielmo, porta pazienza per la mia grande ignoranza.

Ho scaricato la libreria Arduino.h
Ho modificato la libreria come mi hai consigliato
Adesso visualizzo i seguenti errori:

Scaricato Arduino.h ??????? :astonished: :astonished: :astonished: :astonished:

E chi ti ha detto di farlo ????? Ti ho solo detto di andare nella libreria che dovresti aver scaricato, QUESTA, e modificare il contenuto di UN file, null'altro !!!

Butta via quell'Arduino.h che hai scaricato, il file che serve fa parte di Arduino e NON lo devi scaricare.

Tu dovresti avere la cartella "DmxSimple", che dovresti aver messo nella tua cartella dove sono tutte le librerie, apri questa cartella ed edita il file "DmxSimple.cpp" ... alla riga 11, nel file originale c'è scritto :

#include "wiring.h"

tu devi SOLO correggere questa riga eliminando wiring e mettendo Arduino :

#include "Arduino.h"

L'ho appena fatto ed ho compilato, senza problemi, uno degli esempi ... :smiley:

Guglielmo

Dal link indicato precedentemente ho scaricato e installato la DMXSample.new. Ho compilato l'esempio SerialtoDMX su IDE 1.0.5 e compila anche per Arduino UNO.

Dimensione del file binario dello sketch: 2.974 bytes (su un massimo di 32.256 bytes)

Premetto che sto usando un mac…

Che ve devo dì… a me non funziona.

Avevo scaricato la lib Arduino.h in quanto continuavo ad aver errori e credevo che il motivo fosse la mancanza della lib.

Sto provando con IDE 1.0.5

Questa è la lib DmxSimple nella quale ho fatto la modifica che mi hai consigliato usando TexEdit

/**
 * DmxSimple - A simple interface to DMX.
 *
 * Copyright (c) 2008-2009 Peter Knight, Tinker.it! All rights reserved.
 */
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "pins_arduino.h"

#include “Arduino.h”
#include "DmxSimple.h"

/** dmxBuffer contains a software copy of all the DMX channels.
  */
volatile uint8_t dmxBuffer[DMX_SIZE];
static uint16_t dmxMax = 16; /* Default to sending the first 16 channels */
static uint8_t dmxStarted = 0;
static uint16_t dmxState = 0;

static volatile uint8_t *dmxPort;
static uint8_t dmxBit = 0;
static uint8_t dmxPin = 3; // Defaults to output on pin 3 to support Tinker.it! DMX shield

void dmxBegin();
void dmxEnd();
void dmxSendByte(volatile uint8_t);
void dmxWrite(int,uint8_t);
void dmxMaxChannel(int);

/* TIMER2 has a different register mapping on the ATmega8.
 * The modern chips (168, 328P, 1280) use identical mappings.
 */
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega168P__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega1280__)
#define TIMER2_INTERRUPT_ENABLE() TIMSK2 |= _BV(TOIE2)
#define TIMER2_INTERRUPT_DISABLE() TIMSK2 &= ~_BV(TOIE2)
#elif defined(__AVR_ATmega8__)
#define TIMER2_INTERRUPT_ENABLE() TIMSK |= _BV(TOIE2)
#define TIMER2_INTERRUPT_DISABLE() TIMSK &= ~_BV(TOIE2)
#else
#define TIMER2_INTERRUPT_ENABLE()
#define TIMER2_INTERRUPT_DISABLE()
/* Produce an appropriate message to aid error reporting on nonstandard
 * platforms such as Teensy.
 */
#warning "DmxSimple does not support this CPU"
#endif


/** Initialise the DMX engine
 */
void dmxBegin()
{
  dmxStarted = 1;

  // Set up port pointers for interrupt routine
  dmxPort = portOutputRegister(digitalPinToPort(dmxPin));
  dmxBit = digitalPinToBitMask(dmxPin);

  // Set DMX pin to output
  pinMode(dmxPin,OUTPUT);

  // Initialise DMX frame interrupt
  //
  // Presume Arduino has already set Timer2 to 64 prescaler,
  // Phase correct PWM mode
  // So the overflow triggers every 64*510 clock cycles
  // Which is 510 DMX bit periods at 16MHz,
  //          255 DMX bit periods at 8MHz,
  //          637 DMX bit periods at 20MHz
  TIMER2_INTERRUPT_ENABLE();
}

/** Stop the DMX engine
 * Turns off the DMX interrupt routine
 */
void dmxEnd()
{
  TIMER2_INTERRUPT_DISABLE();
  dmxStarted = 0;
  dmxMax = 0;
}

/** Transmit a complete DMX byte
 * We have no serial port for DMX, so everything is timed using an exact
 * number of instruction cycles.
 *
 * Really suggest you don't touch this function.
 */
void dmxSendByte(volatile uint8_t value)
{
  uint8_t bitCount, delCount;
  __asm__ volatile (
    "cli\n"
    "ld __tmp_reg__,%a[dmxPort]\n"
    "and __tmp_reg__,%[outMask]\n"
    "st %a[dmxPort],__tmp_reg__\n"
    "ldi %[bitCount],11\n" // 11 bit intervals per transmitted byte
    "rjmp bitLoop%=\n"     // Delay 2 clock cycles. 
  "bitLoop%=:\n"\
    "ldi %[delCount],%[delCountVal]\n"
  "delLoop%=:\n"
    "nop\n"
    "dec %[delCount]\n"
    "brne delLoop%=\n"
    "ld __tmp_reg__,%a[dmxPort]\n"
    "and __tmp_reg__,%[outMask]\n"
    "sec\n"
    "ror %[value]\n"
    "brcc sendzero%=\n"
    "or __tmp_reg__,%[outBit]\n"
  "sendzero%=:\n"
    "st %a[dmxPort],__tmp_reg__\n"
    "dec %[bitCount]\n"
    "brne bitLoop%=\n"
    "sei\n"
    :
      [bitCount] "=&d" (bitCount),
      [delCount] "=&d" (delCount)
    :
      [dmxPort] "e" (dmxPort),
      [outMask] "r" (~dmxBit),
      [outBit] "r" (dmxBit),
      [delCountVal] "M" (F_CPU/1000000-3),
      [value] "r" (value)
  );
}

/** DmxSimple interrupt routine
 * Transmit a chunk of DMX signal every timer overflow event.
 * 
 * The full DMX transmission takes too long, but some aspects of DMX timing
 * are flexible. This routine chunks the DMX signal, only sending as much as
 * it's time budget will allow.
 *
 * This interrupt routine runs with interrupts enabled most of the time.
 * With extremely heavy interrupt loads, it could conceivably interrupt its
 * own routine, so the TIMER2 interrupt is disabled for the duration of
 * the service routine.
 */
ISR(TIMER2_OVF_vect,ISR_NOBLOCK) {

  // Prevent this interrupt running recursively
  TIMER2_INTERRUPT_DISABLE();

  uint16_t bitsLeft = F_CPU / 31372; // DMX Bit periods per timer tick
  bitsLeft >>=2; // 25% CPU usage
  while (1) {
    if (dmxState == 0) {
      // Next thing to send is reset pulse and start code
      // which takes 35 bit periods
      uint8_t i;
      if (bitsLeft < 35) break;
      bitsLeft-=35;
      *dmxPort &= ~dmxBit;
      for (i=0; i<11; i++) _delay_us(8);
      *dmxPort |= dmxBit;
      _delay_us(8);
      dmxSendByte(0);
    } else {
      // Now send a channel which takes 11 bit periods
      if (bitsLeft < 11) break;
      bitsLeft-=11;
      dmxSendByte(dmxBuffer[dmxState-1]);
    }
    // Successfully completed that stage - move state machine forward
    dmxState++;
    if (dmxState > dmxMax) {
      dmxState = 0; // Send next frame
      break;
    }
  }
  
  // Enable interrupts for the next transmission chunk
  TIMER2_INTERRUPT_ENABLE();
}

void dmxWrite(int channel, uint8_t value) {
  if (!dmxStarted) dmxBegin();
  if ((channel > 0) && (channel <= DMX_SIZE)) {
    if (value<0) value=0;
    if (value>255) value=255;
    dmxMax = max((unsigned)channel, dmxMax);
    dmxBuffer[channel-1] = value;
  }
}

void dmxMaxChannel(int channel) {
  if (channel <=0) {
    // End DMX transmission
    dmxEnd();
    dmxMax = 0;
  } else {
    dmxMax = min(channel, DMX_SIZE);
    if (!dmxStarted) dmxBegin();
  }
}


/* C++ wrapper */


/** Set output pin
 * @param pin Output digital pin to use
 */
void DmxSimpleClass::usePin(uint8_t pin) {
  dmxPin = pin;
  if (dmxStarted && (pin != dmxPin)) {
    dmxEnd();
    dmxBegin();
  }
}

/** Set DMX maximum channel
 * @param channel The highest DMX channel to use
 */
void DmxSimpleClass::maxChannel(int channel) {
  dmxMaxChannel(channel);
}

/** Write to a DMX channel
 * @param address DMX address in the range 1 - 512
 */
void DmxSimpleClass::write(int address, uint8_t value)
{
	dmxWrite(address, value);
}
DmxSimpleClass DmxSimple;

Questo è lo sketch di prova:

#include <DmxSimple.h>

void setup() {
  /* The most common pin for DMX output is pin 3, which DmxSimple
  ** uses by default. If you need to change that, do it here. */
  DmxSimple.usePin(3);

  /* DMX devices typically need to receive a complete set of channels
  ** even if you only need to adjust the first channel. You can
  ** easily change the number of channels sent here. If you don't
  ** do this, DmxSimple will set the maximum channel number to the
  ** highest channel you DmxSimple.write() to. */
  DmxSimple.maxChannel(4);
}

void loop() {
  int brightness;
  /* Simple loop to ramp up brightness */
  for (brightness = 0; brightness <= 255; brightness++) {
    
    /* Update DMX channel 1 to new brightness */
    DmxSimple.write(1, brightness);
    
    /* Small delay to slow down the ramping */
    delay(10);
  }
}

e questi sono i messaggi di errore che mio appaiono facendo al Verifica:

/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp:11:10: error: #include expects "FILENAME" or <FILENAME>
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp: In function 'void dmxBegin()':
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp:57: error: 'digitalPinToPort' was not declared in this scope
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp:57: error: 'portOutputRegister' was not declared in this scope
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp:58: error: 'digitalPinToBitMask' was not declared in this scope
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp:61: error: 'OUTPUT' was not declared in this scope
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp:61: error: 'pinMode' was not declared in this scope
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp: In function 'void dmxWrite(int, uint8_t)':
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp:183: error: 'max' was not declared in this scope
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp: In function 'void dmxMaxChannel(int)':
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp:194: error: 'min' was not declared in this scope

Cancella la cartella DmxSimple dentro Document/Arduino/Libraries.
Scarica questo --> http://www.pjrc.com/teensy/arduino_libraries/DmxSimple.new.zip
Estrai nella cartella Document/Arduino/Libraries

Compilando il tuo esempio con IDE 1.0.5 per Arduino UNO esce

Dimensione del file binario dello sketch: 1.622 bytes (su un massimo di 32.256 bytes)

Se ti da errori cancella la cartella dell'IDE e riscaricalo. Non devi modificare nessun file dell'IDE di Arduino.

Gpb usa il MAC, io Windows, lui ti potrebbe dare una conferma sulla compilazione.

No Paolo, non c'entra nulla ...
... a me il suo codice, SU MAC, lo compila tranquillamente !

E' che ha proprio sbagliato a installare la libreria .... :roll_eyes:

Guglielmo

@ gelholder : Su Mac dovresti avere una cartella ~/Documents/Arduino/libraries/ ... è in questa cartella che devi mettere la cartella "DmxSimple" che estrai dallo zip che ho linkato, così come è in questa cartella che devi mettere TUTTE le cartelle delle librerie che userai ...

Se così non ti funziona ...
... cancella Arduino.app e scaricalo di nuovo ... perché, ripeto, a me su Mac, il tuo esempio lo compila tranquillamente.

Guglielmo

Sono demoralizzato… non va!
Ho cancellato tutto, scaricato Arduino IDE 1.5.5 e ritorno ad avere i soliti errori:

/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp:11:10: error: #include expects "FILENAME" or <FILENAME>
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp: In function 'void dmxBegin()':
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp:57: error: 'digitalPinToPort' was not declared in this scope
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp:57: error: 'portOutputRegister' was not declared in this scope
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp:58: error: 'digitalPinToBitMask' was not declared in this scope
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp:61: error: 'OUTPUT' was not declared in this scope
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp:61: error: 'pinMode' was not declared in this scope
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp: In function 'void dmxWrite(int, uint8_t)':
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp:183: error: 'max' was not declared in this scope
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp: In function 'void dmxMaxChannel(int)':
/Users/ISS/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp:194: error: 'min' was not declared in this scope

Aaarrrggg ... ho visto ora che hai usato TextEdit ... quello è un editor RTF e mette dentro al codice un sacco di caratteri sporchi che tu non vedi ma che il compilatore sente !!!

Devi ripartire dalla libreria pulita, scaricata da Internet (ormai quella che hai è rovinata) e devi usare qualche cosa come ... TextWrangler (... è gratis su AppStore) .. che è un vero editor di testo puro (TXT) !

Guglielmo

FUNZIONA!!!

Che dire! Sei un asso!

GRAZIE

:grin: :grin: :grin: ... no, è solo che una volta ... ho commesso anche io l'errore di usare TextEdit su Mac ...
... e ho dovuto riscrivere a manina svariate linee di codice che mi aveva mandato a ... "donnine di facili costumi" ... XD XD XD

Guglielmo

:smiley:

Grazie ancora.