I have a bunch of thermometers (between 1 and 128). The thermometers have an internal OneWire ID such as "28edce1e500e5" and it is not readable by humans.
Normally I would make an associative array like this:
map["28edce1e500e5"] = "Temp1";
map["28ffd33b9116420"] = "Temp2";
Serial.print(map[printAddress(allDevices[i])]);
Serial.print(" : ");
Serial.print(sensors.getTempC(allDevices[i]));
But it looks like the only hashmap library for Arduino is no longer supported and appears to be quite expensive.
The solution does not have to involve associative array.
The values are populated from a JSON file, loaded from an SD card.
I'm looking for a solutiuon to the problem, not a way to implement an associative array. (Unless that's the best way to solve the problem)
-
What is your question? Where to find a library? How to implement an associative array?user31481– user314812017年10月03日 22:14:27 +00:00Commented Oct 3, 2017 at 22:14
-
There you go, i formulated it as a question now.Magic-Mouse– Magic-Mouse2017年10月03日 22:35:11 +00:00Commented Oct 3, 2017 at 22:35
-
Actually the 1-Wire ROM identity is not a string. It is 8-bytes which actually includes a family code (1 byte) and a CRC code (1-byte). You can simply use uint64_t or uint8[8] instead. Put them sorted in a vector and use binary search for the mapping. The standard clib has support for that. nongnu.org/avr-libc/user-manual/…Mikael Patel– Mikael Patel2017年10月03日 23:07:52 +00:00Commented Oct 3, 2017 at 23:07
2 Answers 2
Make a struct containing the name and id.
struct device{char[MAX_ID_LENGTH] id; char[MAX_NAME_LENGTH] name; }
Then store the those pairs in an array which you can have sorted by one field or the other. That way you can binary search on that field.
-
I cannot make it work with chars, but String it works, do you know what is wrong ?Magic-Mouse– Magic-Mouse2017年10月05日 11:12:10 +00:00Commented Oct 5, 2017 at 11:12
-
Ok this is working and on the NodeMCU it got enough memory not to be a problem. Though it could be improved im going to accept this answer!Magic-Mouse– Magic-Mouse2017年10月06日 08:07:11 +00:00Commented Oct 6, 2017 at 8:07
Taking the device structure from rachet freak's post you could implement a map of your own using something like this:
template <class K, class V> class MyMap
{
public:
MyMap()
{
}
void Add(K key, V value)
{
}
void Remove(K key)
{
}
V operator[](const& K)
{
}
private:
}
But I think templates are expensive under Arduino so you might want to manually instantiate it to drop the template.