Go Down

Topic: DS18B20 auf Atmega8 (Read 8725 times) previous topic - next topic

skorpi080

#30
Sep 23, 2014, 06:04 pm Last Edit: Sep 24, 2014, 07:11 pm by skorpi08 Reason: 1
Nur der Vollständigkeit halber (der Vollständigkeit wegen; um es komplett / lückenlos zu machen ) :D

in openHAB
.items
Code: [Select]
Number Temperature_GF_Toiletvar "Temperature[% °C]"       {modbus="slave3:1"}
Number Temperature_GF_Toilet "Temperature [%d°C]" <temperature> (Temperature, GF_Toilet)


.rules
Code: [Select]
rule "transform" 
when    Item Temperature_GF_Toiletvar changed or     
System started 
then   
val Temperature_GF_Toilet_variable= (Temperature_GF_Toiletvar.state as DecimalType).floatValue / 10   
postUpdate(Temperature_GF_Toilet, Temperature_GF_Toilet_variable)
end



Wenn man viele Temperatur Sensoren hat, macht man es so:
.items

Code: [Select]
/* Indoor Temperatures */
Group   visual_modbus
Number Temperature_GF_Toilet "Temperature [%.1f °C]" <temperature> (Temperature, GF_Toilet, visual_modbus)
Number Temperature_GF_Corridor "Temperature [%.1f °C]" <temperature> (Temperature, GF_Corridor, visual_modbus)

// Modbus
Group   modbus_
Number modbus_Temperature_GF_Corridor"Temperature[%d °C]" (modbus_)   {modbus="slave2:1"}
Number modbus_Temperature_GF_Toilet "Temperature [%d °C]"    (modbus_) {modbus="slave3:1"}


.rules
Code: [Select]
rule "to_modbus"
when     
System started  or
Time cron "0/1 * * * * ?"
then
  modbus_?.members.forEach[element1|
     values = (element1.state as DecimalType).floatValue /10
     visual_modbus?.members.forEach[element2|
        if(element1.name.toString == "modbus_" + element2.name.toString){
     //sendCommand(element2, values) FUNKTIONIERT AUCH
    postUpdate(element2, values)
      logInfo("FILE", "nach if vergleich  values= " + values + " element2=  " + element2.name.toString + "  element1= " + "modbus" + element1.name.toString)
        }
    ]
  ]

end

Hier das Log
[CODE]Last request: 02 03 00 00 00 02 c4 38
Error reading response
execute try 1 error: I/O exception - failed to read
18:30:28.817 INFO  runtime.busevents[:26] - Light_GF_Corridor_Wardrobe state updated to OFF
18:30:28.817 INFO  runtime.busevents[:26] - modbus_Temperature_GF_Corridor state updated to 256
18:30:29.002 INFO  org.openhab.model.script.FILE[:53] - nach if vergleich  values= 25.6 element2=  Temperature_GF_Corridor  element1= modbusmodbus_Temperature_GF_Corridor
18:30:29.002 INFO  runtime.busevents[:22] - Temperature_GF_Corridor received command 25.6
18:30:29.003 INFO  org.openhab.model.script.FILE[:53] - nach if vergleich  values= 21.6 element2=  Temperature_GF_Toilet  element1= modbusmodbus_Temperature_GF_Toilet
18:30:29.003 INFO  runtime.busevents[:22] - Temperature_GF_Toilet received command 21.6
Last request: 03 03 00 00 00 02 c5 e9
Error reading response
[/code]
playground.arduino.cc/PmWiki/433Mhz-Funkmodule
[Arduino IDE] Feinheiten und Tricks  forum.arduino.cc/index.php?topic=632403.0

sschultewolter

Was ist Toilet mit den Sternen? Toiletten Spülen ?  :smiley-sweat:
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

skorpi080

Glaub das ist Heizung :D

Code: [Select]
Switch Heating_GF_Toilet "Toilet" <heating> (GF_Toilet, Heating)
playground.arduino.cc/PmWiki/433Mhz-Funkmodule
[Arduino IDE] Feinheiten und Tricks  forum.arduino.cc/index.php?topic=632403.0

sschultewolter

Ach das soll nen Thermostat sein :D Dann fehlt aber noch Abfrage, ob beim letzten Licht an und ausmachen auch die Spülung gedrückt wurde.  ]:)
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

skorpi080



Hab ichs richtig mit dem delay für den DS18B20 gemacht?

Keine Ahnung, ich finde, es sieht irgendwie merkwürdig aus.


Was findest du daran merkwürdig?

Ich finds merkwürdig dass ich mit UNO richtige Werte erhalte und mit dem Atmega8 nicht.
Sketch ist bei beiden derselbe, bis auf die ID und der Adresse vom DS18B2
Angeschlossen bei beiden an A3.
Hier der Sketch
Code: [Select]
#include <SimpleModbusSlave.h>

/***************************************************
* / Input/output pins
/***************************************************/
#include <OneWire.h>
OneWire  ds(A3);  // on pin 10
#define PIN_TASTER       9

#define ON  8
#define OFF 7

#define INTERVAL 1000
#define BUTTON_DEBOUNCE_DELAY 20
long lastDebounceTime = 0;
long previousMillis = 0;


/***************************************************
* / Modbus globals
/***************************************************/
#define MB_TXENPIN   A2
#define MB_SLAVE_ID  2
#define MB_BAUDRATE  9600
#define MB_PARITY  SERIAL_8N2

//////////////// registers of your slave ///////////////////
enum
{     
  // just add or remove registers and your good to go...
  // The first register starts at address 0
  LICHT,
  CELSIUS,
  HOLDING_REGS_SIZE // leave this one
  // total number of registers for function 3 and 6 share the same register array
  // i.e. the same address space
};

unsigned int holdingRegs[HOLDING_REGS_SIZE]; // function 3 and 6 register array



////////////////////////////////////////////////////////////

void setup()
{
    // configure pins
  pinMode(PIN_TASTER, INPUT);
  pinMode(ON, OUTPUT); 
  pinMode(OFF, OUTPUT);
 
  modbus_configure(&Serial, MB_BAUDRATE, MB_PARITY, MB_SLAVE_ID, MB_TXENPIN, HOLDING_REGS_SIZE, holdingRegs);
  // modbus_update_comms(baud, byteFormat, id) is not needed but allows for easy update of the
  // port variables and slave id dynamically in any function.
  modbus_update_comms(MB_BAUDRATE, MB_PARITY, MB_SLAVE_ID);

}

void loop()

 
    modbus_update();
  byte i;
  byte present = 0;
  byte type_s =0;
  byte data[12];
  byte addr[8] = {0x28, 0x8F, 0x34, 0x85, 0x04, 0x00, 0x00, 0x8D};
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end
 
//  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  if(millis() - previousMillis > INTERVAL) {
    previousMillis = millis();   
present = ds.reset();
  ds.select(addr);   
  ds.write(0xBE);         // Read Scratchpad
  Serial.print(present,HEX);
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
  }

  // convert the data to actual temperature
  unsigned int raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // count remain gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
    // default is 12 bit resolution, 750 ms conversion time
  }
holdingRegs[CELSIUS] = raw*625L/1000;  // Zwischenrechnung ist long, Ergebnis passt in int
  }

  // modbus_update() is the only method used in loop(). It returns the total error
  // count since the slave started. You don't have to use it but it's useful
  // for fault finding by the modbus master.
 
 
   if ((digitalRead(PIN_TASTER) == HIGH) && ((millis() - lastDebounceTime) > BUTTON_DEBOUNCE_DELAY))
  {
    // invert LED state
    holdingRegs[LICHT] = !holdingRegs[LICHT];

    lastDebounceTime = millis();
  }

    if (holdingRegs[LICHT]==1){
      // ON //
  digitalWrite(ON,1);
  digitalWrite(OFF,0);
  delay(10);
  digitalWrite(ON,0);
  digitalWrite(OFF,0);
}
  else{
    // OFF //
  digitalWrite(ON,0);
  digitalWrite(OFF,1);
  delay(10);
  digitalWrite(ON,0);
  digitalWrite(OFF,0);
}

}




Hier die Ausgabe:
Temperature_GF_Toiletvar ist der Atmega8
Temperature_GF_Corridor ist UNO
Code: [Select]
20:32:30.508 INFO  runtime.busevents[:26] - Light_GF_Corridor_Ceiling state updated to OFF
20:32:31.579 INFO  runtime.busevents[:26] - Light_GF_Corridor_Wardrobe state updated to OFF
20:32:31.579 INFO  runtime.busevents[:26] - Temperature_GF_Toiletvar state updated to 274
20:32:32.137 INFO  runtime.busevents[:26] - Temperature_GF_Corridor state updated to 226

playground.arduino.cc/PmWiki/433Mhz-Funkmodule
[Arduino IDE] Feinheiten und Tricks  forum.arduino.cc/index.php?topic=632403.0

