- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 8 von 8

Thema: 1-wire Temperatur in Variable speichern

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.04.2007
    Beiträge
    114

    1-wire Temperatur in Variable speichern

    Anzeige

    Praxistest und DIY Projekte
    Hallo zusammen,
    ich hab mich jetzt mal an 1-wire Temperatursensoren versucht und benutze dafür den Code von Peter Dannegger. Ich würde gerne die aktuellen Messwerte in Variablen speichern, um Beispielweise damit eine Heizung zu regeln.
    Leider finde ich momentan keinen wirklichen Ansatz, würde mich sehr freuen wenn ihr mir Anregungen geben könntet.
    Ich denke, ich muss erstmal die Adressierung (ID) vom Sensor festlegen um sicher zu sein das auch die richtige Temperatur gemessen wird. Im Programm vom Peter Dannegger sieht es ja so aus, das automatisch nach allen Sensoren gesucht wird und dann von allen Sensoren die gefunden wurden die Temperaturen ausgeben wird…

    Vielen Dank schonmal

    Gruß Hannes

  2. #2
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502

    雅思特史特芬
    开发及研究

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.04.2007
    Beiträge
    114
    Danke für deine Antwort, aber der Thread hilft mir nicht ganz weiter, bin schon mal über ihn gestolpert...

    Bin eher auf der Suche nach einem schönen Beispielcode oder einer guten Erklärung wie es ungefähr gehandhabt wird...

  4. #4
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    Also alles was du brauchst steht da bzw im Code von Peter, wenn du den da (http://www.mikrocontroller.net/topic/14792#new) her hast.

    uchar w1_rom_search( uchar diff, uchar idata *id );
    aus der 1wire.c sucht dir alle 1-wire devices raus und danach solltest du darauf zugreifen können. Hab mir das jetzt nicht genauer angesehen aber ich verstehe das so, dass wenn du jedes Gerät nacheinander anschließt und dir die ID geben läßt vom neu hinzugekommenen, dann kannst du diese auch eindeutig den Temperatursensoren zuordnen.

    Zur Not bastelst du dir ein struct und ein struct-array in dem alle Sensoren der Reihenfolge ihres Anschließens nach aufgenommen werden und kannst das ganze im EEPROM des Controllers ablegen. Dazu brauchst du nur so eine Art Init zu implementieren.

    sast

    雅思特史特芬
    开发及研究

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.04.2007
    Beiträge
    114
    Also die ID´s von den Sensoren hab ich bereits ausgelesen, das ist nicht das problem... Aber halt nicht wie ich sie in Variablen speichere.
    Habs jetzt folgender maßen probiert:

    Code:
       if (id == 0xB37C720108009B)
       {
        temp = temp1;
    
          sprintf( sa, "  T: %04X = ", temp1 );	// hex value
          uputs( sa );
          sprintf( sa, "%4d.%01døC", temp1 >> 4, (temp1 << 12) / 6553 ); // 0.1øC
          uputsnl( sa );
      }
    Aber funktioniert leider nicht

  6. #6
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    In was für Variablen willst du es denn speichern? temp und temp1 sind doch schon Variablen.

    Wofür soll das shiften gut sein? Was geht denn nicht? Welche Größe haben die Werte 8Bit, 16bit, 32bit? Ist die ID so korrekt? Warum teilst du durch 6553? Soll das vielleicht 65535 heißen?

    Fragen über Fragen und keine Ahnung, welchen Typ deine Variablen temp und temp1 haben und wie du was in temp1 schreibst. Wenn du willst, dass dir jemand einen Fehler findet, musst du schon mal zeigen wo denn der Fehler drin sein könnte.

    sast

    雅思特史特芬
    开发及研究

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.04.2007
    Beiträge
    114
    Also die Variable "temp" verwendet Peter Dannegger in seinem Progra m für die aktuelle Temperatur . Somit wollte ich immer wenn die ID vom 1 Sensor angesprochen wird die ich in "temp1" speichern will, über diese if Bedingung.

    Die Änderungen hab ich in der tempmeas.c vorgenommen und sieht dann folgender maßen aus.

    Code:
    void start_meas( void ){
      if( W1_IN & 1<< W1_PIN ){
        w1_command( CONVERT_T, NULL );
        W1_OUT |= 1<< W1_PIN;
        W1_DDR |= 1<< W1_PIN;			// parasite power on
    
      }else{
        uputsnl( "Short Circuit !" );
      }
    }
    
    
    void read_meas( void )
    {
      uchar id[8], diff;
      uchar s[30];
      uchar sa[30];
      uchar i;
      uint temp;
      uint temp1;
    
      for( diff = SEARCH_FIRST; diff != LAST_DEVICE; ){
        diff = w1_rom_search( diff, id );
    
        if( diff == PRESENCE_ERR ){
          uputsnl( "No Sensor found" );
          break;
        }
        if( diff == DATA_ERR ){
          uputsnl( "Bus Error" );
          break;
        }
        if( id[0] == 0x28 || id[0] == 0x10 ){	// temperature sensor
          uputs( "ID: " );
          for( i = 0; i < 8; i++ ){
    	sprintf( s, "%02X ", id[i] );
    	uputs( s );
          }
          w1_byte_wr( READ );			// read command
          temp = w1_byte_rd();			// low byte
          temp |= (uint)w1_byte_rd() << 8;		// high byte
          if( id[0] == 0x10 )			// 9 -> 12 bit
            temp <<= 3;
          sprintf( s, "  T: %04X = ", temp );	// hex value
          uputs( s );
          sprintf( s, "%4d.%01døC", temp >> 4, (temp << 12) / 6553 ); // 0.1øC
          uputsnl( s );
        }
    
         if (id == 0xB37C720108009B)
         {
           temp = temp1;
           sprintf( sa, "  T: %04X = ", temp1 );	// hex value
           uputs( sa );
           sprintf( sa, "%4d.%01døC", temp1 >> 4, (temp1 << 12) / 6553 ); // 0.1øC
           uputsnl( sa );
         }
    
      }
      uputsnl( "" );
    }
    Die Berechnungen der Variablen "temp" bei der ausgabe habe ich so übernommen und funktioniert auch... Nur wenn ich versuche die temp1 auszugeben wird nur 0 angezeigt...

  8. #8
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    Ja natürlich wird nur 0 angezeigt, weil deine Variable temp1 am Anfang auf 0 initialisiert wird. Das macht der Compiler schon für dich. Und zu allem Überfluss setzt du auch noch temp auf 0 indem du temp=temp1; schreibst, was nichts anderes heißt als temp=0;

    Es reicht nicht aus, nur den Code anderer zu kopieren. Viel wichtiger ist es ihn zu verstehen, sonst wirst du ewig an solchen kleinen Ecken hängen bleiben. Solche Grundlagen müssen sitzen bevor man sich an größere Sachen heran wagt.

    Es gibt eine Menge online Tutorial über C die man sich mal antuen kann. Zumindest eins davon. Bei einer Zuweisung wie temp=temp1; wird nämlich der Wert der Variable auf der rechten Seite des Zuweisungsoperators der Variable auf der linken Seite zugewiesen. Und da du ja temp1 nie mit irgendetwas beschrieben hast, steht da immer noch die 0 drin. Dann nimmst du genau diese nie veränderte Variable temp1 und läßt dir ausgeben was da drin steht. Wer hätte das gedacht, da steht 0 drin. ;o)

    Kurz und gut mach ma temp1=temp;

    Und dann lies mal ein bisschen was in den C Grundlagen bis Array und struct.

    Im übrigen unterscheidet sich deine id doch stark von der die Peter hier abfragt ich vermisse hier die 0x28 oder 0x10. Bist du dir sicher, dass deine if (id==hastenichtgesehen) überhaupt true ergibt. Da wären wir dann wieder bei den Grundlagen. Typen, Arrays, if-Abfragen sind da nur ein paar gut gemeinte Stichpunkte.

    sast

    雅思特史特芬
    开发及研究

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests