我有一个连接到wifi的ESP8266,它与各种传感器连接。我正在向mySQL数据库发送数据。当我发送HTTP post请求时,其中一个传感器的值被发送,但另一个传感器没有,即使我基本上使用的是相同的代码。有什么帮助吗?我是嵌入式C的新手,我有一种感觉,我的字符连接不正确。
变数:
全局声明的值
typechar *URL = "http://localHost/post-sensor-readings.php";
char *postHeader = "api_key";
char *tempEntry = "&temphumSensor=";
char *soilEntry = "&soilmoistSensor=";
char *npkEntry = "&npkSensor=";
char *tempSensor[10];
char *humiditySensor;
char *moistureSensor[4];
更新mysql数据库的代码:
char output_buffer[MAX_HTTP_OUTPUT_BUFFER] = {0};
esp_http_client_config_t config = {
.url = "http://httpbin.org/get",
};
esp_http_client_handle_t client = esp_http_client_init(&config);
esp_err_t err = esp_http_client_open(client, 0);
char post_data[151];
char *post_header ="api_key=tPmAT5Ab3j7F9";
strcpy(post_data, post_header);
strcat(post_data, tempEntry);
strcat(post_data, tempSensor);
strcat(post_data, soilEntry);
strcat(post_data, moistureSensor);
esp_http_client_set_url(client, "http://localHost/post-sensor-readings.php");
esp_http_client_set_method(client, HTTP_METHOD_POST);
esp_http_client_set_header(client, "Content-Type", "application/x-www-form-urlencoded");
}
尝试更新温度(不起作用)
void temperature_task(void *arg)
{
ESP_ERROR_CHECK(dht_init(DHT_GPIO, false));
vTaskDelay(2000 / portTICK_PERIOD_MS);
int temperature[100];
int humidity;
while (1)
{
if (dht_read_data(DHT_TYPE_DHT22, DHT_GPIO, &humidity, &temperature[0]) == ESP_OK) {
// e.g. in dht22, 604 = 60.4%, 252 = 25.2 C
// If you want to print float data, you should run `make menuconfig`
// to enable full newlib and call dht_read_float_data() here instead
printf("Humidity: %d Temperature: %d\n", humidity, temperature[0]);
sprintf(tempSensor, "%d", temperature[0]);
// fprintf( stderr, "%s", tempSensor);
//itoa(temperature,tempSensor,10);
vTaskDelay(5000 / portTICK_PERIOD_MS);
}
}
vTaskDelete(NULL);
}
更新湿度(有效)
void soilHumidity_task(void *arg){
static const char *TAG = "READING HUMIDITY";
adc_config_t config1 ={.mode = 0, .clk_div =8};
ESP_ERROR_CHECK(adc_init(&config1));
uint16_t adc_data[100];
while (1) {
if (ESP_OK == adc_read(&adc_data[0])) {
ESP_LOGI(TAG, "ADC read: %d\r\n", adc_data[0]);
printf("%d", adc_data[0]);
sprintf(moistureSensor, "%d", adc_data[0]);
vTaskDelay(1000 / portTICK_RATE_MS);
}
}
vTaskDelete(NULL);
}
1条答案
按热度按时间5w9g7ksd1#
你传递了对两个整数的引用。它是UB。使用正确的类型
int16_t
sprintf
需要对char
的引用,而不是对char *
的引用。1.“%d”仅在将参数传递给可变变量函数时隐式转换为C语言中的
int
时有效。