Add ds18b20 udp broadcaster example.
Add license and readme details. Rid of compile-time switches. Rid of lazy initialization of sensor. Minor code fixing.
This commit is contained in:
parent
1da8626e6e
commit
72f30ad950
13 changed files with 278 additions and 102 deletions
22
examples/ds18b20_broadcaster/LICENSE
Normal file
22
examples/ds18b20_broadcaster/LICENSE
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2016 Grzegorz Hetman : ghetman@gmail.com
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
3
examples/ds18b20_broadcaster/Makefile
Normal file
3
examples/ds18b20_broadcaster/Makefile
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
PROGRAM=ds18b20_broadcaster
|
||||||
|
EXTRA_COMPONENTS = extras/onewire extras/ds18b20
|
||||||
|
include ../../common.mk
|
20
examples/ds18b20_broadcaster/README.md
Normal file
20
examples/ds18b20_broadcaster/README.md
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
# DS19B20 Broadcaster
|
||||||
|
|
||||||
|
>In this example you can see how to get data from multiple
|
||||||
|
>ds18b20 sensor and emit result over udb broadcaster address.
|
||||||
|
|
||||||
|
As a client server, you can use this simple udp receiver, writen in python:
|
||||||
|
|
||||||
|
```
|
||||||
|
import select, socket
|
||||||
|
|
||||||
|
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
|
s.bind(('<broadcast>', 8005))
|
||||||
|
s.setblocking(0)
|
||||||
|
|
||||||
|
while True:
|
||||||
|
result = select.select([s],[],[])
|
||||||
|
msg = result[0][0].recv(1024)
|
||||||
|
print msg.strip()
|
||||||
|
|
||||||
|
```
|
118
examples/ds18b20_broadcaster/ds18b20_broadcaster.c
Normal file
118
examples/ds18b20_broadcaster/ds18b20_broadcaster.c
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "espressif/esp_common.h"
|
||||||
|
#include "esp/uart.h"
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "task.h"
|
||||||
|
#include "timers.h"
|
||||||
|
#include "queue.h"
|
||||||
|
#include "lwip/api.h"
|
||||||
|
#include "ssid_config.h"
|
||||||
|
|
||||||
|
// DS18B20 driver
|
||||||
|
#include "ds18b20/ds18b20.h"
|
||||||
|
// Onewire init
|
||||||
|
#include "onewire/onewire.h"
|
||||||
|
|
||||||
|
void broadcast_temperature(void *pvParameters)
|
||||||
|
{
|
||||||
|
|
||||||
|
uint8_t amount = 0;
|
||||||
|
uint8_t sensors = 2;
|
||||||
|
ds_sensor_t t[sensors];
|
||||||
|
|
||||||
|
// Use GPIO 13 as one wire pin.
|
||||||
|
uint8_t GPIO_FOR_ONE_WIRE = 13;
|
||||||
|
|
||||||
|
char msg[100];
|
||||||
|
|
||||||
|
// Broadcaster part
|
||||||
|
err_t err;
|
||||||
|
// Initialize one wire bus.
|
||||||
|
onewire_init(GPIO_FOR_ONE_WIRE);
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
|
||||||
|
// Send out some UDP data
|
||||||
|
struct netconn* conn;
|
||||||
|
|
||||||
|
// Create UDP connection
|
||||||
|
conn = netconn_new(NETCONN_UDP);
|
||||||
|
|
||||||
|
// Connect to local port
|
||||||
|
err = netconn_bind(conn, IP_ADDR_ANY, 8004);
|
||||||
|
|
||||||
|
if (err != ERR_OK) {
|
||||||
|
netconn_delete(conn);
|
||||||
|
printf("%s : Could not bind! (%s)\n", __FUNCTION__, lwip_strerr(err));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = netconn_connect(conn, IP_ADDR_BROADCAST, 8005);
|
||||||
|
|
||||||
|
if (err != ERR_OK) {
|
||||||
|
netconn_delete(conn);
|
||||||
|
printf("%s : Could not connect! (%s)\n", __FUNCTION__, lwip_strerr(err));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(;;) {
|
||||||
|
// Search all DS18B20, return its amount and feed 't' structure with result data.
|
||||||
|
amount = readDS18B20(GPIO_FOR_ONE_WIRE, t);
|
||||||
|
|
||||||
|
if (amount < sensors){
|
||||||
|
printf("Something is wrong, I expect to see %d sensors \nbut just %d was detected!\n", sensors, amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < amount; ++i)
|
||||||
|
{
|
||||||
|
// Multiple "" here is just to satisfy compiler and don`t raise 'hex escape sequence out of range' warning.
|
||||||
|
sprintf(msg, "Sensor %d report: %d.%d ""\xC2""\xB0""C\n",t[i].id, t[i].major, t[i].minor);
|
||||||
|
printf("%s", msg);
|
||||||
|
|
||||||
|
struct netbuf* buf = netbuf_new();
|
||||||
|
void* data = netbuf_alloc(buf, strlen(msg));
|
||||||
|
|
||||||
|
memcpy (data, msg, strlen(msg));
|
||||||
|
err = netconn_send(conn, buf);
|
||||||
|
|
||||||
|
if (err != ERR_OK) {
|
||||||
|
printf("%s : Could not send data!!! (%s)\n", __FUNCTION__, lwip_strerr(err));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
netbuf_delete(buf); // De-allocate packet buffer
|
||||||
|
}
|
||||||
|
vTaskDelay(1000/portTICK_RATE_MS);
|
||||||
|
}
|
||||||
|
|
||||||
|
err = netconn_disconnect(conn);
|
||||||
|
printf("%s : Disconnected from IP_ADDR_BROADCAST port 12346 (%s)\n", __FUNCTION__, lwip_strerr(err));
|
||||||
|
|
||||||
|
err = netconn_delete(conn);
|
||||||
|
printf("%s : Deleted connection (%s)\n", __FUNCTION__, lwip_strerr(err));
|
||||||
|
|
||||||
|
vTaskDelay(1000/portTICK_RATE_MS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void user_init(void)
|
||||||
|
{
|
||||||
|
uart_set_baud(0, 115200);
|
||||||
|
|
||||||
|
printf("SDK version:%s\n", sdk_system_get_sdk_version());
|
||||||
|
|
||||||
|
// Set led to indicate wifi status.
|
||||||
|
sdk_wifi_status_led_install(2, PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
|
||||||
|
|
||||||
|
struct sdk_station_config config = {
|
||||||
|
.ssid = WIFI_SSID,
|
||||||
|
.password = WIFI_PASS,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Required to call wifi_set_opmode before station_set_config.
|
||||||
|
sdk_wifi_set_opmode(STATION_MODE);
|
||||||
|
sdk_wifi_station_set_config(&config);
|
||||||
|
|
||||||
|
xTaskCreate(&broadcast_temperature, (signed char *)"broadcast_temperature", 256, NULL, 2, NULL);
|
||||||
|
}
|
||||||
|
|
22
examples/ds18b20_onewire/LICENSE
Normal file
22
examples/ds18b20_onewire/LICENSE
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2016 Grzegorz Hetman : ghetman@gmail.com
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
|
@ -12,17 +12,22 @@
|
||||||
|
|
||||||
// DS18B20 driver
|
// DS18B20 driver
|
||||||
#include "ds18b20/ds18b20.h"
|
#include "ds18b20/ds18b20.h"
|
||||||
|
// Onewire init
|
||||||
|
#include "onewire/onewire.h"
|
||||||
|
|
||||||
void print_temperature(void *pvParameters)
|
void print_temperature(void *pvParameters)
|
||||||
{
|
{
|
||||||
int delay = 500;
|
int delay = 500;
|
||||||
uint8_t amount = 0;
|
uint8_t amount = 0;
|
||||||
|
// Declare amount of sensors
|
||||||
uint8_t sensors = 2;
|
uint8_t sensors = 2;
|
||||||
DSENSOR t[sensors];
|
ds_sensor_t t[sensors];
|
||||||
|
|
||||||
// Use GPIO 13 as one wire pin.
|
// Use GPIO 13 as one wire pin.
|
||||||
uint8_t GPIO_FOR_ONE_WIRE = 13;
|
uint8_t GPIO_FOR_ONE_WIRE = 13;
|
||||||
|
|
||||||
|
onewire_init(GPIO_FOR_ONE_WIRE);
|
||||||
|
|
||||||
while(1) {
|
while(1) {
|
||||||
// Search all DS18B20, return its amount and feed 't' structure with result data.
|
// Search all DS18B20, return its amount and feed 't' structure with result data.
|
||||||
amount = readDS18B20(GPIO_FOR_ONE_WIRE, t);
|
amount = readDS18B20(GPIO_FOR_ONE_WIRE, t);
|
||||||
|
@ -33,7 +38,8 @@ void print_temperature(void *pvParameters)
|
||||||
|
|
||||||
for (int i = 0; i < amount; ++i)
|
for (int i = 0; i < amount; ++i)
|
||||||
{
|
{
|
||||||
printf("Sensor %d report: %d.%d C\n",t[i].id, t[i].major, t[i].minor);
|
// Multiple "" here is just to satisfy compiler and don`t raise 'hex escape sequence out of range' warning.
|
||||||
|
printf("Sensor %d report: %d.%d ""\xC2""\xB0""C\n",t[i].id, t[i].major, t[i].minor);
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
vTaskDelay(delay / portTICK_RATE_MS);
|
vTaskDelay(delay / portTICK_RATE_MS);
|
||||||
|
@ -46,6 +52,6 @@ void user_init(void)
|
||||||
|
|
||||||
printf("SDK version:%s\n", sdk_system_get_sdk_version());
|
printf("SDK version:%s\n", sdk_system_get_sdk_version());
|
||||||
|
|
||||||
xTaskCreate(&print_temperature, (signed char *)"get_task", 256, NULL, 2, NULL);
|
xTaskCreate(&print_temperature, (signed char *)"print_temperature", 256, NULL, 2, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
22
extras/ds18b20/LICENSE
Normal file
22
extras/ds18b20/LICENSE
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2016 Grzegorz Hetman : ghetman@gmail.com
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
|
@ -13,13 +13,7 @@
|
||||||
#define DS1820_ALARMSEARCH 0xEC
|
#define DS1820_ALARMSEARCH 0xEC
|
||||||
#define DS1820_CONVERT_T 0x44
|
#define DS1820_CONVERT_T 0x44
|
||||||
|
|
||||||
uint8_t readDS18B20(uint8_t pin, DSENSOR *result){
|
uint8_t readDS18B20(uint8_t pin, ds_sensor_t *result){
|
||||||
static uint8_t one_time = 1;
|
|
||||||
|
|
||||||
if (one_time){
|
|
||||||
onewire_init(pin);
|
|
||||||
one_time = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t addr[8];
|
uint8_t addr[8];
|
||||||
uint8_t sensor_id = 0;
|
uint8_t sensor_id = 0;
|
||||||
|
@ -34,11 +28,11 @@ uint8_t readDS18B20(uint8_t pin, DSENSOR *result){
|
||||||
|
|
||||||
onewire_reset(pin);
|
onewire_reset(pin);
|
||||||
onewire_select(pin, addr);
|
onewire_select(pin, addr);
|
||||||
onewire_write(pin, DS1820_CONVERT_T, owDefaultPower);
|
onewire_write(pin, DS1820_CONVERT_T, ONEWIRE_DEFAULT_POWER);
|
||||||
sdk_os_delay_us(750);
|
sdk_os_delay_us(750);
|
||||||
onewire_reset(pin);
|
onewire_reset(pin);
|
||||||
onewire_select(pin, addr);
|
onewire_select(pin, addr);
|
||||||
onewire_write(pin, DS1820_READ_SCRATCHPAD, owDefaultPower);
|
onewire_write(pin, DS1820_READ_SCRATCHPAD, ONEWIRE_DEFAULT_POWER);
|
||||||
|
|
||||||
uint8_t get[10];
|
uint8_t get[10];
|
||||||
|
|
||||||
|
@ -75,14 +69,14 @@ float read_single_DS18B20(uint8_t pin){
|
||||||
onewire_init(pin);
|
onewire_init(pin);
|
||||||
onewire_reset(pin);
|
onewire_reset(pin);
|
||||||
|
|
||||||
onewire_write(pin, DS1820_SKIP_ROM, owDefaultPower);
|
onewire_write(pin, DS1820_SKIP_ROM, ONEWIRE_DEFAULT_POWER);
|
||||||
onewire_write(pin, DS1820_CONVERT_T, owDefaultPower);
|
onewire_write(pin, DS1820_CONVERT_T, ONEWIRE_DEFAULT_POWER);
|
||||||
|
|
||||||
sdk_os_delay_us(750);
|
sdk_os_delay_us(750);
|
||||||
|
|
||||||
onewire_reset(pin);
|
onewire_reset(pin);
|
||||||
onewire_write(pin, DS1820_SKIP_ROM, owDefaultPower);
|
onewire_write(pin, DS1820_SKIP_ROM, ONEWIRE_DEFAULT_POWER);
|
||||||
onewire_write(pin, DS1820_READ_SCRATCHPAD, owDefaultPower);
|
onewire_write(pin, DS1820_READ_SCRATCHPAD, ONEWIRE_DEFAULT_POWER);
|
||||||
|
|
||||||
uint8_t get[10];
|
uint8_t get[10];
|
||||||
|
|
||||||
|
|
|
@ -1,17 +1,17 @@
|
||||||
#ifndef DRIVER_DS18B20_H_
|
#ifndef DRIVER_DS18B20_H_
|
||||||
#define DRIVER_DS18B20_H_
|
#define DRIVER_DS18B20_H_
|
||||||
|
|
||||||
typedef struct DSENSOR {
|
typedef struct {
|
||||||
uint8_t id;
|
uint8_t id;
|
||||||
uint8_t major;
|
uint8_t major;
|
||||||
uint8_t minor;
|
uint8_t minor;
|
||||||
} DSENSOR;
|
} ds_sensor_t;
|
||||||
|
|
||||||
// Scan all ds18b20 sensors on bus and return its amount.
|
// Scan all ds18b20 sensors on bus and return its amount.
|
||||||
// Result are saved in array of DSENSOR structure.
|
// Result are saved in array of ds_sensor_t structure.
|
||||||
// Cause printf in esp sdk don`t support float,
|
// Cause printf in esp sdk don`t support float,
|
||||||
// I split result as two number (major, minor).
|
// I split result as two number (major, minor).
|
||||||
uint8_t readDS18B20(uint8_t pin, DSENSOR *result);
|
uint8_t readDS18B20(uint8_t pin, ds_sensor_t *result);
|
||||||
|
|
||||||
// This method is just to demonstrate how to read
|
// This method is just to demonstrate how to read
|
||||||
// temperature from single dallas chip.
|
// temperature from single dallas chip.
|
||||||
|
|
22
extras/onewire/LICENSE
Normal file
22
extras/onewire/LICENSE
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2014 zeroday nodemcu.com
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
|
@ -2,6 +2,6 @@
|
||||||
|
|
||||||
This is a port of bit banging one wire driver based on nodemcu implementaion.
|
This is a port of bit banging one wire driver based on nodemcu implementaion.
|
||||||
|
|
||||||
For all aspect regarding license, please check in their code.
|
Seams that they port it from https://www.pjrc.com/teensy/td_libs_OneWire.html
|
||||||
|
|
||||||
|
|
||||||
|
For all aspect regarding license, please check LICENSE file and coresponding projects.
|
|
@ -1,27 +1,17 @@
|
||||||
#include "onewire.h"
|
#include "onewire.h"
|
||||||
|
|
||||||
#if ONEWIRE_SEARCH
|
|
||||||
// global search state
|
// global search state
|
||||||
static unsigned char ROM_NO[NUM_OW][8];
|
static unsigned char ROM_NO[ONEWIRE_NUM][8];
|
||||||
static uint8_t LastDiscrepancy[NUM_OW];
|
static uint8_t LastDiscrepancy[ONEWIRE_NUM];
|
||||||
static uint8_t LastFamilyDiscrepancy[NUM_OW];
|
static uint8_t LastFamilyDiscrepancy[ONEWIRE_NUM];
|
||||||
static uint8_t LastDeviceFlag[NUM_OW];
|
static uint8_t LastDeviceFlag[ONEWIRE_NUM];
|
||||||
#endif
|
|
||||||
|
|
||||||
//#define noInterrupts void()
|
|
||||||
// gpio_enable(gpio, GPIO_OUTPUT);
|
|
||||||
|
|
||||||
void onewire_init(uint8_t pin)
|
void onewire_init(uint8_t pin)
|
||||||
{
|
{
|
||||||
// pinMode(pin, INPUT);
|
|
||||||
gpio_enable(pin, GPIO_INPUT);
|
gpio_enable(pin, GPIO_INPUT);
|
||||||
//platform_gpio_mode(pin, PLATFORM_GPIO_INPUT, PLATFORM_GPIO_PULLUP);
|
|
||||||
#if ONEWIRE_SEARCH
|
|
||||||
onewire_reset_search(pin);
|
onewire_reset_search(pin);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Perform the onewire reset function. We will wait up to 250uS for
|
// Perform the onewire reset function. We will wait up to 250uS for
|
||||||
// the bus to come high, if it doesn't then it is broken or shorted
|
// the bus to come high, if it doesn't then it is broken or shorted
|
||||||
// and we return a 0;
|
// and we return a 0;
|
||||||
|
@ -56,7 +46,6 @@ uint8_t onewire_reset(uint8_t pin)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Write a bit. Port and bit is used to cut lookup time and provide
|
// Write a bit. Port and bit is used to cut lookup time and provide
|
||||||
// more certain timing.
|
// more certain timing.
|
||||||
//
|
//
|
||||||
|
@ -81,7 +70,6 @@ static void onewire_write_bit(uint8_t pin, uint8_t v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Read a bit. Port and bit is used to cut lookup time and provide
|
// Read a bit. Port and bit is used to cut lookup time and provide
|
||||||
// more certain timing.
|
// more certain timing.
|
||||||
//
|
//
|
||||||
|
@ -101,7 +89,6 @@ static uint8_t onewire_read_bit(uint8_t pin)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Write a byte. The writing code uses the active drivers to raise the
|
// Write a byte. The writing code uses the active drivers to raise the
|
||||||
// pin high, if you need power after the write (e.g. DS18S20 in
|
// pin high, if you need power after the write (e.g. DS18S20 in
|
||||||
// parasite power mode) then set 'power' to 1, otherwise the pin will
|
// parasite power mode) then set 'power' to 1, otherwise the pin will
|
||||||
|
@ -125,7 +112,7 @@ void onewire_write(uint8_t pin, uint8_t v, uint8_t power /* = 0 */) {
|
||||||
void onewire_write_bytes(uint8_t pin, const uint8_t *buf, uint16_t count, bool power /* = 0 */) {
|
void onewire_write_bytes(uint8_t pin, const uint8_t *buf, uint16_t count, bool power /* = 0 */) {
|
||||||
uint16_t i;
|
uint16_t i;
|
||||||
for (i = 0 ; i < count ; i++)
|
for (i = 0 ; i < count ; i++)
|
||||||
onewire_write(pin, buf[i], owDefaultPower);
|
onewire_write(pin, buf[i], ONEWIRE_DEFAULT_POWER);
|
||||||
if (!power) {
|
if (!power) {
|
||||||
noInterrupts();
|
noInterrupts();
|
||||||
DIRECT_MODE_INPUT(pin);
|
DIRECT_MODE_INPUT(pin);
|
||||||
|
@ -134,7 +121,6 @@ void onewire_write_bytes(uint8_t pin, const uint8_t *buf, uint16_t count, bool p
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Read a byte
|
// Read a byte
|
||||||
//
|
//
|
||||||
uint8_t onewire_read(uint8_t pin) {
|
uint8_t onewire_read(uint8_t pin) {
|
||||||
|
@ -153,24 +139,22 @@ void onewire_read_bytes(uint8_t pin, uint8_t *buf, uint16_t count) {
|
||||||
buf[i] = onewire_read(pin);
|
buf[i] = onewire_read(pin);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Do a ROM select
|
// Do a ROM select
|
||||||
//
|
//
|
||||||
void onewire_select(uint8_t pin, const uint8_t rom[8])
|
void onewire_select(uint8_t pin, const uint8_t rom[8])
|
||||||
{
|
{
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
|
|
||||||
onewire_write(pin, 0x55, owDefaultPower); // Choose ROM
|
onewire_write(pin, 0x55, ONEWIRE_DEFAULT_POWER); // Choose ROM
|
||||||
|
|
||||||
for (i = 0; i < 8; i++) onewire_write(pin, rom[i], owDefaultPower);
|
for (i = 0; i < 8; i++) onewire_write(pin, rom[i], ONEWIRE_DEFAULT_POWER);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Do a ROM skip
|
// Do a ROM skip
|
||||||
//
|
//
|
||||||
void onewire_skip(uint8_t pin)
|
void onewire_skip(uint8_t pin)
|
||||||
{
|
{
|
||||||
onewire_write(pin, 0xCC, owDefaultPower); // Skip ROM
|
onewire_write(pin, 0xCC, ONEWIRE_DEFAULT_POWER); // Skip ROM
|
||||||
}
|
}
|
||||||
|
|
||||||
void onewire_depower(uint8_t pin)
|
void onewire_depower(uint8_t pin)
|
||||||
|
@ -180,9 +164,6 @@ void onewire_depower(uint8_t pin)
|
||||||
interrupts();
|
interrupts();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ONEWIRE_SEARCH
|
|
||||||
|
|
||||||
//
|
|
||||||
// You need to use this function to start a search again from the beginning.
|
// You need to use this function to start a search again from the beginning.
|
||||||
// You do not need to do it for the first search, though you could.
|
// You do not need to do it for the first search, though you could.
|
||||||
//
|
//
|
||||||
|
@ -190,7 +171,7 @@ void onewire_reset_search(uint8_t pin)
|
||||||
{
|
{
|
||||||
// reset the search state
|
// reset the search state
|
||||||
LastDiscrepancy[pin] = 0;
|
LastDiscrepancy[pin] = 0;
|
||||||
LastDeviceFlag[pin] = FALSE;
|
LastDeviceFlag[pin] = 0;
|
||||||
LastFamilyDiscrepancy[pin] = 0;
|
LastFamilyDiscrepancy[pin] = 0;
|
||||||
int i;
|
int i;
|
||||||
for(i = 7; ; i--) {
|
for(i = 7; ; i--) {
|
||||||
|
@ -211,10 +192,9 @@ void onewire_target_search(uint8_t pin, uint8_t family_code)
|
||||||
ROM_NO[pin][i] = 0;
|
ROM_NO[pin][i] = 0;
|
||||||
LastDiscrepancy[pin] = 64;
|
LastDiscrepancy[pin] = 64;
|
||||||
LastFamilyDiscrepancy[pin] = 0;
|
LastFamilyDiscrepancy[pin] = 0;
|
||||||
LastDeviceFlag[pin] = FALSE;
|
LastDeviceFlag[pin] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Perform a search. If this function returns a '1' then it has
|
// Perform a search. If this function returns a '1' then it has
|
||||||
// enumerated the next device and you may retrieve the ROM from the
|
// enumerated the next device and you may retrieve the ROM from the
|
||||||
// OneWire::address variable. If there are no devices, no further
|
// OneWire::address variable. If there are no devices, no further
|
||||||
|
@ -227,8 +207,8 @@ void onewire_target_search(uint8_t pin, uint8_t family_code)
|
||||||
//--------------------------------------------------------------------------
|
//--------------------------------------------------------------------------
|
||||||
// Perform the 1-Wire Search Algorithm on the 1-Wire bus using the existing
|
// Perform the 1-Wire Search Algorithm on the 1-Wire bus using the existing
|
||||||
// search state.
|
// search state.
|
||||||
// Return TRUE : device found, ROM number in ROM_NO buffer
|
// Return 1 : device found, ROM number in ROM_NO buffer
|
||||||
// FALSE : device not found, end of search
|
// 0 : device not found, end of search
|
||||||
//
|
//
|
||||||
uint8_t onewire_search(uint8_t pin, uint8_t *newAddr)
|
uint8_t onewire_search(uint8_t pin, uint8_t *newAddr)
|
||||||
{
|
{
|
||||||
|
@ -253,13 +233,13 @@ uint8_t onewire_search(uint8_t pin, uint8_t *newAddr)
|
||||||
{
|
{
|
||||||
// reset the search
|
// reset the search
|
||||||
LastDiscrepancy[pin] = 0;
|
LastDiscrepancy[pin] = 0;
|
||||||
LastDeviceFlag[pin] = FALSE;
|
LastDeviceFlag[pin] = 0;
|
||||||
LastFamilyDiscrepancy[pin] = 0;
|
LastFamilyDiscrepancy[pin] = 0;
|
||||||
return FALSE;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// issue the search command
|
// issue the search command
|
||||||
onewire_write(pin, 0xF0, owDefaultPower);
|
onewire_write(pin, 0xF0, ONEWIRE_DEFAULT_POWER);
|
||||||
|
|
||||||
// loop to do the search
|
// loop to do the search
|
||||||
do
|
do
|
||||||
|
@ -330,9 +310,9 @@ uint8_t onewire_search(uint8_t pin, uint8_t *newAddr)
|
||||||
|
|
||||||
// check for last device
|
// check for last device
|
||||||
if (LastDiscrepancy[pin] == 0)
|
if (LastDiscrepancy[pin] == 0)
|
||||||
LastDeviceFlag[pin] = TRUE;
|
LastDeviceFlag[pin] = 1;
|
||||||
|
|
||||||
search_result = TRUE;
|
search_result = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -340,9 +320,9 @@ uint8_t onewire_search(uint8_t pin, uint8_t *newAddr)
|
||||||
if (!search_result || !ROM_NO[pin][0])
|
if (!search_result || !ROM_NO[pin][0])
|
||||||
{
|
{
|
||||||
LastDiscrepancy[pin] = 0;
|
LastDiscrepancy[pin] = 0;
|
||||||
LastDeviceFlag[pin] = FALSE;
|
LastDeviceFlag[pin] = 0;
|
||||||
LastFamilyDiscrepancy[pin] = 0;
|
LastFamilyDiscrepancy[pin] = 0;
|
||||||
search_result = FALSE;
|
search_result = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -355,10 +335,6 @@ uint8_t onewire_search(uint8_t pin, uint8_t *newAddr)
|
||||||
return search_result;
|
return search_result;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if ONEWIRE_CRC
|
|
||||||
// The 1-Wire CRC scheme is described in Maxim Application Note 27:
|
// The 1-Wire CRC scheme is described in Maxim Application Note 27:
|
||||||
// "Understanding and Using Cyclic Redundancy Checks with Maxim iButton Products"
|
// "Understanding and Using Cyclic Redundancy Checks with Maxim iButton Products"
|
||||||
//
|
//
|
||||||
|
@ -427,7 +403,6 @@ uint8_t onewire_crc8(const uint8_t *addr, uint8_t len)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ONEWIRE_CRC16
|
|
||||||
// Compute the 1-Wire CRC16 and compare it against the received CRC.
|
// Compute the 1-Wire CRC16 and compare it against the received CRC.
|
||||||
// Example usage (reading a DS2408):
|
// Example usage (reading a DS2408):
|
||||||
// // Put everything in a buffer so we can compute the CRC easily.
|
// // Put everything in a buffer so we can compute the CRC easily.
|
||||||
|
@ -447,7 +422,7 @@ uint8_t onewire_crc8(const uint8_t *addr, uint8_t len)
|
||||||
// This should just point into the received data,
|
// This should just point into the received data,
|
||||||
// *not* at a 16-bit integer.
|
// *not* at a 16-bit integer.
|
||||||
// @param crc - The crc starting value (optional)
|
// @param crc - The crc starting value (optional)
|
||||||
// @return True, iff the CRC matches.
|
// @return 1, iff the CRC matches.
|
||||||
bool onewire_check_crc16(const uint8_t* input, uint16_t len, const uint8_t* inverted_crc, uint16_t crc)
|
bool onewire_check_crc16(const uint8_t* input, uint16_t len, const uint8_t* inverted_crc, uint16_t crc)
|
||||||
{
|
{
|
||||||
crc = ~onewire_crc16(input, len, crc);
|
crc = ~onewire_crc16(input, len, crc);
|
||||||
|
@ -489,6 +464,3 @@ uint16_t onewire_crc16(const uint8_t* input, uint16_t len, uint16_t crc)
|
||||||
}
|
}
|
||||||
return crc;
|
return crc;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -5,11 +5,10 @@
|
||||||
#include "FreeRTOS.h"
|
#include "FreeRTOS.h"
|
||||||
|
|
||||||
// 1 for keeping the parasitic power on H
|
// 1 for keeping the parasitic power on H
|
||||||
#define owDefaultPower 1
|
#define ONEWIRE_DEFAULT_POWER 1
|
||||||
|
|
||||||
#define NUM_OW 20
|
// Maximum number of devices.
|
||||||
#define FALSE 0
|
#define ONEWIRE_NUM 20
|
||||||
#define TRUE 1
|
|
||||||
|
|
||||||
// You can exclude certain features from OneWire. In theory, this
|
// You can exclude certain features from OneWire. In theory, this
|
||||||
// might save some space. In practice, the compiler automatically
|
// might save some space. In practice, the compiler automatically
|
||||||
|
@ -21,32 +20,15 @@
|
||||||
// is the exception, because it selects a fast but large algorithm
|
// is the exception, because it selects a fast but large algorithm
|
||||||
// or a small but slow algorithm.
|
// or a small but slow algorithm.
|
||||||
|
|
||||||
// you can exclude onewire_search by defining that to 0
|
|
||||||
#ifndef ONEWIRE_SEARCH
|
|
||||||
#define ONEWIRE_SEARCH 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// You can exclude CRC checks altogether by defining this to 0
|
|
||||||
#ifndef ONEWIRE_CRC
|
|
||||||
#define ONEWIRE_CRC 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Select the table-lookup method of computing the 8-bit CRC
|
// Select the table-lookup method of computing the 8-bit CRC
|
||||||
// by setting this to 1. The lookup table enlarges code size by
|
// by setting this to 1. The lookup table enlarges code size by
|
||||||
// about 250 bytes. It does NOT consume RAM (but did in very
|
// about 250 bytes. It does NOT consume RAM (but did in very
|
||||||
// old versions of OneWire). If you disable this, a slower
|
// old versions of OneWire). If you disable this, a slower
|
||||||
// but very compact algorithm is used.
|
// but very compact algorithm is used.
|
||||||
#ifndef ONEWIRE_CRC8_TABLE
|
#ifndef ONEWIRE_CRC8_TABLE
|
||||||
//#define ONEWIRE_CRC8_TABLE 0
|
|
||||||
#define ONEWIRE_CRC8_TABLE 0
|
#define ONEWIRE_CRC8_TABLE 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// You can allow 16-bit CRC checks by defining this to 1
|
|
||||||
// (Note that ONEWIRE_CRC must also be 1.)
|
|
||||||
#ifndef ONEWIRE_CRC16
|
|
||||||
#define ONEWIRE_CRC16 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Platform specific I/O definitions
|
// Platform specific I/O definitions
|
||||||
#define noInterrupts portDISABLE_INTERRUPTS
|
#define noInterrupts portDISABLE_INTERRUPTS
|
||||||
#define interrupts portENABLE_INTERRUPTS
|
#define interrupts portENABLE_INTERRUPTS
|
||||||
|
@ -58,7 +40,6 @@
|
||||||
#define DIRECT_WRITE_LOW(pin) gpio_write(pin, 0)
|
#define DIRECT_WRITE_LOW(pin) gpio_write(pin, 0)
|
||||||
#define DIRECT_WRITE_HIGH(pin) gpio_write(pin, 1)
|
#define DIRECT_WRITE_HIGH(pin) gpio_write(pin, 1)
|
||||||
|
|
||||||
|
|
||||||
void onewire_init(uint8_t pin);
|
void onewire_init(uint8_t pin);
|
||||||
|
|
||||||
// Perform a 1-Wire reset cycle. Returns 1 if a device responds
|
// Perform a 1-Wire reset cycle. Returns 1 if a device responds
|
||||||
|
@ -99,7 +80,6 @@ void onewire_read_bytes(uint8_t pin, uint8_t *buf, uint16_t count);
|
||||||
// someone shorts your bus.
|
// someone shorts your bus.
|
||||||
void onewire_depower(uint8_t pin);
|
void onewire_depower(uint8_t pin);
|
||||||
|
|
||||||
#if ONEWIRE_SEARCH
|
|
||||||
// Clear the search state so that if will start from the beginning again.
|
// Clear the search state so that if will start from the beginning again.
|
||||||
void onewire_reset_search(uint8_t pin);
|
void onewire_reset_search(uint8_t pin);
|
||||||
|
|
||||||
|
@ -114,14 +94,11 @@ void onewire_target_search(uint8_t pin, uint8_t family_code);
|
||||||
// get garbage. The order is deterministic. You will always get
|
// get garbage. The order is deterministic. You will always get
|
||||||
// the same devices in the same order.
|
// the same devices in the same order.
|
||||||
uint8_t onewire_search(uint8_t pin, uint8_t *newAddr);
|
uint8_t onewire_search(uint8_t pin, uint8_t *newAddr);
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ONEWIRE_CRC
|
|
||||||
// Compute a Dallas Semiconductor 8 bit CRC, these are used in the
|
// Compute a Dallas Semiconductor 8 bit CRC, these are used in the
|
||||||
// ROM and scratchpad registers.
|
// ROM and scratchpad registers.
|
||||||
uint8_t onewire_crc8(const uint8_t *addr, uint8_t len);
|
uint8_t onewire_crc8(const uint8_t *addr, uint8_t len);
|
||||||
|
|
||||||
#if ONEWIRE_CRC16
|
|
||||||
// Compute the 1-Wire CRC16 and compare it against the received CRC.
|
// Compute the 1-Wire CRC16 and compare it against the received CRC.
|
||||||
// Example usage (reading a DS2408):
|
// Example usage (reading a DS2408):
|
||||||
// // Put everything in a buffer so we can compute the CRC easily.
|
// // Put everything in a buffer so we can compute the CRC easily.
|
||||||
|
@ -157,7 +134,5 @@ bool onewire_check_crc16(const uint8_t* input, uint16_t len, const uint8_t* inve
|
||||||
// @param crc - The crc starting value (optional)
|
// @param crc - The crc starting value (optional)
|
||||||
// @return The CRC16, as defined by Dallas Semiconductor.
|
// @return The CRC16, as defined by Dallas Semiconductor.
|
||||||
uint16_t onewire_crc16(const uint8_t* input, uint16_t len, uint16_t crc);
|
uint16_t onewire_crc16(const uint8_t* input, uint16_t len, uint16_t crc);
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue