Jag håller på skapa ett övervakningssystem för sommarvatten och har kört fast helt nu...
Utrustningen består av en Raspberry PI 3 och en Arduino Nano som A/D omvanldare.
Sensorer är en AM2301/DHT21, en analog tryckgivare och några DS1820 tempgivare.
Jag har tänkt köra Node-Red Dashboard för allt.
Jag har fått igång allt och Arduiono'n hittas av Node-Red och den läser in ett värde från AM2301 (-76.78) och från en DS1820 (0x1) men sen händer inget mer...
Jag har förstått att jag måste skapa ett skript i Arduino IDE (vilket jag gjort) som då borde loop'a på och som jag förstått det hela då borde skiacka signaler till Node-Red.
Detta fungerar ju då inte utan jag får bara ett värde och sen står det stilla (och värden är ju dessutom märkliga)...
Någon som kan peka mig i rätt riktning för hur man får igång det?
Node-Red och Node.js kan jag utan och innan och även GPIO har jag lekt med med på Arduino sidan är jag rätt grön...
Utrustningen består av en Raspberry PI 3 och en Arduino Nano som A/D omvanldare.
Sensorer är en AM2301/DHT21, en analog tryckgivare och några DS1820 tempgivare.
Jag har tänkt köra Node-Red Dashboard för allt.
Jag har fått igång allt och Arduiono'n hittas av Node-Red och den läser in ett värde från AM2301 (-76.78) och från en DS1820 (0x1) men sen händer inget mer...
Jag har förstått att jag måste skapa ett skript i Arduino IDE (vilket jag gjort) som då borde loop'a på och som jag förstått det hela då borde skiacka signaler till Node-Red.
Detta fungerar ju då inte utan jag får bara ett värde och sen står det stilla (och värden är ju dessutom märkliga)...
Någon som kan peka mig i rätt riktning för hur man får igång det?
Node-Red och Node.js kan jag utan och innan och även GPIO har jag lekt med med på Arduino sidan är jag rätt grön...
Posta kod här eller på t.ex. pastebin så kan jag ta en titt.
Om du bara får ett värde låter det som att du har lagt all kod i setup() istället för loop(), eller så gör du något annat knasigt. Omöjligt att säga utan att se koden dock.
Om du bara får ett värde låter det som att du har lagt all kod i setup() istället för loop(), eller så gör du något annat knasigt. Omöjligt att säga utan att se koden dock.
För DHT sensorn har jag testat detta:
DS18B20 detta:
Det är bara två, jag har Google'at som en tok och testat många olika...
Kod:
#include <SimpleDHT.h>
// for DHT22,
// VCC: 5V or 3V
// GND: GND
// DATA: 2
int pinDHT22 = 3;
SimpleDHT22 dht22;
void setup() {
Serial.begin(115200);
}
void loop() {
// start working...
Serial.println("=================================");
Serial.println("Sample DHT22...");
// read without samples.
// @remark We use read2 to get a float data, such as 10.1*C
// if user doesn't care about the accurate data, use read to get a byte data, such as 10*C.
float temperature = 0;
float humidity = 0;
int err = SimpleDHTErrSuccess;
if ((err = dht22.read2(pinDHT22, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
Serial.print("Read DHT22 failed, err="); Serial.println(err);delay(2000);
return;
}
Serial.print("Sample OK: ");
Serial.print((float)temperature); Serial.print(" *C, ");
Serial.print((float)humidity); Serial.println(" RH%");
// DHT22 sampling rate is 0.5HZ.
delay(2500);
}
DS18B20 detta:
Kod:
// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
/*
* The setup function. We only start the sensors here
*/
void setup(void)
{
// start serial port
Serial.begin(9600);
Serial.println("Dallas Temperature IC Control Library Demo");
// Start up the library
sensors.begin();
}
/*
* Main function, get and show the temperature
*/
void loop(void)
{
// call sensors.requestTemperatures() to issue a global temperature
// request to all devices on the bus
Serial.print("Requesting temperatures...");
sensors.requestTemperatures(); // Send the command to get temperatures
Serial.println("DONE");
// After we got the temperatures, we can print them here.
// We use the function ByIndex, and as an example get the temperature from the first sensor only.
Serial.print("Temperature for the device 1 (index 0) is: ");
Serial.println(sensors.getTempCByIndex(0));
}
Det är bara två, jag har Google'at som en tok och testat många olika...
Hmm.... har inte tid att djupdyka i de biblioteken just nu men om vi börjar med den första (DHT21) så undrar jag vad du får ut när du bara ansluter arduinon direkt till datorn? När du programmerat arduinon, vad händer då? Säger den att det är fel eller säger den Sample OK? Jag noterar att biblioteket verkar vara till för DHT 11 och 22, inte 21 som du har. Har du provat DHT11Lib som finns på arduinos hemsida med bra kodexempel.
Att använda delay på det där sättet är också dumt, det låter dig inte göra något annat under tiden. Ett bättre sätt är att använda en timer eller köra en diff på tidsstämplar. Pseudokod för detta är t.ex.
int timestamp = millis() // eller vad funktionen nu heter.
int delay = 2500 // eller vad du nu vill ha
if(timestamp+delay > millis()){
// Kod som ska köras periodiskt här
// Uppdatera timestamp
timestamp = millis();
}
Då körs funktionen om det var mer än delay millisekunder från förra gången du kollade.
Att använda delay på det där sättet är också dumt, det låter dig inte göra något annat under tiden. Ett bättre sätt är att använda en timer eller köra en diff på tidsstämplar. Pseudokod för detta är t.ex.
int timestamp = millis() // eller vad funktionen nu heter.
int delay = 2500 // eller vad du nu vill ha
if(timestamp+delay > millis()){
// Kod som ska köras periodiskt här
// Uppdatera timestamp
timestamp = millis();
}
Då körs funktionen om det var mer än delay millisekunder från förra gången du kollade.
Jag har fokuserat mer på tempsensorn eftersom det verkar mer använt...
Den andra är denna: http://cdon.se/hem-tradgard/temperatur-luftfuktighets-sensor-am2301-dht21-p40137538
Temp sensorn har jag testat både som 1-wire (med 4,7kohm motstånd) och utan.
Matar båda sensorerna från 5V på Arduinon.
Den andra är denna: http://cdon.se/hem-tradgard/temperatur-luftfuktighets-sensor-am2301-dht21-p40137538
Temp sensorn har jag testat både som 1-wire (med 4,7kohm motstånd) och utan.
Matar båda sensorerna från 5V på Arduinon.
Jo, det var den jag tittade på först. Du använder ett bibliotek som verkar vara till för DHT11/22 men inte 21. Har inte läst på om sensorn men i det biblioteket som finns på Arduinos hemsida är det olika metoder för att läsa 21 och 22 vilket antyder att det finns en skillnad.
Som sagt, vad får du ut när du försöker läsa?
När du kör DS18B20, vad får du ut då? Ser du texten "Requesting temperatures" osv? Upprepar den sig som den borde göra?
Om du försöker med lite mer grundläggande kommandon, vad ger t.ex. getDeviceCount och getDS18Count? validFamily()?
Kör du med REQUIRESALARMS?
Du borde för övrigt inte behöva inkludera OneWire igen i din kod, den inkluderas redan från DallasTemperature.h
Som sagt, vad får du ut när du försöker läsa?
När du kör DS18B20, vad får du ut då? Ser du texten "Requesting temperatures" osv? Upprepar den sig som den borde göra?
Om du försöker med lite mer grundläggande kommandon, vad ger t.ex. getDeviceCount och getDS18Count? validFamily()?
Kör du med REQUIRESALARMS?
Du borde för övrigt inte behöva inkludera OneWire igen i din kod, den inkluderas redan från DallasTemperature.h
Jo, nu när jag läser igen måste du ha motståndet där för att köra onewire. Har du trippelkollat anslutningarna?
Kollade lite på ett av DHT-biblioteken som hastigast också och det verkar läsa på samma sätt från DHT21 och 22 så där borde det inte vara problem (men använd för all del rätt värde på sensorn ändå).
Kollade lite på ett av DHT-biblioteken som hastigast också och det verkar läsa på samma sätt från DHT21 och 22 så där borde det inte vara problem (men använd för all del rätt värde på sensorn ändå).
Ah, där kan jag inte hjälpa dig. Testa med seriemonitorn i arduinos interface, se vad som kommer ut där. Då kan du bekräfta din teori och se att den delen fungerar som den ska.
Jag skulle nog skriva denna typ av kod som polling, dvs datoränden (NodeRed eller något annat) skickar ett kommando till arduinon som svarar med de senast avlästa temperaturerna. Den får sedan hålla på bäst den vill och läsa av sensorer och lagra senaste värdet. Arduinon har begränsat med minne och ska inte behöva lagra data internt. Vill du göra riktigt trixiga grejer kan du få Arduinon att rapportera hur många värden den läst av sen senaste frågan samt ett medelvärde av dessa.
Att bara mata ut data från Arduinon är förstås också ett alternativ men kanske krångligare att läsa in i andra änden. Dessutom blir det svårt att hantera mer avancerad funktionalitet, t.ex. att polla hur många sensorer som är anslutna osv.
Jag skulle nog skriva denna typ av kod som polling, dvs datoränden (NodeRed eller något annat) skickar ett kommando till arduinon som svarar med de senast avlästa temperaturerna. Den får sedan hålla på bäst den vill och läsa av sensorer och lagra senaste värdet. Arduinon har begränsat med minne och ska inte behöva lagra data internt. Vill du göra riktigt trixiga grejer kan du få Arduinon att rapportera hur många värden den läst av sen senaste frågan samt ett medelvärde av dessa.
Att bara mata ut data från Arduinon är förstås också ett alternativ men kanske krångligare att läsa in i andra änden. Dessutom blir det svårt att hantera mer avancerad funktionalitet, t.ex. att polla hur många sensorer som är anslutna osv.
Äntligen! 
Ditt förslag att skala ner det gjorde susen!
Jag skippade även "Arduino" Node i Node-Red eftersom den krävde installation av ett paket som verkar krocka med standard Serial Port... Kör nu bara en avtappning på data som kommerf rån Arduinon:
Ditt förslag att skala ner det gjorde susen!
Kod:
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.println("Hello Pi");
delay(2000);
}
Jag skippade även "Arduino" Node i Node-Red eftersom den krävde installation av ett paket som verkar krocka med standard Serial Port... Kör nu bara en avtappning på data som kommerf rån Arduinon:
Jag får det här felet titt som tätt:
Dock verkar den ändå ladda upp Sketchen...
En fråga @tommib , när man skapar en Sketch, måste allt vara i en och samma eller kan man ladda upp fler som körs parallellt?
Jag antar det måste vara i en och samma eftersom det verkar skrivas över varje gång man gör en förändring...
Jag ska ju ha en hel hög med sensorer så jag börjar fundera om jag ska ta in de digitala via GPIO på R-Pi istället för via Arduino och bara köra de analoga på Arduinon... Vettigt?
Dock verkar den ändå ladda upp Sketchen...En fråga @tommib , när man skapar en Sketch, måste allt vara i en och samma eller kan man ladda upp fler som körs parallellt?
Jag antar det måste vara i en och samma eftersom det verkar skrivas över varje gång man gör en förändring...
Jag ska ju ha en hel hög med sensorer så jag börjar fundera om jag ska ta in de digitala via GPIO på R-Pi istället för via Arduino och bara köra de analoga på Arduinon... Vettigt?
Nu blev det ju ännu lite roligare:
Koden jag nu använder:
ROM är då de olika adresserna för sensorerna vad det verkar. Två stycken nu parallellt:
Inloggade ser högupplösta bilder
Logga in
Skapa konto
Gratis och tar endast 30 sekunder
Koden jag nu använder:
Kod:
#include <OneWire.h>
// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library
OneWire ds(2); // on pin 10 (a 4.7K resistor is necessary)
void setup(void) {
Serial.begin(9600);
}
void loop(void) {
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;
if ( !ds.search(addr)) {
Serial.println("No more addresses.");
Serial.println();
ds.reset_search();
delay(5000);
return;
}
Serial.print("ROM =");
for( i = 0; i < 8; i++) {
Serial.write(' ');
Serial.print(addr[i], HEX);
}
if (OneWire::crc8(addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return;
}
Serial.println();
// the first ROM byte indicates which chip
switch (addr[0]) {
case 0x10:
Serial.println(" Chip = DS18S20"); // or old DS1820
type_s = 1;
break;
case 0x28:
Serial.println(" Chip = DS18B20");
type_s = 0;
break;
case 0x22:
Serial.println(" Chip = DS1822");
type_s = 0;
break;
default:
Serial.println("Device is not a DS18x20 family device.");
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end
delay(10000); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
Serial.print(" Data = ");
Serial.print(present, HEX);
Serial.print(" ");
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
Serial.print(data[i], HEX);
Serial.print(" ");
}
Serial.print(" CRC=");
Serial.print(OneWire::crc8(data, 8), HEX);
Serial.println();
// Convert the data to actual temperature
// because the result is a 16 bit signed integer, it should
// be stored to an "int16_t" type, which is always 16 bits
// even when compiled on a 32 bit processor.
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// "count remain" gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
// at lower res, the low bits are undefined, so let's zero them
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
//// default is 12 bit resolution, 750 ms conversion time
}
celsius = (float)raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;
Serial.print(" Temperature = ");
Serial.print(celsius);
Serial.print(" Celsius, ");
Serial.print(fahrenheit);
Serial.println(" Fahrenheit");
}
ROM är då de olika adresserna för sensorerna vad det verkar. Två stycken nu parallellt:
Redigerat:
Tittar på det ikväll efter nattningen...
Jag har inte sett just det felet tidigare.
Man kan bara ha en sketch i taget men den kan göra många saker. Som sagt skulle jag lägga upp koden lite annorlunda. Får se om jag hinner med ett förslag ikväll.
Jag har inte sett just det felet tidigare.
Man kan bara ha en sketch i taget men den kan göra många saker. Som sagt skulle jag lägga upp koden lite annorlunda. Får se om jag hinner med ett förslag ikväll.
Nu har jag igång fuktgivaren också...
Mitt största problem nu är hur fasen man lägger upp projekt men biblioteken för Arduino...
När jag försöker pussla ihop allt till ett skript är det alltid något som saknas och det verkar inte spela någon roll vart jag kopierar *.h filer...
Det jag trodde var rätt är att skapa en katalog under "/home/pi/sketchbook/libraries/" med samma namn som .h filen, ex. "./DHT/DHT.h", eller "./Adafruit_Sensor/Adafruit_Sensor.h" (och sen alla andra C filer också förstås i katalogerna...).
Den verkar ju dock inte hitta filerna eftersom jag i IDE får "no such file or directory" när jag kör en "#include"...
Inloggade ser högupplösta bilder
Logga in
Skapa konto
Gratis och tar endast 30 sekunder
Kod:
// DHT Temperature & Humidity Sensor
// Unified Sensor Library Example
// Written by Tony DiCola for Adafruit Industries
// Released under an MIT license.
// Depends on the following Arduino libraries:
// - Adafruit Unified Sensor Library: https://github.com/adafruit/Adafruit_Sensor
// - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#define DHTPIN 3 // Pin which is connected to the DHT sensor.
#define DHTTYPE DHT21 // DHT 21 (AM2301)
// See guide for details on sensor wiring and usage:
// https://learn.adafruit.com/dht/overview
DHT_Unified dht(DHTPIN, DHTTYPE);
uint32_t delayMS;
void setup() {
Serial.begin(9600);
// Initialize device.
dht.begin();
Serial.println("DHTxx Unified Sensor Example");
// Print temperature sensor details.
sensor_t sensor;
dht.temperature().getSensor(&sensor);
Serial.println("------------------------------------");
Serial.println("Temperature");
Serial.print ("Sensor: "); Serial.println(sensor.name);
Serial.print ("Driver Ver: "); Serial.println(sensor.version);
Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id);
Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println(" *C");
Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println(" *C");
Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println(" *C");
Serial.println("------------------------------------");
// Print humidity sensor details.
dht.humidity().getSensor(&sensor);
Serial.println("------------------------------------");
Serial.println("Humidity");
Serial.print ("Sensor: "); Serial.println(sensor.name);
Serial.print ("Driver Ver: "); Serial.println(sensor.version);
Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id);
Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println("%");
Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println("%");
Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println("%");
Serial.println("------------------------------------");
// Set delay between sensor readings based on sensor details.
delayMS = sensor.min_delay / 1000;
}
void loop() {
// Delay between measurements.
delay(delayMS);
// Get temperature event and print its value.
sensors_event_t event;
dht.temperature().getEvent(&event);
if (isnan(event.temperature)) {
Serial.println("Error reading temperature!");
}
else {
Serial.print("Temperature: ");
Serial.print(event.temperature);
Serial.println(" *C");
}
// Get humidity event and print its value.
dht.humidity().getEvent(&event);
if (isnan(event.relative_humidity)) {
Serial.println("Error reading humidity!");
}
else {
Serial.print("Humidity: ");
Serial.print(event.relative_humidity);
Serial.println("%");
}
}
Mitt största problem nu är hur fasen man lägger upp projekt men biblioteken för Arduino...
När jag försöker pussla ihop allt till ett skript är det alltid något som saknas och det verkar inte spela någon roll vart jag kopierar *.h filer...
Det jag trodde var rätt är att skapa en katalog under "/home/pi/sketchbook/libraries/" med samma namn som .h filen, ex. "./DHT/DHT.h", eller "./Adafruit_Sensor/Adafruit_Sensor.h" (och sen alla andra C filer också förstås i katalogerna...).
Den verkar ju dock inte hitta filerna eftersom jag i IDE får "no such file or directory" när jag kör en "#include"...
