mirror of
https://github.com/nodemcu/nodemcu-firmware.git
synced 2025-02-06 21:18:25 +08:00
The PR removed the bulk of non-newlib headers from the NodeMCU source base. app/libc has now been cut down to the bare minimum overrides to shadow the corresponding functions in the SDK's libc. The old c_xyz.h headerfiles have been nuked in favour of the standard <xyz.h> headers, with a few exceptions over in sdk-overrides. Again, shipping a libc.a without headers is a terrible thing to do. We're still living on a prayer that libc was configured the same was as a default-configured xtensa gcc toolchain assumes it is. That part I cannot do anything about, unfortunately, but it's no worse than it has been before. This enables our source files to compile successfully using the standard header files, and use the typical malloc()/calloc()/realloc()/free(), the strwhatever()s and memwhatever()s. These end up, through macro and linker magic, mapped to the appropriate SDK or ROM functions.
81 lines
2.3 KiB
C
81 lines
2.3 KiB
C
// Module for HX711 load cell amplifier
|
|
// https://learn.sparkfun.com/tutorials/load-cell-amplifier-hx711-breakout-hookup-guide
|
|
|
|
#include "module.h"
|
|
#include "lauxlib.h"
|
|
#include "platform.h"
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "user_interface.h"
|
|
static uint8_t data_pin;
|
|
static uint8_t clk_pin;
|
|
|
|
/*Lua: hx711.init(clk_pin,data_pin)*/
|
|
static int hx711_init(lua_State* L) {
|
|
clk_pin = luaL_checkinteger(L,1);
|
|
data_pin = luaL_checkinteger(L,2);
|
|
MOD_CHECK_ID( gpio, clk_pin );
|
|
MOD_CHECK_ID( gpio, data_pin );
|
|
|
|
platform_gpio_mode(clk_pin, PLATFORM_GPIO_OUTPUT, PLATFORM_GPIO_FLOAT);
|
|
platform_gpio_mode(data_pin, PLATFORM_GPIO_INPUT, PLATFORM_GPIO_FLOAT);
|
|
platform_gpio_write(clk_pin,1);//put chip to sleep.
|
|
return 0;
|
|
}
|
|
|
|
#define HX711_MAX_WAIT 1000000
|
|
/*will only read chA@128gain*/
|
|
/*Lua: result = hx711.read()*/
|
|
static int ICACHE_FLASH_ATTR hx711_read(lua_State* L) {
|
|
uint32_t i;
|
|
int32_t data = 0;
|
|
//TODO: double check init has happened first.
|
|
|
|
//wakeup hx711
|
|
platform_gpio_write(clk_pin,0);
|
|
|
|
//wait for data ready. or time out.
|
|
//TODO: set pin inturrupt and come back to it. This may take up to 1/10 sec
|
|
// or maybe just make an async version too and have both available.
|
|
system_soft_wdt_feed(); //clear WDT... this may take a while.
|
|
for (i = 0; i<HX711_MAX_WAIT && platform_gpio_read(data_pin)==1;i++){
|
|
asm ("nop");
|
|
}
|
|
|
|
//Handle timeout error
|
|
if (i>=HX711_MAX_WAIT) {
|
|
return luaL_error( L, "ADC timeout!", ( unsigned )0 );
|
|
}
|
|
|
|
for (i = 0; i<24 ; i++){ //clock in the 24 bits
|
|
platform_gpio_write(clk_pin,1);
|
|
platform_gpio_write(clk_pin,0);
|
|
data = data<<1;
|
|
if (platform_gpio_read(data_pin)==1) {
|
|
data = i==0 ? -1 : data|1; //signextend the first bit
|
|
}
|
|
}
|
|
//add 25th clock pulse to prevent protocol error (probably not needed
|
|
// since we'll go to sleep immediately after and reset on wakeup.)
|
|
platform_gpio_write(clk_pin,1);
|
|
platform_gpio_write(clk_pin,0);
|
|
//sleep
|
|
platform_gpio_write(clk_pin,1);
|
|
lua_pushinteger( L, data );
|
|
return 1;
|
|
}
|
|
|
|
// Module function map
|
|
LROT_BEGIN(hx711)
|
|
LROT_FUNCENTRY( init, hx711_init )
|
|
LROT_FUNCENTRY( read, hx711_read )
|
|
LROT_END( hx711, NULL, 0 )
|
|
|
|
|
|
int luaopen_hx711(lua_State *L) {
|
|
// TODO: Make sure that the GPIO system is initialized
|
|
return 0;
|
|
}
|
|
|
|
NODEMCU_MODULE(HX711, "hx711", hx711, luaopen_hx711);
|