Sinister81

Hallo,
 könntest du mir sagen ob es zum Schluss wie gewollt funktioniert hat, und wie der Aufbau der Schaltung ist.
grüsse Matthias

skorpi080

Hast du denn schon irgendwelche Hardware?
Es nützt dir nix wenn ich dir sag obs funktioniert hat oder nicht, ich hab keine Schaltpläne oder Code mehr übrig.
Alles was ich habe, ist all dies was im Forum ist.
Besorg dir also die Hardware und dann reden wir hier weiter. Möglich ist fast alles.
playground.arduino.cc/PmWiki/433Mhz-Funkmodule
[Arduino IDE] Feinheiten und Tricks  forum.arduino.cc/index.php?topic=632403.0

Sinister81

Hardware hab ich atmega´s, max485, ds18s20, kty81,... an hardware hab ich einiges...
ich weis nicht, kann ich den atmega ohne Quarz laufen lassen, oder ist ein Quarz zwingend notwendig....
brauch ich den max485....
wäre cool wenn mir da näheres dazu sagen könntest.

HotSystems

Hardware hab ich atmega´s, max485, ds18s20, kty81,... an hardware hab ich einiges...
ich weis nicht, kann ich den atmega ohne Quarz laufen lassen, oder ist ein Quarz zwingend notwendig....
brauch ich den max485....
wäre cool wenn mir da näheres dazu sagen könntest.

Gegenfrage, wie sieht es mit deinen elektronischen Kenntnissen aus ?

Ein Atmega braucht keinen Quartz, wenn du den internen Taktgenerator verwendest. Fuses müssen gesetzt werden.

Den Max485 brauchst du nur, wenn du eine serielle Verbindung zu einem zweiten System aufbauen möchtest.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Sinister81

Elektronikkenntnisse ein bisschen über Anfänger denk ich könnte man behaupten.
es soll eine Modbus rtu Verbindung zu einer codesys softsps aufgebaut werden welche auf einem raspberry pi läuft.

HotSystems

Elektronikkenntnisse ein bisschen über Anfänger denk ich könnte man behaupten.
es soll eine Modbus rtu Verbindung zu einer codesys softsps aufgebaut werden welche auf einem raspberry pi läuft.

Ich habe bisher noch keinen ModBus aufgebaut, aber dafür brauchst du die RS485, soweit ich mich erinnern kann.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

mgcss

#41
Feb 05, 2017, 04:28 pm Last Edit: Feb 05, 2017, 04:31 pm by mgcss
Wie HotSystems schon sagte, ist der Max485 zur Kommunikation mit einem anderen System. Wenn Du eine entsprechende Schnittstelle haben willst, kann es - abhängig von der gewünschten Verbindungsart - sein, dass Du auch einen externen Quarz benötigst, da der interne in manchen Fällen zu ungenau ist. Das kann man aber erst beurteilen, wenn man weiß, was genau man umsetzen möchte.  Man kann zwar auch den internen ggf. kalibirieren ... allerdings ist das nicht ganz einfach und reicht auch nicht immer aus.

Generell zu sagen, dass ein externer Quarz nicht notwenig ist, da der Controller ja über einen internen Takt-Generator verfügt ist also etwas mutig und in manchen Fällen zu kurz gegriffen.

skorpi080

Welchen Atmega hast du? Hast du schon mal den DS18B20 ausgelesen?
Wie man den Atmega programmiert, den MAX485 anschließt, wie man den DS18B20 ausliest ist doch zu hauf im Internet zu finden.
Ein Quarz brauchst du nicht um das ganze zu testen, auch nachher im Betrieb nicht.
codesys softsps kenn ich nicht.
playground.arduino.cc/PmWiki/433Mhz-Funkmodule
[Arduino IDE] Feinheiten und Tricks  forum.arduino.cc/index.php?topic=632403.0

Sinister81

ich habe schon ds18x20 Sensoren mit einem Arduino uno ausgelesen und auf im terminal anzeigen  lassen... ich habe ein paar atmega8. 

HotSystems

[quote author=mgcss link=msg=3117127 date=1486308515
Generell zu sagen, dass ein externer Quarz nicht notwenig ist, da der Controller ja über einen internen Takt-Generator verfügt ist also etwas mutig und in manchen Fällen zu kurz gegriffen.
[/quote]
Bei der Fragestellung wie oben, bin ich immer mutig. ;)

Es war nur zu entnehmen, ob dieser zwingend erforderlich ist.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Go Up