// // sht15: // Access an SHT15 temp/humidity sensor // CLS // SHT15_CMD_TEMP = 3 SHT15_CMD_RH = 5 // gpio = DrcOpen ("RPI") PROC setup(8, 9, 10) numformat(4,1) PRINT "Setup..." CYCLE tm = FN sht15temp rh = FN sht15RH if (DigitalRead (gpio,button) = LOW) then // pushed print "( RH) "; proc ledBin (int ((rh * 10 + 0.5))/10) else print "(TEMP) " ; proc ledBin (int ((tm * 10 + 0.5))/10) endif PRINT "Temp: "; tm; PRINT " RH: "; rh WAIT (0.5) REPEAT END // // sht15temp: // Return the temperature // DEF FN sht15temp LOCAL t15 PROC sht15command(SHT15_CMD_TEMP) t15 = FN sht15Result = -40.1 + 0.01 * t15 // // sht15RH: // Return the Relative Humidity read by the sht15 // DEF FN sht15RH LOCAL rh PROC sht15command(SHT15_CMD_RH) rh = FN sht15Result = -2.0468 + 0.0367 * rh + -1.5955E-6 * rh // // sht15command: // Send a command to the chip // DEF PROC sht15command(command) LOCAL i, mask, v // // Prime the chip // PinMode (gpio, dPin, M_OUT) DigitalWrite (gpio, dPin, HIGH) DigitalWrite (gpio, cPin, HIGH) DigitalWrite (gpio, dPin, LOW) DigitalWrite (gpio, cPin, LOW) DigitalWrite (gpio, cPin, HIGH) DigitalWrite (gpio, dPin, HIGH) DigitalWrite (gpio, cPin, LOW) // // Now send the command // mask = 128 FOR i = 1 TO 8 CYCLE if (command & mask) = 0 then v = LOW else v = HIGH endif DigitalWrite (gpio, dPin, v) DigitalWrite (gpio, cPin, HIGH) DigitalWrite (gpio, cPin, LOW) mask = mask / 2 REPEAT // // Clock again & wait for the ACK // DigitalWrite (gpio, cPin, HIGH) PinMode (gpio, dPin, M_IN) // WHILE DigitalRead (gpio, dPin) = HIGH CYCLE // REPEAT // DigitalWrite (gpio, cPin, LOW) WHILE DigitalRead (gpio, dPin) = LOW CYCLE // REPEAT ENDPROC // // sht15result: // Fetch the result from the last command // DEF FN sht15Result LOCAL i LOCAL result // result = 0 // PinMode (gpio, dPin, M_IN) FOR i = 1 TO 100 CYCLE IF DigitalRead (gpio, dPin) = LOW THEN BREAK WAIT (0.010) REPEAT // IF DigitalRead (gpio, dPin) <> LOW THEN = 0 // FOR i = 1 TO 8 CYCLE DigitalWrite (gpio, cPin, HIGH) result = (result * 2) | DigitalRead (gpio, dPin) DigitalWrite (gpio, cPin, LOW) REPEAT // PinMode (gpio, dPin, M_OUT) DigitalWrite (gpio, dPin, HIGH) DigitalWrite (gpio, dPin, LOW) DigitalWrite (gpio, cPin, HIGH) DigitalWrite (gpio, cPin, LOW) PinMode (gpio, dPin, M_IN) // FOR i = 1 TO 8 CYCLE DigitalWrite (gpio, cPin, HIGH) result = (result * 2) | DigitalRead (gpio, dPin) DigitalWrite (gpio, cPin, LOW) REPEAT // // Skip CRC // PinMode (gpio, dPin, M_OUT) DigitalWrite (gpio, dPin, HIGH) DigitalWrite (gpio, cPin, HIGH) DigitalWrite (gpio, cPin, LOW) // = result // // setup: // Remember the values for the data and clock pins and initialise the sensor // DEF PROC setup(d, c, b) local i LOW = 0 HIGH = 1 M_IN = 0 M_OUT = 1 dPin = d cPin = c button = b DigitalWrite (gpio, dPin, LOW) DigitalWrite (gpio, cPin, LOW) PinMode (gpio, dPin, M_OUT) PinMode (gpio, cPin, M_OUT) PinMode (gpio, button, M_IN) for i = 0 to 7 cycle PinMode (gpio, i, M_OUT) repeat ENDPROC // // ledBin: // Output an 8-bit number on the first 8 LEDs // def proc ledBin (number) LOCAL bit, mask IF number > 255 THEN number = 255 FOR bit = 0 TO 7 CYCLE mask = 2 ^ bit IF (number & mask) = 0 THEN DigitalWrite (gpio, bit, LOW) ELSE DigitalWrite (gpio, bit, HIGH) ENDIF REPEAT ENDPROC