Domanda:
Come posso adattare la libreria DallasTemperature per accettare un'altra classe 1-Wire?
Cybergibbons
2014-02-20 20:15:29 UTC
view on stackexchange narkive permalink

Una libreria comunemente usata è la libreria DallasTemperature, utilizzata per accedere ai sensori DS18B20 su un bus 1-Wire. Quando crei un oggetto DallasTemperature, passi un riferimento a un oggetto OneWire. OneWire può creare un bus 1-Wire praticamente su qualsiasi porta di un Arduino.

Un esempio di questo è così:

  // Configura un'istanza oneWire per comunicare con qualsiasi dispositivo OneWire (non solo IC di temperatura Maxim / Dallas) OneWire oneWire (ONE_WIRE_BUS); // Passa il nostro riferimento oneWire ai sensori Dallas Temperature.DallasTemperature (&oneWire);  

Tuttavia, ci sono alcuni problemi con l'utilizzo di OneWire per guidare un bus 1-Wire, principalmente per guidare lunghezze di bus più lunghe, gestire cortocircuiti e altri errori.

Esiste un chip comunemente disponibile chiamato DS2482-100 che può pilotare bus più lunghi (centinaia di piedi), gestire cortocircuiti e altri errori. È anche meno pesante della CPU e si occupa di una serie di aspetti più lenti di 1-Wire.

Per questo motivo, vorrei essere in grado di passare un riferimento a una libreria che ho creato invece . Attualmente, lo sto facendo:

  • Chiamando la libreria OneWire
  • Replicando tutti i metodi chiamati dalla libreria DallasTemperature
  • Sostituendo la libreria OneWire per il mio

Questo è relativamente complicato. Idealmente vorrei poter passare un riferimento alla mia libreria o una libreria 1-Wire, in modo che le persone possano scegliere quale interfaccia utilizzare.

Come dovrei fare per farlo?

Questo potrebbe essere abbastanza C ++ e più appropriato per StackOverflow. Ma, a difesa di questa domanda, questa è una libreria hardware / Arduino molto specifica e, nel tentativo di risolverla, mi sono imbattuto in altri problemi (http://arduino.stackexchange.com/questions/322/why- do-i-need-to-include-libraries-used-in-other-libraries) che sembrano specifici per l'ambiente Arduino.
Cosa intendi con "ci sono alcuni problemi con l'utilizzo di OneWire in questo modo"? Come dovrebbe quindi essere utilizzato effettivamente? Trovo difficile capire come il modo per istanziare un oggetto come nel tuo codice cn abbia un impatto negativo come descrivi.
Chiarito nella domanda originale.
Non puoi semplicemente usare esclusivamente la libreria DallasTemperature?
Due risposte:
jfpoilpret
2014-02-21 02:51:31 UTC
view on stackexchange narkive permalink

Il modo tipico per ottenere ciò che desideri normalmente sarebbe creare la tua sottoclasse della classe OneWire e sostituire i metodi necessari cambia, quindi passa un puntatore a un'istanza della tua classe al costruttore DallasTemperature .

Tuttavia, affinché funzioni, la classe OneWire deve avere è stato sviluppato pensando all'estensibilità (sottoclasse), ovvero utilizza metodi virtuali che puoi sovrascrivere.

Sfortunatamente, una rapida occhiata a OneWire.h mostra che nessun metodo è virtuale lì dentro.

Quindi questo significa che alla fine dovrai eseguire alcuni hack, proprio come fai ora.

Quello che potresti potenzialmente fare (è ancora un trucco, ma forse un po 'meno sporco) è:

  • sostituire OneWire.h per rendere virtuali tutti i metodi (almeno quelli che devi sovrascrivere)
  • mantieni l'originale OneWire.cpp che dovrebbe comunque essere compilato con il file di intestazione appena adattato
  • crea una nuova sottoclasse MyOneWire.h / MyOneWire.cpp per definire la tua sottoclasse OneWire che sovrascrive tutti i metodi necessari come desideri

Quindi puoi passare un'istanza OneWire o MyOneWire al costruttore DallasTemperature .

NB: quando vedo la mia risposta, questo mi fa pensare che la tua domanda sia più una domanda generale in C ++ che una relativa ad Arduino.

Grazie. Penso che il tuo hack sia più pulito e non implichi lo spostamento di file dentro e fuori dalla cartella della libreria. Sto arrivando alla conclusione che gli aspetti C ++ di Arduino non sono realmente utilizzati con grande effetto. Grazie per l'ottima risposta, la lascerò comunque aperta per un po '.
Vorrei aggiungere un punto alla difesa degli autori della libreria OneWire: può esserci un motivo per non utilizzare metodi virtuali in una classe: prestazioni delle chiamate ai metodi e dimensione del codice. Non ho ancora provato a misurare tale impatto su Arduino (su un PC questo è ovviamente trascurabile e impercettibile).
Mikael Patel
2015-12-04 13:26:32 UTC
view on stackexchange narkive permalink

Il DS2482-100 è un dispositivo bridge I2C-to-1-Wire® che si interfaccia direttamente a master I2C standard (max 100 kHz) o veloci (max 400 kHz) per eseguire la conversione bidirezionale del protocollo tra il master I2C e qualsiasi dispositivi slave 1-Wire downstream.

Utilizza un protocollo di livello superiore su I2C che non corrisponde direttamente all'interfaccia OneWire bit-bang sopra.

Una possibile soluzione è riutilizzare "solo" l'interfaccia di OneWire e reimplementarla. La sottoclasse non funzionerà poiché le funzioni membro non sono virtuali. Sfortunatamente questo non funzionerà direttamente a causa di errori di gestione, tempistica, ecc. Anche la classe DallasTemperature dovrà essere modificata.

Si prega di consultare la descrizione del prodotto DS2482-100 e il protocollo.

Per raggiungere il tuo obiettivo di consentire 1-Wire bit-bang o basato su DS2482-100 master richiederebbe 1) un'interfaccia astratta (classe) utilizzata dai driver di dispositivo master 1-Wire, 2) sottoclassi per ciascuna variante del master di implementazione.

Poiché il protocollo 1-Wire ha un numero di comandi comuni, un modello di delega è più utile. Vedere i driver dei dispositivi Cosa OWI :: Driver e DS18B20 per un esempio del modello di delega.



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...