Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- DS18B20 OneWire temperature sensor test based on mongoose-os/fw/mjs_api/api_onewire.js
- Hardware hookup:
- .===. top
- | | front view
- _____
- 1 2 3
- | | |_VCC (3-5V)
- | |___Data (need 4.7K to VCC) --> D3 on ESP8266
- |_____GND
- mos put init.js && mos call Sys.Reboot && mos console
- curl -m 5 -d '{}' 192.168.0.104/rpc/temperature
- curl -m 5 -d '{"init": true }' 192.168.0.104/rpc/temperature
- curl -m 5 -d '{"device": "28FF66C864150196" }' 192.168.0.104/rpc/temperature
- */
- load('api_config.js');
- load('api_gpio.js');
- //load('api_sys.js');
- //load('api_timer.js');
- load('api_rpc.js');
- load('api_onewire.js');
- // Helper C function get_led_gpio_pin() in src/main.c returns built-in LED GPIO
- let led = ffi('int get_led_gpio_pin()')();
- let relay1 = 12; // D6
- let relay2 = 13; // D7
- GPIO.set_mode(led, GPIO.MODE_OUTPUT);
- GPIO.set_mode(relay1, GPIO.MODE_OUTPUT);
- GPIO.set_mode(relay2, GPIO.MODE_OUTPUT);
- let tmsPin = 10; // GPIO2 = D4 DS18B20 temperature sensor pin
- let num2Hex = function(n) {
- let s = '';
- let a = '0123456789ABCDEF';
- let i = (n >> 4) & 0x0F;
- s += a[i];
- i = n & 0x0F;
- s += a[i];
- // s[0] = a + ((a < 10) ? 48 : 55);
- // s[1] = a + ((a < 10) ? 48 : 55);
- return s;
- };
- let dsAddr2Str = function(rs) {
- let s = '';
- for(let i=0; i < rs.length; i++) {
- s += num2Hex(rs.charCodeAt(i));
- }
- return s;
- };
- let dsRom = ['01234567'];
- let dsDeviceCnt = 0;
- // Initialize 1-Wire bus
- let owBus = OneWire.init(tmsPin);
- let searchForDevice = function() {
- let n = 0;
- //Setup the search to find the device type 'DS18B20' (0x28) if it is present
- let req_family_code = 0x28;
- //Normal search mode
- let search_mode = 0;
- OneWire.targetSetup(owBus, req_family_code);
- while (OneWire.next(owBus, dsRom[n], search_mode)) {
- //If no devices of the desired family are currently on the bus,
- //then another type will be found. We should check it.
- if (dsRom[n][0].charCodeAt(0) !== req_family_code) {
- print('Found unknown device' + JSON.stringify());
- break;
- }
- //DS18B20 found
- print( 'Found ' + dsAddr2Str(dsRom[n]));
- dsRom[++n] = '01234567';
- }
- dsDeviceCnt = n;
- };
- let getTemp = function(devAddress) {
- let data = [];
- let raw;
- let cfg;
- OneWire.reset(owBus);
- OneWire.select(owBus, devAddress);
- OneWire.write(owBus, 0x44);
- OneWire.delay(750);
- OneWire.reset(owBus);
- OneWire.select(owBus, devAddress);
- OneWire.write(owBus, 0xBE);
- for (let j = 0; j < 9; j++) {
- data[j] = OneWire.read(owBus);
- }
- raw = (data[1] << 8) | data[0];
- cfg = (data[4] & 0x60);
- if (cfg === 0x00) {
- raw = raw & ~7;
- } else if (cfg === 0x20) {
- raw = raw & ~3;
- } else if (cfg === 0x40) {
- raw = raw & ~1;
- }
- return raw / 16.0;
- };
- RPC.addHandler('temperature', function(args) {
- let msg='';
- let device = '*';
- let status = 'ok';
- if (args.device && args.devices !== '') {
- print("selecting device");
- device = args.device;
- }
- // Try to get list of attached sensors
- if (args.init) {
- print("init");
- }
- if (dsDeviceCnt === 0 || args.init )
- {
- print('Searching for OneWire DS18B20 devices');
- searchForDevice();
- }
- // Stop if no sensor attached
- if (dsDeviceCnt === 0) {
- status = 'No device found';
- print(status);
- return;
- }
- // Get temperature from each attached sensor
- let d = '';
- for (let i = 0; i < dsDeviceCnt; i++)
- {
- let t = getTemp(dsRom[i]);
- let dsdev = dsAddr2Str(dsRom[i]);
- let topic = 'temperature/ds' + dsdev;
- if (device === '*' || device === dsdev) {
- msg += d + JSON.stringify({'device': dsdev, 'Temperature' : t});
- }
- d = ',';
- }
- msg = '{ "status" :' + '"' + status + '", "devices": [ ' + msg + " ] }";
- print("devices:" , dsDeviceCnt, "msg:", msg);
- return JSON.parse(msg);
- });
- RPC.addHandler('relay', function(args) {
- let msg='';
- let relay ='';
- let relaystate ='';
- let a='b';
- return {'status': 'ok'};
- });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement