31
Vos projets / Re : Impulsion temporisée avec Attiny 85
« le: octobre 07, 2020, 09:18:33 pm »
La code du monostable était destiné à un Arduino Uno. Je le présentais juste à titre d'exemple et il doit être adapté pour un Attiny85. 

Le forum LOCODUINO est consacré aux discussions ayant trait à l'utilisation de l'Arduino dans les automatismes et les animations pour le train miniature. Nous avons eu récemment quelques inscriptions de personnes ayant des projets plus généraux mais surtout inapplicables au train miniature. Si votre projet ou vos questions ne concernent pas le modélisme ferroviaire, ne vous inscrivez pas, vous perdriez votre temps et nous aussi.
Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.
const byte led = 13;
const byte button = 2;
unsigned long interval = 10000;
unsigned long startTime;
byte lastPress;
void setup()
{
pinMode(led, OUTPUT);
pinMode(button, INPUT_PULLUP);
Serial.begin (9600);
}
void loop()
{
byte pressed = digitalRead(button);
Serial.print("pressed = ");
Serial.println(pressed);
if (pressed)
{
if (pressed != lastPress)
{
digitalWrite(led, HIGH);
startTime = millis();
}
}
lastPress = pressed;
if (digitalRead(led))
{
if (millis() - startTime >= interval)
{
digitalWrite(led, LOW);
}
}
}
/* monostable redeclenchable
* à l'arret le capteur est ouvert,
* la pin2 est à la masse via la résistance,la led est éteinte.
* lorsque le train roule le capteur se ferme , la led s'allume.
* si le train s'arrete la led reste allumée durant la tempo.
*
*
* ATTINY85 VCC
* |
* 5 =|1 U 8|= VCC Capteur
* 3 =|2 7|= 2------|
* 4 =|3 6|= 1 |
* GND =|4 5|= 0 R (10-100K)
* |
* GND
*/
const byte led = 3;
const byte capteur = 2;
unsigned long interval = 10000; //valeur en ms à adapter selon besoin
unsigned long startTime;
byte lastPress;
void setup()
{
pinMode(led, OUTPUT);
pinMode(capteur, INPUT);
}
void loop()
{
byte pressed = digitalRead(capteur);
if (pressed)
{
if (pressed != lastPress)
{
digitalWrite(led, HIGH);
startTime = millis();
}
}
lastPress = pressed;
if (digitalRead(led))
{
if (millis() - startTime >= interval)
{
digitalWrite(led, LOW);
}
}
}
/*attiny-decodeur accessoires
* lien: https://rudysarduinoprojects.wordpress.com/2019/05/06/fun-with-arduino-29-dcc-accessory-decoder/
Brochage Attiny85
*
* 5 =|1 U 8|= VCC
* A3 3 =|2 7|= 2 entrée signal DCC
* A2 4 =|3 6|= 1 sortie pour adresse 11
* GND =|4 5|= 0 sortie pour adresse 10
*
*/
#define NUMACCESSORIES 2 // Entrez ici le nombre d'accessoires (max 4)
// ALLER AU setup() POUR CONFIGURER DCC ADDRESSES AND PIN NUMBERS
#include <DCC_Decoder.h>
#define kDCC_INTERRUPT 0
typedef struct DCCAccessoryData {
int address; // Adresse DCC configurable par l'utilisateur
byte outputpin; // Pin Attiny configurable par l'utilisateur
byte dccstate; // Utilisation interne Etat DCC de l'accessoire, 1 = ON, 0 = OFF
};
DCCAccessoryData accessory[NUMACCESSORIES];
// La bibliothèque DCC appelle cette fonction pour activer/désactiver les accessoires.
void BasicAccDecoderPacket_Handler(int address, boolean activate, byte data) {
address -= 1;
address *= 4;
address += 1;
address += (data & 0x06) >> 1;
//address = address - 4; // !!! uncomment cette ligne pour les multi maus Roco ou z21
boolean enable = (data & 0x01) ? 1 : 0;
for (byte i=0; i<NUMACCESSORIES; i++) {
if (address == accessory[i].address) {
if (enable) accessory[i].dccstate = 1;
else accessory[i].dccstate = 0;
}
}
}
void setup() {
// CONFIGURATION DES ACCESSOIRES
// Copier et coller autant de fois que vous avez d'accessoires
// la quantité doit être la même que celle définie dans NUMACCESSORIES
// ne pas oublier d'incrémenter l'index du tableau
accessory[0].address = 10; // adresse DCC
accessory[0].outputpin = 0; // pin Attiny
accessory[1].address = 11; // adresse DCC
accessory[1].outputpin = 1; // pin Attiny
// FIN DE LA CONFIGURATION DES ACCESSOIRES
DCC.SetBasicAccessoryDecoderPacketHandler(BasicAccDecoderPacket_Handler, true);
DCC.SetupDecoder( 0x00, 0x00, 0 );
// les pins sont définiées en sortie et au niveau 0
for(byte i=0; i<NUMACCESSORIES; i++) {
pinMode (accessory[i].outputpin, OUTPUT);
digitalWrite(accessory[i].outputpin, LOW);
}
}
void loop() {
DCC.loop(); // Appel de la fonction de bibliothèque qui lit les données DCC
for(byte i=0; i<NUMACCESSORIES; i++) {
if (accessory[i].dccstate)
digitalWrite(accessory[i].outputpin, HIGH);
else
digitalWrite(accessory[i].outputpin, LOW);
}
}
bien évidemment si quelqu'un a une idée, je suis preneur.