Re: 2 Schieberegister 74HC595 Anschließen

Hallo,

ich habe auch ein kleines Prolem.
ich habe einen Sketch, wobei 20 Taster abgefragt werden sollen (zT ferig).
Die Taster werden über widerstände in Reihe abgefragt, was auch super funktioniert. Anschliessend wird ein Befehl über funk gesendet. auch das funktioniert.
Nun soll allerdings beim betätigen eines Tasters die zugehörige LED leuchten. Die Taster sind paarweise angeordnet. wird nun der gegenüberliegende Taster gedrückt, soll diese LED angehen und die gegenüberliegende aus. Aller anderen LEDs sollen ihren Status (an oder aus) beibehalten.
Ich habe versucht es mit 4 Schieberegistern zu lösen. allerdings scheitert es schon am verständnis.
Wenn ich 4 Blöcke als Binärzahl senden würde, sollte dies funktionieren. allerdings ist die frage, wie ändere ich die Binärblöcke byte Block1 = b00000000; in byte Block1 = b00000001; oder byte Block1 = b00101001; ?

Selbst das senden einzelner bits funktioniert irgendwie nicht…

Theoretisch wäre es am einfachsten beim Tastendruck das jeweilige bit zu ändern und die Blöcke zu senden.
Hab da irgendwie ne blokade im denken.

#include <DHT.h>
#include <VirtualWire.h>
#undef int
#undef abs
#undef double
#undef float
#undef round

#include <Wire.h>
#include <NewRemoteTransmitter.h>
#include <RCSwitch.h>
#include <NewRemoteReceiver.h>
#include <DS1302.h>
#define DHTPIN 3
#define DHTTYPE DHT22
DHT dht(3, DHT22);
RCSwitch mySwitch = RCSwitch();
DS1302 rtc(2, 4, 6); //2=RST 4=DAT 6=CLK VCC=5V GND=GND
Time t;


// PIN  D5 Sender 433, D3 Temperatur, 


boolean toggleLed                 =  false;
int secon             =  0;            // Sekunden für den Start einstellen
int minut             =  0;            // Minuten
int hou               =  0;            // Stunden
int a = 2 ; 
int b = 0 ;
int shiftPin = 8;
// Arduino-Pin verbunden mit ST_CP des 74HC595
int storePin = 9;
// Arduino-Pin verbunden mit DS des 74HC595
int dataPin = 10;
 byte bitsToSend = 0;
// _________________________________

unsigned long address = 0;
String cmd;
int num;
//char inByte;
int intervall= 60000; // Messintervall Temp
int taster = A1;
int taster2 = A2;
int taster3 = A3; // Taster über 1 KOhm anschließen
int tasterStatus = LOW;           // aktuelles Signal vom Eingangspin
int tasterGedrueckt = 0;          // abfragen ob Taster gedrückt war

int entprellZeit = 20;           // Zeit für Entprellung, anpassen!

unsigned long tasterZeit = 0;     // Zeit beim drücken des Tasters

byte pin = 5;                   // Sender Rollos Pin 5  Empfäger Pin 2
unsigned int periodusec = 263;
byte r;

int l;

float tem ;
float hum ;

void setup() {
 // Pins 8,9,10 auf Ausgabe
 pinMode(storePin, OUTPUT);
 pinMode(shiftPin, OUTPUT);
 pinMode(dataPin, OUTPUT);

  dht.begin();
  rtc.halt(false);
  Serial.begin(19200);


  /*rtc.writeProtect(false);
     rtc.setDOW(WEDNESDAY);
     rtc.setTime(20, 37, 30);
     rtc.setDate(11, 7, 2018);*/

  pinMode(7, OUTPUT);              // Pin auf Output setzen
  pinMode(8, OUTPUT);              // Pin auf Output setzen
  pinMode(9, OUTPUT);               // Pin auf Output setzen
  
 
  // Wir ziehen den RegisterClockPin auf High, somit wird das Register an Output kopiert ...
  // ... und die LEDs leuchten entsprechend unserem binOutput[]-Muster


  pinMode(taster, INPUT);
  digitalWrite(taster, HIGH);
  pinMode(LED_BUILTIN, OUTPUT);

}
void loop() {
  // storePin sicherheitshalber auf LOW
 digitalWrite(storePin, LOW); 
// shift out highbyte

// shift out lowbyte

 // Wenn alle 8 Stellen im Register sind, jetzt das StorePin STCP
 // von LOW auf HIGH, damit wird Registerinhalt an Ausgabepins
 // kopiert und der Zustand an den LEDs sichtbar
 
 digitalWrite(storePin, HIGH);
 
 hum = dht.readHumidity();
 tem = dht.readTemperature()-3.2;
 // wetter();
  // Uhr _____________________________________________
  t = rtc.getTime();
  secon = t.sec, DEC;            // Sekunden für den Start einstellen
  minut = t.min, DEC;            // Minuten
  hou   = t.hour, DEC;           // Stunden


  if (hou < 10) {
    Serial.print("0");
  }
  Serial.print(hou);
  Serial.print(":");
  if (minut < 10) {
    Serial.print("0");
  }
  Serial.print(minut);
  Serial.print(":");
  if (secon < 10) {
    Serial.print("0");
  }
  Serial.print(secon);
  Serial.print("  ");
  Serial.print(rtc.getDOWStr());
  Serial.print(" ");
  Serial.print(t.date, DEC);
  Serial.print(".");

  Serial.print(rtc.getMonthStr());
  Serial.print(".");
  Serial.print(t.year, DEC);
  Serial.print("   ");
  Serial.print(tasterStatus);
  Serial.print("  Temp ");
  Serial.print(tem);
  Serial.print(" °C  ");
  Serial.print(" Hydro  ");
  Serial.print(hum);
  Serial.println(" %  ");






  // Empfäger später von nodeMCU


  // Tasterabfrage

  tasterStatus = analogRead(taster);
  if (tasterStatus > 100 )
  {
    tasterZeit = millis();      // aktualisiere tasterZeit
    // speichert, dass Taster gedrückt wurde

    if (millis() - tasterZeit > entprellZeit)
    { tasterGedrueckt = (millis() - tasterZeit) ;
      if (tasterGedrueckt >= 4000) {
        ( r = 4);
      }
      else (r = 1);
    }

    if (tasterStatus >= 110 && tasterStatus <= 120) {
      ( a = 0) ; sender1() ;// sender1 hoch
    }
    if (tasterStatus >= 120  && tasterStatus <= 145) {
      ( a = 1) ;  sender1(); } //sender1 runter

       if (tasterStatus >= 215 && tasterStatus <= 265) {
      ( a = 0) ; sender2() ;// sender2 hoch
    }
    if (tasterStatus >= 370  && tasterStatus <= 465) {
      ( a = 1) ;  sender2(); } // sender2 runter
       if (tasterStatus >= 540 && tasterStatus <= 650) {
      ( a = 0) ; sender3() ;// sender3 hoch
    }
    if (tasterStatus >= 670  && tasterStatus <= 820) {
      ( a = 1) ;  sender3(); }// sender3 runter
  }
}
// weitere werte für Taster A0





void sender1() {
  address = 50949726  ;
  NewRemoteTransmitter transmitter(address, 5, 263, r );
  transmitter.sendUnit(0, a) ; delay(20); ( r = 1) ; (a = 2); 
  if ( a == 0 ) { int bitToSet = 1 - 48; registerWrite(bitToSet, HIGH);// int bitToSet = 2 - 48; registerWrite(bitToSet, LOW);
  }
    if ( a == 1 ) {int bitToSet = 1 - 48; registerWrite(bitToSet, LOW);//int bitToSet = 2 - 48; registerWrite(bitToSet, HIGH);
  }}
 
void sender2() {
  address = 51949726  ;
  NewRemoteTransmitter transmitter(address, 5, 263, r );
  transmitter.sendUnit(0, a) ; delay(20); ( r = 1) ; (a = 2);
  if ( a == 0) {
    

}}

void sender3() {
  address = 52949726  ;
  NewRemoteTransmitter transmitter(address, 5, 263, r );
  transmitter.sendUnit(0, a) ; delay(20); ( r = 1) ; (a = 2);
  if ( a == 0) {
   

}}

void registerWrite(int whichPin, int whichState) {
// the bits you want to send
 

  // turn off the output so the pins don't light up
  // while you're shifting bits:
  digitalWrite(storePin, LOW);

  // turn on the next highest bit in bitsToSend:
  bitWrite(bitsToSend, whichPin, whichState);

  // shift the bits out:
  shiftOut(dataPin, shiftPin, MSBFIRST, bitsToSend);

    // turn on the output so the LEDs can light up:
  digitalWrite(storePin, HIGH);

}

Hi

Habe den Beitrag geledet, um Diesen in einen eigenen Thread zu verschieben.
Dein Problem scheint rein gar Nichts mit Dem des TO zu tun zu haben - auch ist der TO schon einige Jahre älter geworden, ob's Ihn überhaupt noch hier gibt, ist eher fraglich.

Zu Deiner Frage:
Du kannst einer Byte-Variable ein Bit setzen, in Dem Du Dieses mit _BV(x) verODERst (X ist das zu setzende Bit) oder das Bit löschen, indem Du mit den negierten Wert verUNDest (dabei wird das gewünschte Bit zur Null, das verUNDen löscht das Bit in der Variable, wenn Es gesetzt war).

MfG

Aha... Ja verstehe.. Hatte also einfach einen Denkfehler. ...
Werde das mal versuchen einzubauen.
Also im Prinzip einfach ne neue Variable und diese dann ändern und mit der alten ersetzen.. Richtig?

MfG

Wenn es nicht auf hohe Geschwindigkeit ankommt, kannst Du auch bitWrite benutzen.

Gruß Tommy

Was heißt hohe Geschwindigkeit? Sind halt 32 bit... halbe Sekunde dürfte da doch zu schaffen sein oder?
Wäre natürlich umso besser je schneller es geht...
Mfg

Solange Du nicht im hundertstel Sekunden Bereich arbeiten willst, ist das schnell genug. Es ist für Anfänger einfacher, als die Arbeit mit | und &.

Gruß Tommy

WErde das mal beides probieren. Bei bitWrite wird ja dann immer gleicht gesetzt oder kann ich da auch 2 Bits gleichzeitig setzen bzw verschieben? Also 2 mal bitWrite hintereinander und dann setzen?

Du solltest Dir mkal die Doku zu bitWrite zu Gemüte führen.

Gruß Tommy

Hi

Bits VERSCHIEBEN?

MfG

Setzen meine ich natürlich.
Mir ist nur nicht klar wie die Bits dann in die 5 Register kommen. Im Grunde wird ja immer von Register 1 bis 5 durchgeschoben. Bleiben alle anderen Bits so erhalten? Arbeite das erste mal mit Schieberegistern und habe noch nicht so den Durchblick.

Oh man... Muß mich mal für mein Brett vorm Kopf entschuldigen.
Hab mir eben noch mal bitWrite angesehen und jetzt ist der Groschen gefallen...

Danke euch für den Anstoß

Hab jetzt mal was rumgebastelt.
Leider schaltet nur Register 1 die gewählte LED… Register3 welches ebenfals schalten sollte macht nichts.

Also 1. LED am 1. Register an und gleichzeitig 1. LED am 3. Register aus.

irgendwo mach ich was falsch,
Hab die verkabelungen noch mal überprüft… also korrekt

#include <DHT.h>
#include <VirtualWire.h>
#undef int
#undef abs
#undef double
#undef float
#undef round

#include <Wire.h>
#include <NewRemoteTransmitter.h>
#include <RCSwitch.h>
#include <NewRemoteReceiver.h>
#include <DS1302.h>
#define DHTPIN 3
#define DHTTYPE DHT22
DHT dht(3, DHT22);
RCSwitch mySwitch = RCSwitch();
DS1302 rtc(2, 4, 6); //2=RST 4=DAT 6=CLK VCC=5V GND=GND
Time t;
............

int l;

float tem ;
float hum ;
byte daten1 = 00000000;               // Variable für die LEDs
byte daten2 = 00000000;   
byte daten3 = 00000000; 
byte daten4 = 00000000; 
byte newdaten1 ;
byte newdaten2 ;
byte newdaten3 ;
byte newdaten4 ;





void setup() {
 // Pins 8,9,10 auf Ausgabe
 pinMode(storePin, OUTPUT);
 pinMode(shiftPin, OUTPUT);
 pinMode(dataPin, OUTPUT);

newdaten1= daten1;
newdaten2= daten2;
newdaten3= daten3;
newdaten4= daten4;

 



}
void loop() {
if (daten1 != newdaten1) {
      daten1 = newdaten1; reg();}
  if (daten2 != newdaten2) {
      daten2 = newdaten2; reg();}
      if (daten3 != newdaten3) {
      daten3 = newdaten3; reg();}
      if (daten4 != newdaten4) {
      daten4 = newdaten4; reg();}
          
........



void sender1() {
  address = 50949726  ;
  NewRemoteTransmitter transmitter(address, 5, 263, r );
  transmitter.sendUnit(0, a) ; delay(20); ( r = 1) ;  
  if ( a == 0 ) {bitWrite(newdaten1,1,1); bitWrite(newdaten3,1,0) ;
  }
    if ( a == 1 ) {bitWrite(newdaten1,1,0); bitWrite(newdaten3,1,1);
  }(a = 2);}
// hier Schaltet nur 1 LED am ersten Register. Register 3 reagiert nicht

........

}}

-......

}}

void reg() {

  digitalWrite(storePin, LOW);
shiftOut(dataPin, shiftPin, MSBFIRST, daten1);
shiftOut(dataPin, shiftPin, MSBFIRST, daten2);
shiftOut(dataPin, shiftPin, MSBFIRST, daten3);
shiftOut(dataPin, shiftPin, MSBFIRST, daten4);

    
  digitalWrite(storePin, HIGH);

}